劉登英 龔力波 李雯 黃曉輝
摘要?農(nóng)村信息化是發(fā)展現(xiàn)代農(nóng)業(yè)的重要條件,農(nóng)業(yè)信息對農(nóng)業(yè)生產(chǎn)生活具有重要的指導(dǎo)作用,為避免云南農(nóng)村信息化多頭建設(shè)、重復(fù)建設(shè)所引起的資源浪費,開展了云南農(nóng)村科技服務(wù)平臺建設(shè),實現(xiàn)了云南農(nóng)業(yè)科技信息的整體運作與資源整合,為相關(guān)涉農(nóng)政府部門、科研院所、企業(yè)農(nóng)戶提供信息技術(shù)指導(dǎo)。
關(guān)鍵詞?Scrapy爬蟲框架;農(nóng)村科技服務(wù)平臺;信息采集
中圖分類號?S-058文獻標(biāo)識碼?A文章編號?0517-6611(2018)35-0191-04
黨的十九大報告明確提出實施鄉(xiāng)村振興戰(zhàn)略,要用現(xiàn)代科學(xué)技術(shù)服務(wù)農(nóng)業(yè),用現(xiàn)代生產(chǎn)方式改造農(nóng)業(yè),提高農(nóng)業(yè)良種化、機械化、科技化、信息化、標(biāo)準(zhǔn)化水平。云南貧困面廣、貧困度深,少數(shù)民族眾多,農(nóng)村信息化發(fā)展滯后,社會經(jīng)濟欠發(fā)達,不利于民族團結(jié)和邊疆穩(wěn)定。云南農(nóng)村科技服務(wù)平臺針對云南農(nóng)村信息化各自為陣、條塊分割的建設(shè)現(xiàn)狀,加強信息資源整合,分析挖掘現(xiàn)有數(shù)據(jù)資源,集成新聞資訊、農(nóng)業(yè)科技、市場供銷、政策法規(guī)、招商招聘、天氣變化、農(nóng)業(yè)企業(yè)等信息,開發(fā)特色鮮明、實用性強的全產(chǎn)業(yè)鏈農(nóng)業(yè)信息,構(gòu)建和完善云南農(nóng)村信息化技術(shù)服務(wù)體系,在代表性地區(qū)和企業(yè)開展示范應(yīng)用,積極為云南農(nóng)業(yè)現(xiàn)代化、鄉(xiāng)村經(jīng)濟振興提供信息技術(shù)服務(wù)。
1?基于Scrapy爬蟲框架的云南農(nóng)村科技服務(wù)平臺信息采集系統(tǒng)的研究
信息采集系統(tǒng)采用網(wǎng)絡(luò)爬蟲技術(shù),爬蟲技術(shù)是捜索引擎抓取系統(tǒng)的重要組成部分。爬蟲的作用就是不斷地去采集網(wǎng)頁的源代碼,按照一定的規(guī)則,自動地抓取互聯(lián)網(wǎng)信息[1]。
通用的爬蟲框架基本上包括了一個爬蟲系統(tǒng)所需要的所有模塊。任何一個爬蟲系統(tǒng)的設(shè)計圖,都有一個環(huán)路,這個環(huán)代表著爬蟲大致的工作流程:根據(jù)url將對應(yīng)的網(wǎng)頁下載下來,然后提取出網(wǎng)頁中包含的url,再根據(jù)這些新的url下載對應(yīng)的網(wǎng)頁,周而復(fù)始。爬蟲系統(tǒng)的子模塊都位于這個環(huán)路中,并完成某項特定的功能。
目前網(wǎng)絡(luò)爬蟲有很多種實現(xiàn)方式,要從很多框架中選擇適用于該項目的爬蟲框架,保證信息采集系統(tǒng)性能最優(yōu)、功能最佳。
除了搜索引擎爬蟲外,主流的被大眾所使用的技術(shù)有:基于C++的Larbin;基于Java的Webmagic、Nutch、Heritrix;基于Python的Scrapy、pyspider;基于Golang的Pholcus; 基于.NET的abot等。
經(jīng)過初步的技術(shù)預(yù)研和篩選,挑選了3個比較成熟的開源爬蟲框架,其中Nutch、Heritrix是Java爬蟲框架,Scrapy是Python爬蟲框架。
1.1?基于Java爬蟲框架信息采集系統(tǒng)研究
1.1.1?Nutch。Nutch是一個由Java實現(xiàn)的,開放源代碼(opensource)的web搜索引擎[2],主要用于收集網(wǎng)頁數(shù)據(jù),然后對其進行分析,建立索引,以提供相應(yīng)的接口來對其網(wǎng)頁數(shù)據(jù)進行查詢的一套工具。
優(yōu)點:Nutch支持分布式抓取、并有Hadoop支持,可以進行多機分布抓取、存儲和索引。另外很吸引人的一點在于它提供了一種插件框架,使得其對各種網(wǎng)頁內(nèi)容的解析、各種數(shù)據(jù)的采集、查詢、集群、過濾等功能能夠方便地進行擴展,正是由于有此框架,使得Nutch的插件開發(fā)非常容易,第三方的插件也層出不窮,極大地增強了Nutch的功能和聲譽。
缺點:Nutch的爬蟲定制能力比較弱。Nutch是為搜索引擎設(shè)計的爬蟲,大多數(shù)用戶是需要一個做精準(zhǔn)數(shù)據(jù)爬?。ň槿。┑呐老x。Nutch運行的一套流程里,有2/3是為了搜索引擎而設(shè)計的,對精抽取沒有太大的意義。也就是說,用Nutch做數(shù)據(jù)抽取,會浪費很多時間在不必要的計算上。如果試圖通過對Nutch進行二次開發(fā),使它適用于精抽取的業(yè)務(wù),基本上就要破壞Nutch的框架。如果不做搜索引擎,盡量不要選擇Nutch作為爬蟲。
1.1.2?Heritrix。Heritrix用來獲取完整的、精確的、站點內(nèi)容的深度復(fù)制[3],包括獲取圖像以及其他非文本內(nèi)容,抓取并存儲相關(guān)的內(nèi)容,對內(nèi)容來者不拒,不對頁面進行內(nèi)容上的修改。重新爬行對相同的URL不針對先前的進行替換。爬蟲通過Web用戶界面啟動、監(jiān)控、調(diào)整,允許彈性的定義要獲取的URL[4]。
優(yōu)點:Heritrix的爬蟲定制參數(shù)多。
缺點:單實例的爬蟲,之間不能進行合作。在有限的機器資源的情況下,卻要復(fù)雜的操作。只有官方支持,僅僅在Linux上進行了測試。每個爬蟲是單獨進行工作的,沒有對更新進行修訂。在硬件和系統(tǒng)失敗時,恢復(fù)能力很差。很少的時間用來優(yōu)化性能。
1.2?基于Python爬蟲框架信息采集系統(tǒng)研究
“Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架??梢詰?yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲歷史數(shù)據(jù)等一系列的程序中。其最初是為了頁面抓?。ǜ_切來說,網(wǎng)絡(luò)抓?。┧O(shè)計的,也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如AmazonAssociates Web Services )或者通用的網(wǎng)絡(luò)爬蟲。”以上是官方的說明,更詳細(xì)地說,Scrapy是一個十分健壯、非常好用的從互聯(lián)網(wǎng)上抓取數(shù)據(jù)的Web框架[5]。
優(yōu)點:為抓取單一網(wǎng)站上固定格式的內(nèi)容而設(shè)計的,比如抓取一個小說網(wǎng)站上的小說或者抓取一個電子商務(wù)網(wǎng)站上的商品。結(jié)構(gòu)清晰,可以很方便地修改它來實現(xiàn)更復(fù)雜的需求。
缺點:解析網(wǎng)頁比較慢,最好自己寫一個網(wǎng)頁解析;增量抓取。一個針對多個網(wǎng)站的爬蟲很難一次性把所有網(wǎng)頁爬取下來,并且網(wǎng)頁也處于不斷更新的狀態(tài)中,爬取是一個動態(tài)的過程,爬蟲支持增量的抓取是很必要的。
快速強大:只需編寫爬取規(guī)則,剩下由Scrapy完成;易擴展:擴展性設(shè)計,支持插件,無需改動核心代碼;可移植性:基于Linux、Windows、Mac、BSD開發(fā)和運行。
1.3?Java爬蟲框架與Python爬蟲框架比較
選擇哪種爬蟲主要看定義的“爬蟲”干什么用。
定向爬蟲就是指定某一些網(wǎng)站的數(shù)據(jù)源作為數(shù)據(jù)來源,進行頁面數(shù)據(jù)的抓取,抓取整個網(wǎng)站有用的數(shù)據(jù)以及圖片等信息。這里有別于傳統(tǒng)的搜索引擎爬蟲,傳統(tǒng)的搜索引擎爬蟲主要是針對整個互聯(lián)網(wǎng)的數(shù)據(jù)進行爬取以及數(shù)據(jù)分析,難度更大,不論是抓取的調(diào)度,還是性能要求,又或者是數(shù)據(jù)的存儲都有很大的區(qū)別。
云南農(nóng)村科技服務(wù)平臺信息采集系統(tǒng)開發(fā)目的是幫助普通用戶從多個指定農(nóng)業(yè)網(wǎng)站自動、定時地采集農(nóng)產(chǎn)品信息、科技信息,并將這些結(jié)構(gòu)化信息按照自定義分類存儲起來,為信息的二次利用提供便利。信息采集系統(tǒng)是以Web數(shù)據(jù)挖掘引擎為基礎(chǔ)構(gòu)建而成,它可以在最短的時間內(nèi),將最新的信息從不同的Web站點上采集下來,并在進行分類和統(tǒng)一格式后,第一時間之內(nèi)把信息及時發(fā)布到自己的站點上去,從而提高信息及時性和減少工作量。綜合分析可知,信息采集系統(tǒng)需要的爬蟲框架是定向爬蟲,而不是搜索引擎爬蟲。通過上面的介紹,Java爬蟲框架Nutch、Heritrix均屬于搜索引擎爬蟲框架,Python爬蟲框架Scrapy則屬于定向爬蟲框架[6-7]。
綜上所述,Scrapy框架值得作為第一選擇。
優(yōu)點:支持xpath;基于twisted,性能不錯;有較好的調(diào)試工具;很容易安裝和使用;優(yōu)秀的幫助文檔;成熟且有針對性的解決方案;內(nèi)置對代理、重定向、認(rèn)證、cookies等方面的支持;內(nèi)置對CSV、JSON和XML的支持。
2?基于Scrapy爬蟲框架的云南農(nóng)村科技服務(wù)平臺信息采集系統(tǒng)的實現(xiàn)
信息采集系統(tǒng)將針對采集規(guī)則配置管理中已定制的目標(biāo)信息源,根據(jù)用戶已生成的采集規(guī)則,定時自動地對這些網(wǎng)站進行信息采集、抽取、去重操作,將非結(jié)構(gòu)化的信息從大量的網(wǎng)頁中抽取出來保存到結(jié)構(gòu)化的數(shù)據(jù)庫中,其中,正文存儲到文件系統(tǒng)。
2.1?Scrapy爬蟲框架抓取原理
采集規(guī)則配置,使用了xpath、正則表達式。xpath是一種結(jié)構(gòu)化網(wǎng)頁元素選擇器,支持列表和單節(jié)點數(shù)據(jù)獲取,它的好處是可以支持規(guī)整網(wǎng)頁數(shù)據(jù)抓取。使用的是google插件XPath Helper,可以支持在網(wǎng)頁點擊元素生成xpath,就省去了自己去查找xpath的工夫,也便于未來做到所點即所得的功能。正則表達式補充xpath抓取不到的數(shù)據(jù),還可以過濾一些特殊字符。
去重操作,使用了Redis數(shù)據(jù)庫[8]?;赗edis的Bloomfilter去重,既用上了Bloomfilter的海量去重能力,又用上了Redis的可持久化能力。當(dāng)redis數(shù)據(jù)庫中沒有一條url數(shù)據(jù)則會一直將整站的page抓取,但如果在某個時間點已經(jīng)爬去完了數(shù)據(jù),繼續(xù)啟動程序爬去增加的數(shù)據(jù)是會去判斷每個url是否已經(jīng)爬去,當(dāng)url有重復(fù)時,則不會回調(diào),實現(xiàn)url去重。
Scrapy的整個數(shù)據(jù)處理流程由Scrapy引擎進行控制,其主要的運行方式為引擎打開一個域名時蜘蛛處理這個域名,并讓蜘蛛獲取第一個待爬取的URL。引擎從蜘蛛那獲取第一個需要爬取的URL,然后作為請求在調(diào)度中進行調(diào)度。引擎從調(diào)度那獲取接下來進行爬取的頁面。調(diào)度將下一個爬取的URL返回給引擎,引擎將它們通過下載中間件發(fā)送到下載器。當(dāng)網(wǎng)頁被下載器下載完成以后,響應(yīng)內(nèi)容通過下載中間件被發(fā)送到引擎。引擎收到下載器的響應(yīng)并將它通過蜘蛛中間件發(fā)送到蜘蛛進行處理。蜘蛛處理響應(yīng)并返回爬取到的項目,然后給引擎發(fā)送新的請求。引擎將抓取到的項目管道,并向調(diào)度發(fā)送請求。系統(tǒng)重復(fù)第二步后面的操作,直到調(diào)度中沒有請求,然后斷開引擎與域之間的聯(lián)系。
2.2?Scrapy爬蟲框架抓取實現(xiàn)方式
采集程序是一個以Scrapy框架的Python腳本程序,接下來對程序設(shè)計與實現(xiàn)用一個簡單的Scrapy爬取網(wǎng)易科技新聞的例子進行詳細(xì)說明。爬蟲之前首先應(yīng)將大體思路理清楚,爬蟲的對象是網(wǎng)易科技新聞。這個網(wǎng)頁上會有很多信息,有導(dǎo)航、專欄、新聞,還有一些廣告,目的很明確——爬新聞,細(xì)分一下主要包括新聞的標(biāo)題、正文、來源、時間等。同時為了簡單起見,對于新聞里的圖片、視頻等一系列多媒體元素也不做處理[9]。
在Scrapy框架中要爬的內(nèi)容都被定義在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,它是隨機產(chǎn)生的新聞識別號,16和0813是年份和日期,10是一個2位的數(shù)字。news_title、news_url、news_time、news_from、from_url、news_body這些定義的是之前提到新聞的屬性。
定義完要爬的內(nèi)容,再開始寫爬蟲蜘蛛——spider,在目錄tech163/spiders/下,創(chuàng)建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("http://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
大部分都是對網(wǎng)頁做解析,解析的地方大部分是用xpath對內(nèi)容進行提取。這些解析只實現(xiàn)了對單張新聞網(wǎng)頁的解析,是什么讓它不停地爬取科技頻道的新聞呢?scrapy的方便之處就是,這個機制只用1行代碼就實現(xiàn)了。
rules=(
Rule(LinkExtractor(allow=r"/16/08\d+/\d+/*"),
callback="parse_news",follow=True),
)
這行代碼,設(shè)置了整個爬蟲的規(guī)則,通過LinkExtractor這個元件從response提取到所有的鏈接,再通過設(shè)置allow來設(shè)置需要再遞歸往下爬的新聞。這里使用正則表達式,將新聞的url做了約束??梢曰仡櫹?,正常的url格式是這樣的http://tech.163.com/16/0813/10/A3H72TD4000915BF.html,代碼中的正則/16/08\d+/\d+/*的含義是爬去/16/08開頭并且后面是數(shù)字/數(shù)字/任何格式/的新聞,可以說是2016年8月份的新聞。通過這個正則便可以很好地對遞歸爬去做出篩選。follow=ture定義了是否在抓取結(jié)果中繼續(xù)往后抓取[10]。
上述部分簡單地介紹了信息采集系統(tǒng)采集新聞類資訊的實現(xiàn)方式,在采集的過程中會根據(jù)不同的網(wǎng)站做對應(yīng)的處理,使其效果達到最好、效率達到最佳。
3?結(jié)語
為滿足云南農(nóng)村科技服務(wù)平臺整合多信息源的需求,制定了平臺信息采集解決方案,設(shè)計開發(fā)了信息采集系統(tǒng)和子系統(tǒng),并根據(jù)功能需求和領(lǐng)域模型,構(gòu)建系統(tǒng)數(shù)據(jù)庫,配置采集參數(shù),運用多線程技術(shù)、數(shù)據(jù)庫連接池技術(shù)、動態(tài)采集策略、多頁面合并技術(shù),定時自動采集、抽取、去重相關(guān)網(wǎng)站信息,將非結(jié)構(gòu)化信息抽取出來保存到結(jié)構(gòu)化數(shù)據(jù)庫中,其中,正文存儲到文件系統(tǒng)。Python爬蟲框架Scrapy通過其強大的定向爬取功能,完美地支撐了平臺信息采集。目前,已配置100多個網(wǎng)站的采集參數(shù),每天為平臺采集上傳信息200多條。
參考文獻
[1] CNNIC中國互聯(lián)網(wǎng)絡(luò)信息中心.中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告(第33次)[R].2013.
[2] 龐景安.Web信息采集技術(shù)研究與發(fā)展[J].情報科學(xué),2009,27(12):1891-1895.
[3] 蒲筱哥.基于Web的信息抽取技術(shù)研究綜述[J].現(xiàn)代情報,2007(10):215-219.
[4] 陳瓊,蘇文健.基于網(wǎng)頁結(jié)構(gòu)樹的Web信息抽取方法[J].計箅機工程,2005,31(20):54-55,140.
[5] 陳立為.面向主題信息采集系統(tǒng)現(xiàn)狀分析[J].湖南有色金屬,2014,30(2):77-80.
[6] 藺跟榮.基于用戶興趣的個性化Web信息檢索方法[J].電子設(shè)計工程,2010,18(7):60-62.
[7] 金岳富,范劍英,馮揚.分布式Web信息釆集系統(tǒng)的設(shè)計與實現(xiàn)[J].哈爾濱理工大學(xué)學(xué)報,2010,15(1):116-119,123.
[8] 潘大勝.計算機半結(jié)構(gòu)化數(shù)據(jù)源的數(shù)據(jù)挖掘技術(shù)探析[J].武漢工業(yè)學(xué)院學(xué)報,2011,30(4):69-72.
[9] 郭梅.深度網(wǎng)爬蟲及更新策略研究[D].北京:北京化工大學(xué),2010:37-43.
[10] 陳靜,朱巧明,貢正仙.基于Ontology的信息抽取研究綜述[J].計算機技術(shù)與發(fā)展,2007,17(10):84-86,91.