1. 导包

 from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By

2. 创建 webdriver

driver = webdriver.Chrome(executable_path=r'C:\python35\chromedriver.exe')
# executable_path:chromedriver.exe的存放路径

3. 操作

1. 常用操作

driver.page_source   # 响应页面,element标签
driver.title # 请求页面的title
driver.current_url # 请求的url
driver.close() # 关闭浏览器窗口
driver.quit() # 退出浏览器
driver.current_window_handle # 获取当前窗口的句柄
driver.window_handles # 获取所有窗口的句柄
driver.switch_to_window() # 切换浏览器窗口
driver.execute_script() # 执行js脚本(在打开新窗口时用)
driver.get_cookie() # 获取cookie
driver.find_element_by_class_name() # 根据class查找标签
driver.find_element_by_xpath() # 根据xpath查找标签

4 例子 -- 爬去拉钩网招聘信息

过程: 用 selenium 访问首页,然后用lxml解析首页上的每一个职位,获取职位的链接地址,然后再用selenium 访问该地址,用lxml提取职位详情的信息。

  • get_attribute('class')  # 获取标签的class属性值
  • self.driver.execute_script('window.open("https://www.baidu.com/")')  # 打开一个新窗口 (请求详情页)  通过执行js脚本打开新的窗口
  • self.driver.switch_to.window(self.driver.window_handles[])   # 将driver切换到新窗口(详情页窗口)
  • WebDriverWait(driver=self.driver, timeout=10). \
    until(ec.presence_of_element_located((By.XPATH, '//span[@class="name"]'))) # 显示等待(职位详情页,出现职位标题为条件),在等待过程中如果出现要寻找的标签,则结束等待,如果没有出现则一直等待,直到10s,抛出异常。注意:这里只能定位某个标签,不能取标签里面的值,如这里的span标签中的值。
  • 注意:在切换到新窗口后,如果想继续在原始窗口执行操作,需要再重新切回原始窗口,如这里的由详情页窗口切换到列表页窗口。
import re
import time
import csv
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait class LaGouSpider:
def __init__(self):
self.driver = webdriver.Chrome(executable_path=r'C:\python35\chromedriver.exe')
self.init_url = 'https://www.lagou.com/zhaopin/Python/'
self.next_page = True
self.position = None
self.csv_header = ['职位名称', '职位要求', '薪水', '职位标签', '职位诱惑', '职位详情', '发布时间']
self.is_writer_header = False def request_list_page(self, url=None):
if url:
self.driver.get(url)
html = etree.HTML(self.driver.page_source)
# 解析html 获取职位列表
links = html.xpath('//a[@class="position_link"]/@href')
for link in links:
self.request_detail_page(link)
time.sleep(1)
# 下一页
next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/a[last()]')
if 'page_no pager_next_disabled' not in next_btn.get_attribute('class'):
next_btn.click()
else:
self.next_page = False def request_detail_page(self, url):
# 打开一个新窗口 (请求详情页)
self.driver.execute_script('window.open("' + url + '")')
# 将driver切换到新窗口(详情页窗口)
self.driver.switch_to.window(self.driver.window_handles[1])
# 显示等待(职位详情页,出现职位标题为条件)
WebDriverWait(driver=self.driver, timeout=10). \
until(ec.presence_of_element_located((By.XPATH, '//span[@class="name"]')))
# 解析详情页
self.parse_detail_page(self.driver.page_source)
# 关闭新窗口
self.driver.close()
# 重新将窗口切回到列表页窗口
self.driver.switch_to.window(self.driver.window_handles[0]) def parse_detail_page(self, source):
html = etree.HTML(source)
position_name = html.xpath('//span[@class="name"]/text()')
job_request = html.xpath('//dd[@class="job_request"]/p//text()')
position_label = html.xpath('//ul[@class="position-label clearfix"]//text()')
publish_time = html.xpath('//p[@class="publish_time"]//text()')
job_advantage = html.xpath('//dd[@class="job-advantage"]/p/text()')
job_detail = html.xpath('//div[@class="job-detail"]/p/text()') # 清洗数据
position_name = position_name[0] if position_name else None
job_request = [re.sub('\n|/|\\xa0', '', i).strip() for i in job_request] if job_request else None
job_request = [i for i in job_request if i != '']
# 提取salary
salary = job_request[0] if len(job_request) > 2 else None
# 提取职位需求
job_request = ','.join(job_request[2:5])
# 职位标签
position_label = [re.sub('\n|/|\\xa0', '', i).strip() for i in position_label] if position_label else None
position_label = ','.join([i for i in position_label if i != ''])
# 职位诱惑
job_advantage = job_advantage[0] if job_advantage else None
# 发布时间
print(publish_time) print(salary)
publish_time = re.match(r'\d+天\w|\d+:\d+', publish_time[0]).group() if publish_time else None
# 职位详情
job_detail = ','.join([a.strip() for a in job_detail] if job_detail else None)
position = {
'职位名称': position_name,
'职位要求': job_request,
'薪水': salary,
'职位标签': position_label,
'职位诱惑': job_advantage,
'职位详情': job_detail,
'发布时间': publish_time,
}
self.write_csv(position) def write_csv(self, position):
with open('position.csv', 'a+', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, self.csv_header)
if not self.is_writer_header:
writer.writeheader()
self.is_writer_header = True
writer.writerow(position) def run(self):
self.request_list_page(self.init_url)
while self.next_page:
self.request_list_page() if __name__ == '__main__':
lagou = LaGouSpider()
lagou.run()

