【8.0】特殊翻页:加载更多/滚动翻页/数字翻页
2019-11-11 10:03:36 阅读量: 40765
点击【下一页】按钮,是最常见的翻页方式。但有的网页翻页方式比较特殊,例如:
一、点击【加载更多】或【再显示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. 八爪鱼在导出数据时,支持数据去重。如果不介意采集过程中有重复数据,也可不调整流程逻辑。
二、向下滚动页面进行翻页
打开网页,发现数据是随着页面滚动而不断加载新数据。此类网页请 点击查看 【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