爬虫爬取网页内容

核心提示上一节中使用了分析 ajax 的方式抓取网页,但是不是所有的动态网页都是 ajax 生成的,有的是直接由 Javascript 生成的.还有一些网页可能它的 Ajax 接口有加密参数,分析其 Ajax 接口非常困难.为了解决这些问题,我们可

上一节我们使用了分析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语句来捕捉各种异常。

 
友情链接
鄂ICP备19019357号-22