关于食品安全的美国联邦法规文件的网络爬虫采集规则

2020-3-14 11:02| 发布者: ym| 查看: 5789| 评论: 0

摘要: 1,采集目标 要从美国联邦法规网站上采集每一个章节信息以及下载part小节的pdf、xml附件。网站本身是一个目录树结构的javascript动态网站,目录的第一层是年份,点开第二层是title,第三层包含有subtitle、chapter、 ...

注:从V1.5.x版本开始,下文提及的 集搜客 采摘浏览器 改名为 集搜客 数据管家

1,采集目标

要从美国联邦法规网站上采集每一个章节信息以及下载part小节的pdf、xml附件。网站本身是一个目录树结构的javascript动态网站,目录的第一层是年份,点开第二层是title,第三层包含有subtitle、chapter、part,第四层包含有chapter、subchap、part,第五层是part,要一层层点进去才会加载出下一层的内容,而part小节所在层级不是固定的,所以采集的时候要加以判断。

网站入口:https://www.govinfo.gov/app/collection/cfr/2018


2,目标网站分析

根据上图可见,首先想到是利用连续点击功能,逐层点击展开再采集part信息,但是,从第一层年份开始要做的点击太多,而且点击以后会展开更多条目,网页会越来越长,直接做连续点击很容易半途中断。

我们再分析下网页结构看看有没有更好的办法,比如,层级采集。把网页加载到MS谋数台上分析DOM结构,发现每个章节条目是一个html 的p节点,并不是a节点,这种情况就没法得到下级网址,没法做普通的层级采集

接下来再看看网址是否会变化,点击其中一个章节,浏览器地址栏中的网址改变了,利用这个特点,我们对每一层做一个采集规则,采集当前层级的条目信息,再利用连续动作把每一层的可展开条目点击一遍,得到下一层的网址,把这些网址手工导入到下级规则里,就像一个半自动的层级采集,具体操作可以看看下面的介绍。


3,采集规则

由于集搜客v9版爬虫不兼容显示美国法规网站,所以我们要用新版集搜客采摘浏览器来做采集,再结合集搜客v9版爬虫来定义采集规则,具体操作见《采集京东拍卖上的信息,集搜客爬虫软件怎么用?》,基本操作如下:

1、 用集搜客采摘浏览器访问目标网页,然后点左上角的+新建规则,自动把网页保存为快照,并且在集搜客v9版爬虫里打开快照页面

2、 在集搜客v9版爬虫直接对快照页面定义采集规则并且保存

3、 在集搜客采摘浏览器的任务管理里,选中任务然后启动采集

4、 每新建一个规则要重复1、2步骤


3.1,采集第2层网址

(1)第一级:美国法规-食品安全_层1_点击

样本网址:https://www.govinfo.gov/app/collection/cfr/2018

由于第一层年份是有独立网址,我们可以直接构造出第一层年份的网址,所以就不对第一层年份网址做采集了,而是从第2层开始。

以下面网址为样本,规则里要采集当前的年份以及展开的第2层title条目信息,看网页结构,每一层目录是有唯一的class属性值,用它做定位标志映射,可以实现类似样例复制的效果,把当前年份下的title条目信息都采集下来。

另外,由于年份的网页结构都一样,如果对年份直接做标注的话,就会采到第一个年份2019,想要采集当前展开的年份,就要自定义xpath,通过定位-符号来确定所属的年份,这样就不会对应错误,年份的xpath如下:

.//*[@class='panel-heading CFRlevel0style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@class=' col-xs-12 col-sm-7 panel-heading__inner']/p

接下来是定义连续动作,目标任务要填下一级任务:美国法规-食品安全_层2,目标是点击第2层里带有+号可展开下层的title条目,编写xpath定位如下:

//*[@class='panel-heading CFRlevel1style closed']//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./i[contains(@style,'block')])>0]/p[contains(.//text(),'Title')]

