7.3 Selenium 库的安装与使用
7.3.1 Selenium 库的安装
爬虫基础-爬取动态网站的神器 Selenium 简介
Selenium 是个自动化测试工具,也可用来解决动态网页的加载和渲染问题。Selenium 可以驱动浏览器模拟人的操作,支持各种浏览器,包括 Chrome、Safari、Firefox 等主流界面式浏览器。本书讲解 Selenium 配合 Chrome 浏览器来爬取网页内容,这是因为 Google Chrome 最新版本发布了一个新的实用功能 - Headless Chrome,也就是无界面 Chrome 浏览器,这对提高爬虫效率非常有利。读者可能在其他书或者网站发现,之前普遍习惯使用 Selenium 配合 PhantomJS 编写动态网页爬虫,但是在 2017 年谷歌官方准备提供 Chrome Headless 后,PhantomJS 维护者 Vitaly Slobodin 随即在邮件列表上宣布辞职,PhantomJS 浏览器前景不明,因此本书使用 Selenium 和 Chrome 浏览器这两个工具。
Selenium 库不是 Python 标准库,使用前需要安装,可以使用 pip 来安装。
>pip install selenium
如果使用的是 Anaconda 发行版本的 Python,安装过程遇到 TypeError: parse() got an unexpected keyword argument 'transport_encoding'这样的错误提示,可以首先升级一下 pip 版本,然后再运行。
>conda install pip >pip install selenium
这样就可以完成 Selenium 的安装了,本书所使用的 Selenium 版本是 3.8.1 版本。Selenium 需要配合 Chrome 浏览器使用,并且需要驱动浏览器的 chromedriver 驱动程序。
7.3.2 chromedriver 的安装和使用
Selenium 需要使用 chromedriver 来驱动 Chrome 浏览器,我们需要下载与操作系统对应的版本。Chromedriver 的具体版本还要与使用的 Chrome 浏览器版本对应,表 7-1 所示为 chromedriver 与谷歌浏览器版本映射表。
表 7-1 chromedriver 与谷歌浏览器版本映射表
例如,我们在本书中使用的 Chrome 浏览器版本是 62.0.3202.89(正式版本),操作系统是 Windows 10,根据表中的对应关系,下载使用的是 2.34 版本的 chromedriver.exe 文件。
Selenium 在使用 chromedriver 时,既可以把 chromedriver 添加到系统的环境变量,也可以直接在代码中指明 chromedriver 所在的目录。为了简单,本节会在代码中直接添加 chromedriver 所在的路径地址,从而省去了添加到系统环境变量的操作。
7.3.3 Selenium 的简单使用
安装好 Selenium 和 Chrome 浏览器,并且下载好驱动 chromedrive,就可以开始使用 Selenium 打开浏览器,并浏览需要的内容了。下面是一个简单示例。
第一步,从 Selenium 中引入 webdriver。
>>>from selenium import webdriver
第二步,初始化 webdriver。
>>>driver = webdriver.Chrome('d:/selenium/chromedriver.exe')
这里使用下载的 chromedriver.exe 的完整路径来初始化 webdriver,因为下载的 chromedriver.exe 放在了 D 盘的 selenium 文件夹中,所以这里填写的路径是 d:/selenium/chromedriver.exe。
运行完这一步,Selenium 会打开 Chrome 浏览器,如图 7-6 所示。
图 7-6 Selenium 打开的 Chrome 浏览器
第三步,使用 webdriver 打开百度首页。
>>>driver.get('https://www.baidu.com/')
可以使用 webdriver 的 GET 方法打开百度,如图 7-7 所示。
图 7-7 Selenium 驱动 Chrome 浏览器打开百度
第四步,使用 XPath 找到搜索框,在 Selenium 中继续使用 XPath 路径查找元素。
>>>search_box = driver.find_element_by_xpath('//*[@id="kw"]')
第五步,在搜索框中输入搜索关键字 python。
>>>search_box.send_keys('python')
这里使用 send_keys 方法输入了搜索关键字,现在的浏览器如图 7-8 所示。
图 7-8 Selenium 输入搜索关键词
最后找到搜索按钮并单击。
>>>submit = driver.find_element_by_xpath('//*[@id="su"]') >>>submit.click() #单击搜索按钮
这里还是使用了 XPath 路径定位“百度一下”按钮,当然也可以使用 driver.find_element_by_id('su') 通过 id 找到元素,当知道一个元素的 name 时,Selenium 也支持使用 name 查找元素,然后对找到的这个元素应用 click 方法单击它,这样就完成了用 Selenium 打开百度网页,输入搜索关键字并单击搜索的过程。
以上是通过打开百度并搜索关键词这个小例子简单说明和演示了 Selenium 的基本应用,读者应该注意到,我们既可以在 webdriver 中使用 XPath 语法定位网页中的元素,也可以下载这些元素中的信息。下一节将通过爬取新浪微博的个人页面微博,来演示使用 Selenium 编写爬虫爬取网页的全过程。
代码的运行速度相对于浏览器打开速度而言是相当快的,如果代码中没有执行等待或确认网页已经完全打开,很有可能代码后续执行时报错。这就要求在执行代码过程中添加执行等待浏览器的代码,既可以使用 time.sleep() 这种固定时长等待时间,也可以使用隐式等待。隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间,默认设置是 0 秒。一旦设置了隐式等待时间,它的作用范围就是 webdriver 对象实例的整个生命周期,也就是说在代码中只需要编写如下代码设置一次即可。
driver.implicitly_wait(10)
这里设置隐式等待 10 秒,也就是在查找元素时的最大等待时间为 10 秒,如果超过 10 秒就会报错。还可以使用显示等待,显示等待定义了等待条件,只有该条件触发,才执行后续代码,它的效率比 time.sleep() 这种固定时长等待要高很多,读者可以查阅相关文档进行学习。
本节带领读者认识了 Selenium 这个解析动态网页的终极武器。Selenium 不仅可以应用在爬虫方面,还可以被用来自动化地完成很多任务。例如需要在某个网站大量重复地提交数据,可以编写一个脚本,使用 Selenium 自动化地完成这些任务。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论