背景技术
随着进一步加大政府信息公开和数据开放力度,越来越多的政府信息被 公开在政府网站上形成海量的政府网站***息。现有的政府网站由各级政 府的各类部门建立和维护、管理,从政府网站上方便快速的获得政府网站公 开信息,必将给用户带来巨大的价值。
但是,这些政府网站的内容不同,网页的结构各异,现在的互联网爬虫 (亦称为网络爬虫,简称即爬虫),对政府网站进行爬取时,都需要专业技术 人员分析网页的结构,从而定位所需内容并对其进行爬取,这是因为:
网页中所需内容的xpath路径各不相同,进行爬取时需要人工解析所需 内容的xpath路径,这显然将会花费大量的时间和人力,工作量大,劳动繁 琐。面对成千上万的政府网站,这种模式显然效率较低。
本发明涉及以下技术术语:
1、爬取,是指访问网站,并从网页获取信息,实现网页数据采集。
2、xpath,是在网页(尤其XML文档)中查找信息的语言(爬虫),用 来对网页(尤其XML文档)中的元素和属性进行遍历。xpath属于Html路 径语言,它是可以用来确定Html文档中某部分位置的语言。
3、Scrapy,是Python开发的一个快速、高层次的屏幕抓取和web抓取 框架(爬虫框架),用于抓取web站点并从网页中提取结构化的数据。Scrapy 用途广泛,可以用于数据挖掘、监测和自动化测试。在基于Scrapy框架的爬 虫脚本中,最关键的步骤是识别网页中所需内容的xpath路径,以便爬取指 定网页内容。
4、互联网爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序 或者脚本,其主要为两种方式:
第一种是类似百度等搜索引擎的全网爬取;
第二种是面向某种类别的定向爬取,定向爬取是指爬取指定网页内容(指 定网页的定向内容)。
但是,对于定向爬取的方式,如前所述,由于政府网站的网页布局比较 杂乱,获取指定网页内容(网页中所需内容)的xpath路径,需要专业技术 人员在已有网页的url地址前提下,查看网页源代码,经过分析后,获得正 确xpath路径。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种自动获取xpath 生成爬虫脚本的方法及***,通过该方法能够基于Scrapy框架对政府网站公 开信息进行爬取,可以自动解析出网页中所需内容的xpath路径,提升爬虫 管理的自动化水平。
为实现上述目的,本发明采用的技术方案如下:
一种自动获取xpath生成爬虫脚本的方法,包括以下步骤:
步骤1,获取网页的url地址,并通过url地址打开网页,遍历网页中所 有的<a>标签;
所述<a>标签用于定义超链接;
步骤2,取出每个<a>标签对应的xpath路径;
步骤3,按以下原则对<a>标签进行分组:xpath路径相同则划分为一组; 然后,统计分组后<a>标签个数;
步骤4,取出每组中的一个<a>标签,打开该链接网页;
步骤5,对于步骤4中每个被打开的网页,统计网页中的<a>标签个数以 及文字个数;
所述文字个数指<a>标签的文字个数;
步骤6,取出文字个数最多且<a>标签个数最少的一组,记录其对应的xpath路径;
步骤7,基于Scrapy框架,根据对应的xpath路径生成爬虫脚本。
进一步,如上所述的一种自动获取xpath生成爬虫脚本的方法,步骤1 中,所述网页为包含主题信息列表的网页。
进一步,如上所述的一种自动获取xpath生成爬虫脚本的方法,步骤2 的具体步骤为:
步骤2.1,通过jsoup包,获取<a>标签的父级标签;
步骤2.2,递归调用,即对每个父级标签再获得其父级标签;
步骤2.3,直到获得的父级标签为<html>结束;
步骤2.4,将获得的所有父级标签依次连接,得到该<a>标签的xpath路 径。
进一步,如上所述的一种自动获取xpath生成爬虫脚本的方法,步骤5 的具体步骤为:通过jsoup获得所有<a>标签,及对应的text()内容,并统计 <a>标签个数及text()内容的文字个数。
进一步,如上所述的一种自动获取xpath生成爬虫脚本的方法,步骤7 的具体步骤为:将步骤1中的网页的url地址及步骤6记录的xpath路径发送 给Scrapy框架,生成相应的Scrapy爬虫脚本。
一种用于实现上述方法的自动获取xpath生成爬虫脚本的***,包括:
<a>标签遍历模块,用于打开url地址对应的网页,并遍历网页中所有的 <a>标签;
xpath路径生成模块,用于取出每个<a>标签对应的xpath路径;
标签分组模块,用于对<a>标签进行分组,用于统计分组后<a>标签个数;
链接网页获取模块,用于根据<a>标签打开该链接网页;
信息统计模块,用于统计网页中的<a>标签个数以及文字个数;
xpath路径判别模块,用于分析出文字个数最多且<a>标签个数最少的分 组对应的xpath路径;
爬虫脚本生成模块,用于根据对应的xpath路径生成爬虫脚本。
进一步,如上所述的一种自动获取xpath生成爬虫脚本的***,所述爬 虫脚本生成模块,基于Scrapy框架,根据网页的url地址及xpath路径,生 成相应的Scrapy爬虫脚本。
本发明的有益效果在于:通过本方法,在不需要专业技术人员参与下, 只需通过网页的url地址即可自动获取xpath路径。
通过本方法,实现了自动定位网页中所需内容的xpath路径,生成爬虫 脚本,使爬虫管理简单化,自动化;由原来必须由专业技术人员编写爬虫脚 本,一个月只能维护近百个爬虫脚本,提升到一个普通人员即可凭借本方法 维护上千个爬虫脚本,极大提高了工作效率。
具体实施方式
下面结合说明书附图与具体实施方式对本发明做进一步的详细说明。
Scrapy是目前主流的爬虫框架,它需要获得网页中所需内容(需要进行 爬取的内容,例如主题信息列表)的Html唯一标签即xpath路径,才能够进 行爬取。因此,本发明的目的之一是能够自动的识别网页中主题信息列表所 在的xpath路径,只对主题信息列表中的信息进行爬取,而过滤掉网页中的 其它信息。
本发明所述方法主要思路是:政府网站相对来讲,包含政府网站*** 息的网页的结构是有一定的共通性的。基本一个包含政府网站***息的网 页,大都包含:菜单导航,通知公告,主题信息列表,其它导航,广告及其 它链接等内容。但是,不同的网页,主题信息列表对应的xpath路径都不相 同,本发明给出如下方法即可自动筛选出主题信息列表的xpath路径,自动 生成爬虫脚本,并对主题信息列表中的信息进行爬取。
图1示出了本发明具体实施方式中提供的一种自动获取xpath生成爬虫 脚本的方法的流程图,该方法主要包括以下步骤:
步骤1,获取网页的url地址,并通过url地址打开网页,遍历网页中所 有的<a>标签;
所述<a>标签用于定义超链接;
所述网页为包含主题信息列表的网页,此类网页的url地址,可以人工 收集整理,也可以根据不同政府网站的架构,预先设定;
所述遍历网页中所有的<a>标签的具体算法如下:调用jsoup包的方法, 获取网页中所有的<a>标签及其内容;jsoup是一个解析网页的包,用java开 发的,提供了类似DOM,CSS选择器的方式来查找和提取文档中的内容;
步骤2,取出每个<a>标签对应的xpath路径;
具体算法如下:
步骤2.1,通过jsoup包,获取<a>标签的父级标签;
步骤2.2,递归调用,即对每个父级标签再获得其父级标签;
步骤2.3,直到获得的父级标签为<html>结束;
步骤2.4,将获得的所有父级标签依次连接,得到该<a>标签的xpath路 径;
步骤3,按以下原则对<a>标签进行分组:xpath路径相同则划分为一组; 即:将Xpath路径相同的<a>标签划分为一组;然后,统计分组后<a>标签个 数;
步骤4,取出每组中的一个<a>标签,打开该链接网页;
由于步骤3的分组方式,任意一个该组中的<a>标签,所打开的链接网 页都是相同的;
步骤5,对于步骤4中每个被打开的网页,统计网页中的<a>标签个数以 及文字个数;
所述文字个数指<a>标签的文字个数;
具体算法如下:通过jsoup获得所有<a>标签,及对应的text()内容,并 统计<a>标签个数及text()内容的文字个数;
<a>标签个数即<a>标签的个数;
文字个数即文字字数;
步骤6,取出文字个数最多且<a>标签个数最少的一组,记录其对应的 xpath路径;
步骤7,基于Scrapy框架,根据对应的xpath路径生成爬虫脚本,所述 爬虫脚本指Scrapy爬虫脚本;
具体算法如下:将步骤1中的网页的url地址及步骤6记录的xpath路径 发送给Scrapy框架,生成相应的Scrapy爬虫脚本;
Scrapy爬虫脚本只需要网页的url地址及xpath路径,其它内容基本固定 不变,所以只需获得url及xpath即可通过Scrapy框架生成Scrapy爬虫脚本。
本发明所述方法,通过上百个政府类网页的验证,可以将80%的包含政 府网站***息的网页,自动分析并得到主题信息列表对应的xpath路径, 从而生成爬虫脚本,该方法平均耗时1分钟左右,证明方法可行且效率较高。
但是确有一些网站的架构较特殊,本方法或不能完全准确的获取xpath 路径,可以根据遇到的具体情况,通过总结这些网站的架构的特点,改进步 骤5、6的算法,达到准确获取xpath路径的目的。例如:一些网页列表链接 只有几条,而其它链接却比较多,这类特殊情况不在本发明讨论范围内,不 再详述。
以下为一具体实施例。
如图3所示,为一政府网站的网页示例,该示例中可见:
顶部的菜单导航,
左侧的其它导航,
下部的广告及其它链接,
中部的主题信息列表。
该网页的url地址是已知的。
具体步骤如下:
步骤1,打开该网页后,遍历网页中的所有<a>标签;
该网页中有以下<a>标签:
<a href="/defaults/news/news/nid/5701"title="北京第二外国语学院贯培学院五位一体多功能实验室建设政府采购项目中标公告">
<a href="/defaults/news/news/nid/5693"title="北京市监狱改扩建安防***建设一期政府采购项目视频监控***专项设备采购中标公告">
<a href="/defaults/news/news/nid/5692"title="北京市人民政府国有资产监督管理委员会出资企业2017-2019年度决算审计咨询、质量检查与管理政 府采购项目中标公告">
(标签过多,未全部列举)
步骤2,取出每个<a>标签对应的xpath路径;各<a>标签对应的xpath路 径如下:
//*[@id="nav_right"]/ul[2]/li[1]/a
//*[@id="newslist"]/ul/li[1]/span[1]/a
//*[@id="newstype_list"]/dl/dt[1]/a
//*[@id="footer"]/div[2]/ul/li[1]/a
步骤3,按xpath路径相同的对<a>标签进行分组;分组结果如下表:
网页内容 |
Xpath路径 |
<a>标签个数 |
菜单导航 |
//*[@id="nav_right"]/ul[2]/li[1]/a |
6 |
主题信息列表 |
//*[@id="newslist"]/ul/li[1]/span[1]/a |
15 |
其它导航 |
//*[@id="newstype_list"]/dl/dt[1]/a |
5 |
广告及其它链接 |
//*[@id="footer"]/div[2]/ul/li[1]/a |
5 |
步骤4,取出每组中的一个<a>标签,打开该链接网页,本具体实施例中 有四个分组,则四个对应的网页如图4所示,
步骤5,对于步骤4中每个被打开的网页,统计网页中的<a>标签个数以 及文字个数;统计结果如下表:
网页内容 |
<a>标签个数 |
网页文字个数 |
菜单导航 |
42 |
222 |
主题信息列表 |
33 |
1607 |
其它导航 |
59 |
836 |
广告及其它链接 |
44 |
283 |
步骤6,取出文字个数最多且<a>标签个数最少的一组,记录其对应的 xpath路径;
根据上表,符合“文字个数最多且<a>标签个数最少的”的为主题信息 列表对应的xpath路径;
步骤7,根据主题信息列表对应的xpath路径生成爬虫脚本。
由此可见,这种通过每组<a>标签的网页文字个数与<a>标签个数判断主 题信息列表的xpath路径,无需专业技术人员参与识别,普通人员即可完成 爬虫管理。
与图1中所示的方法相对应,本发明实施方式中还提供了一种自动获取 xpath生成爬虫脚本的***,如图2所示,该***包括:
<a>标签遍历模块,用于打开url地址对应的网页,并遍历网页中所有的 <a>标签;
xpath路径生成模块,用于取出每个<a>标签对应的xpath路径;
标签分组模块,用于对<a>标签进行分组,用于统计分组后<a>标签个数;
链接网页获取模块,用于根据<a>标签打开该链接网页;
信息统计模块,用于统计网页中的<a>标签个数以及文字个数;
xpath路径判别模块,用于分析出文字个数最多且<a>标签个数最少的分 组对应的xpath路径;
爬虫脚本生成模块,用于根据对应的xpath路径生成爬虫脚本。
在上述技术方案的基础上,所述爬虫脚本生成模块,基于Scrapy框架, 根据网页的url地址及xpath路径,生成相应的Scrapy爬虫脚本。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本 发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要 求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。