(2)第二级规则:美国法规-食品安全_层2

与上级规则的连续动作做衔接,目的是获得点击后的页面网址,所以采集什么都不重要。

(3)执行采集

把年份的构造网址导入到第一级规则里,启动采集,就可以获取到第2层条目信息,并且逐层点开第2层条目,采集完成后把第二级规则“美国法规-食品安全_层2”导出数据,从realpath里就能得到第2层条目的网址,下面的操作会用相同的方法,获取每一层条目的网址。

注:由于点击条目比较多,超时时长默认60秒,采集时还没点完就中断结束,所以要在集搜客采摘浏览器的设置菜单里把超时时长调大,另外网页加载有些慢,就把延迟抓取也调大。


3.2,采集第3层网址

(1)第三级:美国法规-食品安全_层2_点击

样本网址:https://www.govinfo.gov/app/collection/cfr/2018/title1

与前面第一级规则类似,这里要采集第1层年份、第2层条目以及第3层条目信息,其中层1(对应第2层条目)、发布日期要像年份字段那样自定义xpath。

层1xpath:

.//*[@class='panel-heading CFRlevel1style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@class=' col-xs-12 col-sm-7 panel-heading__inner']/p

发布日期xpath:

.//*[@class='panel-heading CFRlevel1style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@id='cfrPartsDetails']

定义连续动作,目标任务要填下一级任务:美国法规-食品安全_层3,目标是点击第3层里以chapter或subtitle开头的并且带有+号的条目,编写xpath定位如下:

//*[@class='panel-heading CFRlevel2style closed']//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./i[contains(@style,'block')])>0]/p[starts-with(.//text(),'Chapter') or starts-with(.//text(),'Subtitle')]

(2)第四级:美国法规-食品安全_层3

这一级规则的作用跟第二级:美国法规-食品安全_层2 是一样的,目的是收集第3层条目的网址,直接把第二级规则改名重新保存即可。

(3)执行采集:

把前面第二级规则导出数据的realpath网址,添加到第三级:美国法规-食品安全_层2_点击,启动采集,就可以采集到第3层条目信息,并且把第3层带有+号的chapter或subtitle条目逐个点开,采集完成后,把第四级规则:美国法规-食品安全_层3 导出数据,从realpath里可得到第3层条目网址。


3.3,采集第4层网址,下载第4层的part附件

(1)第五级规则:美国法规-食品安全_层3_点击

样本网址:https://www.govinfo.gov/app/collection/cfr/2018/title2/subtitleA

与前面类似,这里要采集第1层年份、第2层条目、第3层条目以及第4层条目信息,其中年份、层1(对应第二层条目)、发布日期的xpath与前面一样,层2(对应第三层条目)的自定义xpath如下:

.//*[@class='panel-heading CFRlevel2style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@class=' col-xs-12 col-sm-7 panel-heading__inner']/p

在这一层里就有part条目,为了下载part条目的pdf、xml附件,要自定义xpath,并且设置下载文件。

pdf下载的xpath:

.//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./p[starts-with(.//text(),'Part')])>0]/following-sibling::*[@class=' col-xs-12 col-sm-5']//*[@class='btn-group-horizontal']/a[position()=1]/@href

xml下载的xpath:

.//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./p[starts-with(.//text(),'Part')])>0]/following-sibling::*[@class=' col-xs-12 col-sm-5']//*[@class='btn-group-horizontal']/a[position()=2]/@href

设置连续动作,目标任务:美国法规-食品安全_层4,目标是点击第4层里不是以part开头的并且带有+号的条目,即要点击包含chapter或subchap的条目。

//*[@class='panel-heading CFRlevel3style closed']//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./i[contains(@style,'block')])>0]/p[not(starts-with(.//text(),'Part'))]

(2)第六级:美国法规-食品安全_层4

与前面第二级规则一样,目的是收集第4层条目的网址,可以直接把第二级规则改名重新保存即可。

