上一节我们使用了分析ajax的方法来抓取网页,但是并不是所有的动态网页都是用ajax生成的,有些是直接用Javascript生成的。有一些网页的Ajax接口可能有加密参数,所以分析它们的Ajax接口非常困难。要解决这些问题,我们可以通过模拟浏览器来抓取,让我们在浏览器里看到的,我们就抓到我们能看到的,抓取,不管网页里的Javascript用什么算法渲染页面,也不管后面ajax接口的参数。Python提供了Selenium库来模拟浏览器的操作。
硒的使用。

Selenium是一个自动化测试工具,可以驱动浏览器执行特定的动作,比如点击下拉等。,还可以获取浏览器当前渲染的页面的源代码。对于一些Javascript动态渲染的页面,这种方法非常有效。
准备工作/即将开始工作
本节将以Chrome浏览器为例,讲解Selenium的用法。在开始本节之前,请先安装配置Chrome浏览器、ChromeDriver驱动、Selenium库等。根据第一节和第二节的课程。
运行代码后,Chrome浏览器会自动弹出。浏览器会跳转到,然后搜索Python,再跳转到搜索结果页面,然后关闭。
HTML代码也将在后台打印。
浏览器对象
Selenium支持chrome、Firefox、Internet Explorer、Microsoft Edge等各种浏览器。还支持Android、PhantomJs、ChromeHeadless无头浏览器等手机浏览器。您可以按如下方式初始化浏览器对象。
访问页面
浏览器初始化后,我们可以使用get方法请求网页,参数可以传入URL。
查找节点
Selenium可以驱动浏览器完成各种操作,比如填表、模拟点击等。
比如我们要在一个文本框中完成输入,首先要定位文本框,Selenium提供了一系列查找节点的方法。
单一节点
要想找到淘宝的搜索框,首先要观察淘宝的网页源代码:
我们发现这个输入的id是Q,而Q,name是Q,还有一些其他的属性,比如class search-combobox-input等。我们可以使用这些属性来定位这个节点。
我们使用四种方法来定位输入节点。
Selenium总共提供了八种获得单个节点的方法:
此外,Selenium还提供了一个通用方法find_element,需要传入两个参数,搜索方法By和值。如下所示:
多个节点
以上方法只能找到单个节点。如果要找多个节点,怎么用?例如,我们需要找到这些节点。
我们可以做到这一点:
运行结果如下:
与上面类似,Selenium提供了八种定位多个节点的方法:
Selenium还提供了获取多个节点的通用方法,类似于上面的find_elements。
节点交互
Selenium可以驱动浏览器进行一系列操作,比如输入文本、清除空文本、点击按钮等。
动作链
Selenium还支持鼠标拖动、键盘按压等操作。例如,我们将一个节点从一个位置拖到另一个位置。例如,我们想拖动这个元素:
我们首先打开网页,定位源位置和目标位置,然后声明ActionChains对象,调用其方法实现拖动操作。

执行javascript
如果我们使用了一些Selenium API没有提供的功能,该怎么办?比如下拉进度条,我们可以直接使用execute_script方法来执行Javascript。
获取节点信息
正如我们之前演示的,可以通过browser对象的page_source属性获取网页的源代码,然后我们可以使用beautifulsoup、pyquery等解析库对其进行解析。当然,Selenium本身也提供了一种非常有用的选择和获取节点的方法。
获取属性
我们可以使用get_attribute方法来获取节点的属性,如下所示:
运行结果如下:
获取文本
我们可以使用它的text属性来获取文本信息,类似于beautifulsoup的get_text方法和pyquery的text方法。
运行结果如下:
获取id、位置、标签名称和大小。
webelement节点还有一些其他属性,比如id、location、tag_name、size等。,如下所示:
运行结果如下:
开关架
网页中有一种节点叫iframe,也就是子框架,相当于页面的子页面。其结构与外部网页的结构相同。当Selenium打开页面时,默认情况下它在父框架中操作。如果此时页面中有子框架,它无法获取子框架中的节点。让我们看看Selenium如何获取子帧中的节点。
执行结果如下:
延迟等待
在Selenium中,get方法将在网页加载后停止执行。此时,如果获取的是page_source,那么源代码可能并不是网页完全加载后的源代码,可能在其中找不到某些节点。如果一些页面有额外的Ajax请求,那么我们可能无法成功获取相关信息。Selenium提供了两种方法来解决这个问题:一种是显式等待,另一种是隐式等待。
隐式等待
显式等待
隐式等待只规定了一个固定的时间,页面的加载模式会受到各种因素的影响,所以这种模式不好;所以我们可以用显式等待来指定要查找的节点,然后指定最长等待时间。
执行结果如下:
等待条件其实有很多,比如判断题目内容,判断某段文字是否出现等等。下面是一些常用的等待条件。
向前和向后
我们的浏览器有前进和后退按钮,Selenium也提供了前进和后退的方法。
饼干
Selenium可以方便地操作cookie,比如获取、添加、删除、修改cookie。
运行结果如下:

标签管理
当我们使用浏览器时,我们会打开标签页。在Selenium中,我们还可以操作选项卡。
执行结果如下:
异常处理
在selenium中难免会遇到一些异常,比如找不到节点、超时等。一旦出现异常,程序将不会被执行。如果我们写一个爬虫,如果出现异常,爬虫就会被终止。这是不可接受的,所以我们可以使用try except语句来捕捉各种异常。