5. Selenium 的 WebDriverWait

https://blog.csdn.net/duzilonglove/article/details/78455051

selenium知识点的更多相关文章

  1. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

  2. 2019 To do List

    做好测试不是靠编程,而是靠的是严禁的作风,慎密的逻辑思维,适合的测试流程. 内心有些迷茫的时候,迷茫的是作为测试既然要学那么多编程,为什么不直接去干开发呢?学了编程,用不上,到底有什么用呢? 看了这句 ...

  3. selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

    在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...

  4. python爬虫知识点总结(八)Selenium库详解

    官方学习文档:http://selenium-python.readthedocs.io/api.html 一.什么是Selenium? 答:自动化测试工具,支持多种浏览器.用来驱动浏览器,发出指令让 ...

  5. 浅谈学习selenium的一些知识点的总结

    学习自动化测试,先得学习一门语言.自动化对语言要求掌握的程度不深,但必须得会基本的入门语法. 我学习的是python2,简单,易懂,上手快. 每天敲就是了. 我的学习路径是: 先学习一段时间pytho ...

  6. 关于python中selenium一些知识点

    selenium几种元素操纵方法 切换iframe层 #切换至xx iframe层 driver.switch_to.frame("name and id") # 切回主HTML层 ...

  7. python selenium 实战涉及很多知识点

    1.iframe的切入和切出 #切入 driver.switch_to.frame(driver.find_element_by_id('iFrame_1')) # 切换出来 driver.switc ...

  8. Selenium+java自动化测试常用知识点

    一.元素的定位 1.通过ID定位元素: findElement(By.id(element)); 2.通过元素的名称定位元素: findElement(By.name(element)); 3.通过元 ...

  9. Python爬虫学习(9):Selenium的使用

    1 简介以及安装 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Seleni ...

随机推荐

  1. C语言存30位数字长的十进制方法

    题目:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 首先: 1,30位数字的十进制,并没有一个数据类型可以存下30位的整数类型数字,所以考虑用字符串存储这个数据,遍历这个字符串,每个 ...

  2. Windows phone 8 二维码生成与扫描

    1. 二维码的生成 二维码生成用到了一个第三方的插件(zxing.wp8.0) 根据指定的信息,生成对应的二维码. 代码很简单: bool falg=tbk.Text==""?fa ...

  3. c# 并行计算 Parallel

    //多重认证 Parallel.Invoke(() => { jianYanResult = new VerifiedMobileService().CheckMobileFun(request ...

  4. Idea+Maven部署打包JavaFX项目遇到的坑

    用Idea写了一个JavaFX项目,创建artifacts,build artifacts,运行build出来的exe可执行文件时总是遇到 class not found的错误,如下图 一开始根据提示 ...

  5. B树,B+树的原理及区别

    如图所示,区别有以下两点: 1. B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中. 2. B+树中所有叶子节点都是通过指针 ...

  6. TypeScript入门六:TypeScript的泛型

    泛型函数 泛型类 一.泛型函数 在泛型函数之前,先简单的描述一下泛型,将变量定义成泛型可以在使用变量时来决定它的类型.什么意思呢?假如现在有一个函数,可能出现参数和返回值出现多种情况的现象,只有在调用 ...

  7. IPhone中H5页面用on绑定click无效的解决方法

    首先声明本人资质尚浅,本文只用于个人总结.如有错误,欢迎指正.共同提高. --------------------------------------------------------------- ...

  8. 打印n对括号的全部有效组合(左右括号正确匹配)Java实现

    一.问题导出 今天在做算法题目的时候遇到了一道左右括号匹配的问题,问题如下: 二.问题思考 (1)这种要列出全部可能性的题目很容易想到由小到大去发现规律,用递归或者暴力搜索. 首先1的情况,一个括号只 ...

  9. SQL SERVER 常用函数 学习笔记

    1.字符串截取.字符串转数字 --Server.8.30 select SUBSTRING('SqlServer_2008',4,6) as DB, CONVERT(float,SUBSTRING(' ...

  10. Gym - 101170B British Menu SCC点数目不超过5的最长路

    题意其实就是给你一个有向图 但是每个SCC里面的点数目不超过5 求最长路 首先暴力把每个SCC里的每个点的最长路跑出来 然后拓扑排序dp 然后因为tarjan 搜索树出来的SCC是拓扑排好序的 可以直 ...