点击【下一页】按钮,是最常见的翻页方式。我们在  第6课:翻页以采集多页数据 中已详细说明。

 

但有的网页翻页方式比较特殊,例如:

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

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

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


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

 

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

 

示例网址:https://weixin.sogou.com/

打开这个网页之后可以看到,页面有【加载更多内容】这个按钮。通过不断点击【加载更多内容】实现翻页,加载出新的数据。

 

 

 

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

下文其他图片同理

 

在八爪鱼中,如何处理这种情况?

 

1、智能识别

八爪鱼的智能识别,支持【加载更多内容】这种翻页的智能识别,如下图所示:

 

 

在 新手入门第8课:采集原理与流程执行逻辑 中,我们讲过,流程的执行逻辑是先从上至下、再由内而外。那上图中的流程的执行逻辑是:先打开网页,然后不断点击【加载更多内容】进行翻页,翻页全部完成以后,再提取所有列表数据。

 

这里有一个问题,如果网页【加载更多内容】这个按钮是可以无限点击的,那八爪鱼就会一直点击它,容易导致程序崩溃,采集不到数据。因此,我们可以设置一定的点击次数,让八爪鱼执行设置的翻页次数后,就开始采集数据。建议点击次数不超过500次,具体可根据网页情况和采集需求来。

 

本示例中的网站,我们观察后发现,它是在点击5次【加载更多内容】后就到底了,不再出现新内容了,因此,我们可以将它的翻页次数设为5,设置方法如下图所示:

 

 

启动本地采集,来看一下采集结果:八爪鱼先点击了5次【加载更多内容】,到达底部,此时页面中有100个文章列表。随后,八爪鱼将这100个文章列表的数据都采集下来了。

 

 

2、自己配置采集流程

如果不用智能识别 ,可自己配置采集流程。

 

按照 第6课:翻页以采集多页数据  中的方法,配置一个【循环翻页】,再按 采集列表数据 中的方法,配置一个【循环列表】。

 

 

八爪鱼自动生成的流程不符合此网页的采集情况,我们需要手动调整一下:按住【循环列表】步骤,将其拖入到【循环翻页】后面。

为何要这么调整,上文已详细说明。

 

 

同样的,我们根据网页情况,设置合适的翻页次数:

 

 

我们还发现,自动生成的列表XPath://BODY[@id="loginWrap"]/DIV[4]/DIV[1]/DIV[3]/UL[1]/LI有点问题,只能定位到前20个文章列表。修改为//BODY[@id="loginWrap"]/DIV[4]/DIV[1]/DIV[3]/UL/LI后就可以定位到全部文章列表了。为什么要这么修改?请查看XPath教程

 

 

特别说明:

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

 

 

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

 

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

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

 

 

 

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

 

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

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

 

 

在八爪鱼中,如何处理此种网页呢?

 

1、智能识别

八爪鱼的智能识别,支持【数字翻页】的智能识别,如下图所示:

 

 

2、自己配置采集流程

如果想了解背后的原理,我们可以来尝试自己配置这类网页的采集流程。

 

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

所以问题的关键是:需要写一条XPath,使其始终能定位到当前页的下一页(最后1页除外)。需要大家有一定的XPath知识,点击学习 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页,最后1页无需翻页,正是我们需要的)。

 

 

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

 

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

为什么要设置Ajax?点击查看 Ajax教程 。 

 

 

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

 

作者:Bin

编辑:Aisling