刘登英 龚力波 李雯 黄晓辉
摘要 农村信息化是发展现代农业的重要条件,农业信息对农业生产生活具有重要的指导作用,为避免云南农村信息化多头建设、重复建设所引起的资源浪费,开展了云南农村科技服务平台建设,实现了云南农业科技信息的整体运作与资源整合,为相关涉农政府部门、科研院所、企业农户提供信息技术指导。
关键词 Scrapy爬虫框架;农村科技服务平台;信息采集
中图分类号 S-058文献标识码 A文章编号 0517-6611(2018)35-0191-04
党的十九大报告明确提出实施乡村振兴战略,要用现代科学技术服务农业,用现代生产方式改造农业,提高农业良种化、机械化、科技化、信息化、标准化水平。云南贫困面广、贫困度深,少数民族众多,农村信息化发展滞后,社会经济欠发达,不利于民族团结和边疆稳定。云南农村科技服务平台针对云南农村信息化各自为阵、条块分割的建设现状,加强信息资源整合,分析挖掘现有数据资源,集成新闻资讯、农业科技、市场供销、政策法规、招商招聘、天气变化、农业企业等信息,开发特色鲜明、实用性强的全产业链农业信息,构建和完善云南农村信息化技术服务体系,在代表性地区和企业开展示范应用,积极为云南农业现代化、乡村经济振兴提供信息技术服务。
1 基于Scrapy爬虫框架的云南农村科技服务平台信息采集系统的研究
信息采集系统采用网络爬虫技术,爬虫技术是捜索引擎抓取系统的重要组成部分。爬虫的作用就是不断地去采集网页的源代码,按照一定的规则,自动地抓取互联网信息[1]。
通用的爬虫框架基本上包括了一个爬虫系统所需要的所有模块。任何一个爬虫系统的设计图,都有一个环路,这个环代表着爬虫大致的工作流程:根据url将对应的网页下载下来,然后提取出网页中包含的url,再根据这些新的url下载对应的网页,周而复始。爬虫系统的子模块都位于这个环路中,并完成某项特定的功能。
目前网络爬虫有很多种实现方式,要从很多框架中选择适用于该项目的爬虫框架,保证信息采集系统性能最优、功能最佳。
除了搜索引擎爬虫外,主流的被大众所使用的技术有:基于C++的Larbin;基于Java的Webmagic、Nutch、Heritrix;基于Python的Scrapy、pyspider;基于Golang的Pholcus; 基于.NET的abot等。
经过初步的技术预研和筛选,挑选了3个比较成熟的开源爬虫框架,其中Nutch、Heritrix是Java爬虫框架,Scrapy是Python爬虫框架。
1.1 基于Java爬虫框架信息采集系统研究
1.1.1 Nutch。Nutch是一个由Java实现的,开放源代码(opensource)的web搜索引擎[2],主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的接口来对其网页数据进行查询的一套工具。
优点:Nutch支持分布式抓取、并有Hadoop支持,可以进行多机分布抓取、存储和索引。另外很吸引人的一点在于它提供了一种插件框架,使得其对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便地进行扩展,正是由于有此框架,使得Nutch的插件开发非常容易,第三方的插件也层出不穷,极大地增强了Nutch的功能和声誉。
缺点:Nutch的爬虫定制能力比较弱。Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有2/3是为了搜索引擎而设计的,对精抽取没有太大的意義。也就是说,用Nutch做数据抽取,会浪费很多时间在不必要的计算上。如果试图通过对Nutch进行二次开发,使它适用于精抽取的业务,基本上就要破坏Nutch的框架。如果不做搜索引擎,尽量不要选择Nutch作为爬虫。
1.1.2 Heritrix。Heritrix用来获取完整的、精确的、站点内容的深度复制[3],包括获取图像以及其他非文本内容,抓取并存储相关的内容,对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整,允许弹性的定义要获取的URL[4]。
优点:Heritrix的爬虫定制参数多。
缺点:单实例的爬虫,之间不能进行合作。在有限的机器资源的情况下,却要复杂的操作。只有官方支持,仅仅在Linux上进行了测试。每个爬虫是单独进行工作的,没有对更新进行修订。在硬件和系统失败时,恢复能力很差。很少的时间用来优化性能。
1.2 基于Python爬虫框架信息采集系统研究
“Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的,也可以应用在获取API所返回的数据(例如AmazonAssociates Web Services )或者通用的网络爬虫。”以上是官方的说明,更详细地说,Scrapy是一个十分健壮、非常好用的从互联网上抓取数据的Web框架[5]。
优点:为抓取单一网站上固定格式的内容而设计的,比如抓取一个小说网站上的小说或者抓取一个电子商务网站上的商品。结构清晰,可以很方便地修改它来实现更复杂的需求。
缺点:解析网页比较慢,最好自己写一个网页解析;增量抓取。一个针对多个网站的爬虫很难一次性把所有网页爬取下来,并且网页也处于不断更新的状态中,爬取是一个动态的过程,爬虫支持增量的抓取是很必要的。
快速强大:只需编写爬取规则,剩下由Scrapy完成;易扩展:扩展性设计,支持插件,无需改动核心代码;可移植性:基于Linux、Windows、Mac、BSD开发和运行。
1.3 Java爬虫框架与Python爬虫框架比较
选择哪种爬虫主要看定义的“爬虫”干什么用。
定向爬虫就是指定某一些网站的数据源作为数据来源,进行页面数据的抓取,抓取整个网站有用的数据以及图片等信息。这里有别于传统的搜索引擎爬虫,传统的搜索引擎爬虫主要是针对整个互联网的数据进行爬取以及数据分析,难度更大,不论是抓取的调度,还是性能要求,又或者是数据的存储都有很大的区别。
云南农村科技服务平台信息采集系统开发目的是帮助普通用户从多个指定农业网站自动、定时地采集农产品信息、科技信息,并将这些结构化信息按照自定义分类存储起来,为信息的二次利用提供便利。信息采集系统是以Web数据挖掘引擎为基础构建而成,它可以在最短的时间内,将最新的信息从不同的Web站点上采集下来,并在进行分类和统一格式后,第一时间之内把信息及时发布到自己的站点上去,从而提高信息及时性和减少工作量。综合分析可知,信息采集系统需要的爬虫框架是定向爬虫,而不是搜索引擎爬虫。通过上面的介绍,Java爬虫框架Nutch、Heritrix均属于搜索引擎爬虫框架,Python爬虫框架Scrapy则属于定向爬虫框架[6-7]。
综上所述,Scrapy框架值得作为第一选择。
优点:支持xpath;基于twisted,性能不错;有较好的调试工具;很容易安装和使用;优秀的帮助文档;成熟且有针对性的解决方案;内置对代理、重定向、认证、cookies等方面的支持;内置对CSV、JSON和XML的支持。
2 基于Scrapy爬蟲框架的云南农村科技服务平台信息采集系统的实现
信息采集系统将针对采集规则配置管理中已定制的目标信息源,根据用户已生成的采集规则,定时自动地对这些网站进行信息采集、抽取、去重操作,将非结构化的信息从大量的网页中抽取出来保存到结构化的数据库中,其中,正文存储到文件系统。
2.1 Scrapy爬虫框架抓取原理
采集规则配置,使用了xpath、正则表达式。xpath是一种结构化网页元素选择器,支持列表和单节点数据获取,它的好处是可以支持规整网页数据抓取。使用的是google插件XPath Helper,可以支持在网页点击元素生成xpath,就省去了自己去查找xpath的工夫,也便于未来做到所点即所得的功能。正则表达式补充xpath抓取不到的数据,还可以过滤一些特殊字符。
去重操作,使用了Redis数据库[8]。基于Redis的Bloomfilter去重,既用上了Bloomfilter的海量去重能力,又用上了Redis的可持久化能力。当redis数据库中没有一条url数据则会一直将整站的page抓取,但如果在某个时间点已经爬去完了数据,继续启动程序爬去增加的数据是会去判断每个url是否已经爬去,当url有重复时,则不会回调,实现url去重。
Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为引擎打开一个域名时蜘蛛处理这个域名,并让蜘蛛获取第一个待爬取的URL。引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。引擎从调度那获取接下来进行爬取的页面。调度将下一个爬取的URL返回给引擎,引擎将它们通过下载中间件发送到下载器。当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。引擎将抓取到的项目管道,并向调度发送请求。系统重复第二步后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。
2.2 Scrapy爬虫框架抓取实现方式
采集程序是一个以Scrapy框架的Python脚本程序,接下来对程序设计与实现用一个简单的Scrapy爬取网易科技新闻的例子进行详细说明。爬虫之前首先应将大体思路理清楚,爬虫的对象是网易科技新闻。这个网页上会有很多信息,有导航、专栏、新闻,还有一些广告,目的很明确——爬新闻,细分一下主要包括新闻的标题、正文、来源、时间等。同时为了简单起见,对于新闻里的图片、视频等一系列多媒体元素也不做处理[9]。
在Scrapy框架中要爬的内容都被定义在items.py文件中,定义也非常简单,代码如下:
# -*- coding:utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class Tech163Item(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
news_thread=scrapy.Field()
news_title = scrapy.Field()
news_url = scrapy.Field()
news_time=scrapy.Field()
news_from=scrapy.Field()
from_url=scrapy.Field()
news_body=scrapy.Field()
其中,news_thread是从每条新闻的url中提取特有的一个字符串,比如这条新闻,它的地址是http://tech.163.com/16/0813/10/A3H72TD4000915BF.html,那么它的thread就是A3H72TD4000915BF,它是随机产生的新闻识别号,16和0813是年份和日期,10是一个2位的数字。news_title、news_url、news_time、news_from、from_url、news_body这些定义的是之前提到新闻的属性。
定义完要爬的内容,再开始写爬虫蜘蛛——spider,在目录tech163/spiders/下,创建spider文件,叫作news_spider.py。
#encoding:utf-8
import scrapy
import re
from scrapy.selector import Selector
from tech163.items import Tech163Item
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider,Rule
class ExampleSpider(CrawlSpider):
name = "news"
allowed_domains = ["tech.163.com"]
start_urls = [ " http://tech.163.com/ " ]
rules=(
Rule(LinkExtractor(allow=r"/16/08\d+/\d+/*"),
callback="parse_news",follow=True),
)
def printcn(suni):
for i in uni:
print uni.encode( " utf-8 " )
……
news_body=response.xpath("//div[@id= " endText " ]/p/text()").extract()
if news_body:
# for entry in news_body:
# print entry.encode( " utf-8 " )
item[ " news_body " ]=news_body
def get_url(self,response,item):
news_url=response.url
if news_url:
#print news_url
item[ " news_url " ]=news_url
大部分都是對网页做解析,解析的地方大部分是用xpath对内容进行提取。这些解析只实现了对单张新闻网页的解析,是什么让它不停地爬取科技频道的新闻呢?scrapy的方便之处就是,这个机制只用1行代码就实现了。
rules=(
Rule(LinkExtractor(allow=r"/16/08\d+/\d+/*"),
callback="parse_news",follow=True),
)
这行代码,设置了整个爬虫的规则,通过LinkExtractor这个元件从response提取到所有的链接,再通过设置allow来设置需要再递归往下爬的新闻。这里使用正则表达式,将新闻的url做了约束。可以回顾下,正常的url格式是这样的http://tech.163.com/16/0813/10/A3H72TD4000915BF.html,代码中的正则/16/08\d+/\d+/*的含义是爬去/16/08开头并且后面是数字/数字/任何格式/的新闻,可以说是2016年8月份的新闻。通过这个正则便可以很好地对递归爬去做出筛选。follow=ture定义了是否在抓取结果中继续往后抓取[10]。
上述部分简单地介绍了信息采集系统采集新闻类资讯的实现方式,在采集的过程中会根据不同的网站做对应的处理,使其效果达到最好、效率达到最佳。
3 结语
为满足云南农村科技服务平台整合多信息源的需求,制定了平台信息采集解决方案,设计开发了信息采集系统和子系统,并根据功能需求和领域模型,构建系统数据库,配置采集参数,运用多线程技术、数据库连接池技术、动态采集策略、多页面合并技术,定时自动采集、抽取、去重相关网站信息,将非结构化信息抽取出来保存到结构化数据库中,其中,正文存储到文件系统。Python爬虫框架Scrapy通过其强大的定向爬取功能,完美地支撑了平台信息采集。目前,已配置100多个网站的采集参数,每天为平台采集上传信息200多条。
参考文献
[1] CNNIC中国互联网络信息中心.中国互联网络发展状况统计报告(第33次)[R].2013.
[2] 庞景安.Web信息采集技术研究与发展[J].情报科学,2009,27(12):1891-1895.
[3] 蒲筱哥.基于Web的信息抽取技术研究综述[J].现代情报,2007(10):215-219.
[4] 陈琼,苏文健.基于网页结构树的Web信息抽取方法[J].计箅机工程,2005,31(20):54-55,140.
[5] 陈立为.面向主题信息采集系统现状分析[J].湖南有色金属,2014,30(2):77-80.
[6] 蔺跟荣.基于用户兴趣的个性化Web信息检索方法[J].电子设计工程,2010,18(7):60-62.
[7] 金岳富,范剑英,冯扬.分布式Web信息釆集系统的设计与实现[J].哈尔滨理工大学学报,2010,15(1):116-119,123.
[8] 潘大胜.计算机半结构化数据源的数据挖掘技术探析[J].武汉工业学院学报,2011,30(4):69-72.
[9] 郭梅.深度网爬虫及更新策略研究[D].北京:北京化工大学,2010:37-43.
[10] 陈静,朱巧明,贡正仙.基于Ontology的信息抽取研究综述[J].计算机技术与发展,2007,17(10):84-86,91.