(3)执行采集:

把前面第四级规则导出数据的realpath网址,添加到第四级:美国法规-食品安全_层3_点击,启动采集,就可以就可以采集到第4层条目信息以及part附件,并且把第4层带有+号的非part开头的条目逐个点开,采集完成后,把第六级规则:美国法规-食品安全_层4 导出数据,从realpath里获取到第4层条目网址。


3.4,采集第5层网址,下载第5层的part附件

(1)第七级规则:美国法规-食品安全_层4_点击

样本网址:https://www.govinfo.gov/app/collection/cfr/2018/title2/subtitleA/chapterI

与前面类似,这里要采集第1层年份、第2层条目、第3层条目、第4层条目以及第5层条目信息,其中年份、层1(对应第二层条目)、发布日期、层2(对应第三层条目)的xpath与前面一样,层3(对应第四层条目)的自定义xpath如下:

.//*[@class='panel-heading CFRlevel3style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@class=' col-xs-12 col-sm-7 panel-heading__inner']/p

在这一层里也要下载part条目的pdf、xml附件,自定义xpath与前面第五级规则一样。

设置连续动作,目标任务:美国法规-食品安全_层5,目标是点击第5层里不是以part开头的并且带有+号的条目,即要点击包含subchap的条目。

//*[@class='panel-heading CFRlevel4style closed']//*[@class=' col-xs-12 col-sm-7 panel-heading__inner' and count(./i[contains(@style,'block')])>0]/p[not(starts-with(.//text(),'Part'))]

(2)第八级:美国法规-食品安全_层5

与前面第二级规则一样,目的是收集第5层条目的网址,可以直接把第二级规则改名重新保存即可。

(3)执行采集:

把前面第六级规则导出数据的realpath网址,添加到第七级:美国法规-食品安全_层4_点击,启动采集,就可以采集到第5层条目信息以及part附件,并且把第5层带有+号的非part开头的条目逐个点开,采集完成后,把第八级规则:美国法规-食品安全_层5 导出数据,从realpath里获取到第5层条目网址。


3.5,下载第6层的part附件

(1)第九级规则:美国法规-食品安全_层5_采集

样本网址:https://www.govinfo.gov/app/collection/cfr/2018/title2/subtitleA/chapterI/Subchap

这里要采集第1层年份、第2层条目、第3层条目、第4层条目、5层条目以及第6层条目信息,其中年份、层1(对应第二层条目)、发布日期、层2(对应第三层条目)、层3(对应第四层条目)的xpath与前面一样,层4(对应第五层条目)的自定义xpath如下:

.//*[@class='panel-heading CFRlevel4style closed' and count(.//i[contains(@class,'fa-minus-circle')])>0]//*[@class=' col-xs-12 col-sm-7 panel-heading__inner']/p

在这一层里也要下载part条目的pdf、xml附件,自定义xpath与前面第五级规则一样,这是包含part条目的最后一层,所以就不用再设置点击动作了。

(2)执行采集:

把前面第八级规则导出数据的realpath网址,添加到第九级:美国法规-食品安全_层5_采集,启动采集,就能采集到第6层条目信息以及part附件。


4,下载文件的存储说明

(1)文件下载会默认存放在 爬虫存储目录->任务名文件夹->PageContentDir,一个网页的附件会保存到时间戳子文件夹里。如果在 设置>配置 菜单里取消勾选“分任务存储”,那么,所有任务下载到的附件都会存放到 爬虫存储目录->PageContentDir。

(2)下载网址和文件的对应关系,可以在采集结果文件里查看,以 字段名+后缀_file 的新字段就记录了附件的存储位置。


5,总结

我们做了以上9级规则,就可以把美国法规每一层条目信息和part的pdf、xml文件下载,无论动态、静态还是嵌套网页,集搜客爬虫总是能找到合适的采集策略,协助采集更多数据。


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2024-12-22 13:09