更新日期: 2021.04.11
本节学习内容 :
处理动态网页的利器 selenium~
目录
1. selenium是什么?
selenium是一套web测试系统,包含了测试的录制,编写和运行,以及测试的并行处理。支持多种主流浏览器。
selenium被应用在爬虫中,是因为它可以模拟人的操作来驱动浏览器,完成加载动态网页所要求的点击和下拉等动作,以获取网页的完整代码。selenium驱动浏览器操作的过程是可以在网页上直接观察到的,也可以使用无界面模式。
通过selenium获取内容需等待页面加载完毕,所以速度比直接构造请求获取内容慢,因此应仅在requests不能胜任时使用。
2. 使用selenium 的基本流程
- 设置 action chain:驱使浏览器按顺序执行预定操作(如找到"下拉获取更多信息"的按键并点击)
- 设置监听:确认网页是否符合某个条件 (如,查询页面上是否还有"下拉获取更多信息"的按键)
- 获取网页代码: 符合监听条件后,获取网页代码。注意使用Exceptions避免意外崩溃。
3. 安装时可能遇到的问题
以Chrome浏览器为例,selenium 通过webdriver.Chrome() 操控Chrome浏览器。
chromewebdriver和其操控的浏览器版本存在对应关系,比如:
- chromewebdriver版本v2.46 支持 Chrome v71-73
- chromewebdriver版本v2.45 支持 Chrome v70-72
因此,需要先查看自己Chrome浏览器的版本号,然后下载对应的chromewebdriver。
我的情况是,Chrome浏览器是最新版本(v89), 而 pip selenium 时带来的chromewebdriver是 2.24…所以,重新下载了v2.46版的chromewebdriver,然后卸载了最新的Chrome,下载了v73 的Chrome,再禁止Chrome自动更新版本。
4. 初始化 driver (伪装 / 反反扒 + 性能优化)
- 使用前,对 driver 进行各种装饰,避免被网站识别为爬虫而禁止访问~~
- 同时,设置属性禁止加载图片,加速进程。
- 还可以设置使用无界面模式。
from selenium import webdriver
from selenium.webdriver import ChromeOptions
my_options = ChromeOptions()
# 设置 enable-automation 避免被识别为爬虫
my_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁止加载图片,加速加载过程
no_image = {
"profile.managed_default_content_settings.images": 2}
my_options.add_experimental_option("prefs", no_image)
# 规避使用 Chrome可能出现的 bug
my_options.add_argument('--disable-gpu')
# 使用无界面模式
my_options.add_argument('--headless')
driver = webdriver.Chrome(options=my_options)
5. 定位webdriver对象
使用selenium模拟人的操作,首先要定位需操作的对象。例如,一个按键,一个输入框,网页右侧的下拉栏,或者是一个网页。
定位一个webdriver对象,可通过对象的 id, 名称等进行定位。
如需定位多个同级对象中的一个,在element 后面加 s,在返回的列表中选择相应的序号,例如:需点击列表中第六个元素:
driver.find_elements_by_class_name(“docs”)[5].click()
find_element匹配不到将抛出异常,find_elements匹配不到返回空列表。
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text (完整超链接文本)
- find_element_by_partial_link_text (部分超链接文本)
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
from selenium import webdriver
driver = webdriver.Chrome()
# driver2 = webdriver.PhantomJS() # 初始化一个无界面浏览器对象
url = "http://www.baidu.com"
driver.get(url)
#找到名字为wd的对象
driver.find_element_by_name('wd')
#找到超链接文本中含有'贴&#