点击【下一页】按钮,是最常见的翻页方式。但有的网页翻页方式比较特殊,例如:

 

一、点击【加载更多】或【再显示20条】等按钮翻页

二、向下滚动页面进行翻页

三、无【下一页】按钮,点击数字进行翻页


对于以上3种特殊的方式,我们该如何设置翻页,以完整的采集出数据呢?以下将分三种情况详细介绍。

 

一、点击【加载更多】或【再显示20条】等按钮翻页

 

示例网址:http://junyueshanyc.fang.com/dianping/

打开这个网页之后可以看到,页面有【再显示20条】这个按钮。通过不断点击【再显示20条】实现翻页。

 

 

鼠标放到图片上,右键,选择【在新标签页中打开图片】可查看高清大图

下文其他图片同理

 

Step1. 先按照 8.0新手入门第7课:翻页以采集多页数据 的方法,创建一个【循环翻页】。选中并点击网页中【再显示20条】这个按钮,然后在操作提示中选择【循环点击单个链接】。

 

 

特别说明:

a. 打开【流程图】。以上操作之后,系统会自动添加一个【循环翻页】步骤到流程中。

b. 一般【再显示20条】这种按钮,都使用了Ajax技术,需要设置【Ajax超时】。八爪鱼会自动判断Ajax网页,并为其设置【Ajax超时】。值得注意的是,系统设置的【Ajax超时】时间一般较短,如果需要请自行延长时间。Ajax是什么?Ajax超时】设置多长? 点击查看Ajax教程。

 

 

Step2. 【循环翻页】建好以后,我们手动执行规则,检查翻页步骤是否正确。可以看到,执行第1次【点击翻页】,正常点击1次,加载出新数据。执行第2次【点击翻页】,发现没有正常点击,没有加载出新数据。

 

 

为什么?检查发现,执行第2次【点击翻页】时,循环列表中提示【找不到与该Xpath表达式匹配的元素】,说明定位XPath此时没有定位到【再显示20条】这个按钮。我们需要写一条正确的定位XPath。

 

 

如何写一条正确的定位XPath?需要我们掌握一定的XPath知识,点击查看【8.0】XPath学习与实例 教程。根据此网页【再显示20条】的源码特征,我们可以写一条定位XPath://a[text()='再显示20条'] 。检查发现,这条XPath://a[text()='再显示20条'] ,是可以正常定位到每一个【再显示20条】按钮的。

 

 

选中【循环翻页】,将写好的xpath:.//a[text()='再显示20条'],复制到【单个元素】后面的文本框中,替换掉原来的,并点击【确定】保存。再次手动执行规则,当页面中有【再显示20条】按钮时,八爪鱼都能定位到,正常点击翻页。当页面中的按钮变成【没有更多点评】时,八爪鱼定位不到按钮,自动结束翻页,满足我们的采集需求。

 

 

Step3. 接下来按照需求提取数据。在这里,我们按照 列表数据采集方法 ,建一个【循环列表】。启动采集后发现,原本全部评论只有42条,八爪鱼却采集到103条,重复62条。为什么?

 

 

Step6. 在 8.0新手入门第9课:采集原理与流程执行逻辑 中,我们讲过,流程的执行逻辑是先从上至下、再由内而外。那这里流程的执行逻辑是:

打开网页,采默认展示的20条数据。执行第1次翻页,采展示的40条数据(包括默认的20条)。执行第2次翻页,采展示的42条数据。(包括默认的20条+第1次翻页后的40条)。如此循环下去,数据会一直重复。

因此,对于这种类型的网页,流程应该:先点击【再显示20条】完成翻页,把所有数据都展示出来之后,再提取数据。这样就不会有重复数据了。因此,我们选中整个【循环-提取数据】步骤,将其拖到【循环翻页】之后。

 

 

最终的流程图如下图所示:

 

 

 

特别说明:

a. 八爪鱼在导出数据时,支持数据去重。如果不介意采集过程中有重复数据,也可不调整流程逻辑。

 

 

二、向下滚动页面进行翻页

 

示例网址:https://www.toutiao.com/

打开网页,发现数据是随着页面滚动而不断加载新数据。此类网页请 点击查看 【8.0】处理滚动加载数据的网页 教程。

 

 

 

三、无“下一页”按钮,点击数字进行翻页

 

示例网址如:http://stock.cngold.org/news/

打开网页发现,此网页没有【下一页】按钮,是通过点击数字进行翻页的。

 

 

在八爪鱼中,可以进行相应设置,让八爪鱼不断点击数字进行翻页:当前页是第1页,点第2页;当前页是第2页,点第3页.......当前页是最后1页,结束【循环翻页】。

所以问题的关键是:需要写一条XPath,使其始终能定位到当前页的下一页(最后1页除外)。需要大家有一定的XPath知识,点击学习 【8.0】XPath学习与实例 。以下为具体步骤。

 

Step1. 写一条XPath,使其始终能定位到当前页的下一页(最后1页除外)。分2步:先定位到当前页;再定位到当前页的下一页。打开火狐浏览器,用XPath工具观察此网页页码的网页源码。点击查看 火狐XPath工具安装教程。

 

先定位到当前页。

当前页分别是第1页、第2页、第3页......最后1页时,观察网页源码的特征。我们发现:当前页的源码是span标签,而其他页则是a标签。

 

 

特别说明:

a. 这个网页,当前页和其他页的源码区别非常明显。但有的网页可能没这么明显,请大家耐心去找到当前页和其他页的源码区别。

 

继续观察当前页源码中span标签的特征,找到具有唯一性的那个特征。我们发现,当前页对应的span标签,具有class属性,且class属性的属性值为thisclass。根据这个特征,写出一条定位XPath://span[@class="thisclass"] 。

检查后发现,能定位到每个当前页。

 

 

再定位到当前页的下一页 。

在XPath中,【following-sibling:: 】函数可实现。【following-sibling:: 】的意思是,定位到当前标签后面的所有同级标签。

 

a. 什么是同级标签?HTML文档是树状结构,标签之间具有层级性。同级标签即处于同一层级的标签。

 

 

//span[@class="thisclass"]定位到了class属性值为thisclass的span标签,这个span标签后面的同级标签是a标签。则 //span[@class="thisclass"]/following-sibling::a ,就定位到了此span标签后面的所有同级a标签。

 

 

由于我们是 需要定位到当前页的下一页,所以只需要定位到第一个a标签,在a后面加上[1]即可。最终的定位XPath为://span[@class='thisclass']/following-sibling::a[1]

检查后发现,能定位到每个当前页的下一页(除最后1页)。

 

 

 

Step2. 在八爪鱼中创建一个【循环翻页】。往流程中拖入一个【循环】步骤,选择循环方式为【单个元素】,将上面写好的XPath://span[@class='thisclass']/following-sibling::a[1],复制到【单个元素】后面的文本框中,点击【确定】保存。

 

 

再往【循环】里面拖入一个【点击元素】的步骤,勾选【点击当前循环中设置的元素】,设置Ajax超时时间为7秒,然后点击【确定】保存。手动执行一个规则,发现可正常翻页。

 

 

接下来就是按需提取数据了,不再赘述。

 

作者:Bin

编辑:Aisling