我们在采集数据过程中,可能会出现字段提取不到、字段错位等情况。其中一个重要的原因就是对字段的定位不准。

可通过自定义定位元素的方式,修改字段定位XPath,对数据的位置进行正确的定位。

请注意,本教程需要一定的XPath知识和相对XPath知识,建议在学习XPath和相对XPath后,再看本教程。

XPath:https://www.bazhuayu.com/tutorial8/81xpath

相对XPath:https://www.bazhuayu.com/tutorial8/81xpath

 

提取数据一般分为2种情况,一种提取详情页数据,一种是提取列表页数据,两种都可能存在漏字段、字段错位的情况,以下将具体说明。

 

一、提取详情页数据

 

示例网站:

https://www.toutiao.com/a6810131150799897102/
https://www.toutiao.com/a6810150273776878087/

 

Step1:按照需求,采集数据。这里我采集这2个新闻详情页的标题、是否原创、时间

 

 

Step2:启动采集看一下,第2个新闻详情页的时间并未采集到。这是因为第2个新闻详情页没有 原创 字段,因此 时间字段位置向前移了一点,发生改变。时间字段移动后,第1个详情页的时间定位XPath,不适用第2个新闻详情页了。

 

Step3:找到时间字段的XPath: //div[@class="article-meta"]/span[2] ,将其复制到火狐浏览器中,检查在2个新闻详情页中的定位情况。

可以看到,//div[@class="article-meta"]/span[2] 在第1个新闻详情页中可以定位到时间字段:

 

在第2个新闻详情页中不能定位到【时间】字段:

 

 Step4:手动修改XPath。观察2个网页的源码,时间字段都是span标签,且是最后1个。根据这个特征,可以写一条定位XPath://div[@class="article-meta"]//span[@class="dot"]/preceding-sibling::span[1] 。检查一下,通过这条XPath,确实在2个新闻详情页中都定位到了时间字段。

 

 

 

Step5:将其复制粘贴到八爪鱼中的相应位置。可以看到,改完后2个新闻详情页的【时间】字段都提取下来了。

 

 

最终采集结果如图:

 

 

 

二、提取列表页数据

 

示例网址:https://book.douban.com/subject/4913064/comments/?status=N

采集该网站列表页文章的评论作者时间有用数 字段。

 

 

Step1:网页打开以后,根据需求,提取所需字段。示例中提取的是列表数据。在八爪鱼下方的字段预览中可见,八爪鱼将字段都采集下来了。

 

 

但我们发现,【时间】字段出现了错位的问题。

 

 

Step2:排查字段错位的原因

出现字段错位,这是因为八爪鱼自动生成的【时间】定位XPath不精准,不能适用于所有列表。这里需要有一定的XPath知识。

将鼠标移动到【时间】上,点击 右上角的 按钮,选择【修改元素定位】,进入设置页面,将【拼接循环项XPath】里的XPath :/H3[1]/SPAN[2]/SPAN[1] ,复制下来。

 

 

将循环框的XPath也复制下来://DIV[@class='comment']

 

 

根据 对XPath 中的知识,【时间】字段的定位XPath为://DIV[@class='comment']/H3[1]/SPAN[2]/SPAN[1],将其复制到火狐浏览器中,发现有一些时间字段没有定位到。

 

什么是【相对于循环里的XPath】?我们在 相对XPath  教程中有详细讲解。提取列表页数据都会用到相对XPath知识,建议掌握。

 

 

Step3:修改XPath,定位到所有列表中的【时间】字段。观察源码特征,时间字段都为最后一个span标签,根据这个特征,可以写一条定位XPath://DIV[@class='comment']/H3[1]/SPAN[2]/SPAN[last()] 。last()函数的意思是定位最后1个,在XPath教程中有详细说明。

 

 

Step4:根据相对XPath的知识,【时间】字段的相对XPath为:/H3[1]/SPAN[2]/SPAN[last()] 。将其复制粘贴到八爪鱼中的相应位置。可以看到,改完后全部【时间】字段都提取下来了。

 

 

Step5:启动本地采集,看一下采集效果

 

 

采集到的数据示例: