周毅 李威 何金 程蕾 柳璐
摘? 要:針對傳統單機網絡爬蟲抓取效率低、穩(wěn)定性差、數據量少等問題,文章利用Scrapy框架結合Redis技術,對傳統網絡爬蟲框架進行改進和優(yōu)化,設計出了分布式非結構化的網絡爬蟲系統,使采集到的信息能以非結構化形式存儲于MongoDB數據庫內,實現對數據信息的實時、有效處理分析。經過實際應用測試,證明基于Scrapy框架的分布式非結構化網絡爬蟲系統相較于傳統單機系統具有更高的效率。
關鍵詞:分布式;Scrapy框架;網絡爬蟲
中圖分類號:TP311? ? ? ? ? ? ? ? ?文獻標識碼:A文章編號:2096-4706(2021)19-0043-04
Design and Implementation of Distributed Web Crawler System Based
On Scrapy Framework
ZHOU Yi, LI Wei, HE Jin, CHENG Lei, LIU Lu
(Information and Communication Branch of State Grid Liaoning Electric Power Supply Co., Ltd., Shenyang? 110055, China)
Abstract:Aiming at the problems of low capture efficiency, poor stability and small amount of data on traditional single-machine web crawler, this paper uses Scrapy framework and Redis technology to improve and optimize the traditional web crawler framework, and designs a distributed and unstructured web crawler system, which enables the collected information to be stored in the MongoDB database in an unstructured form, so as to achieve real-time and effective processing and analysis of data information. After practical application test, it is proved that the distributed and unstructured web crawler system based on Scrapy framework has higher efficiency than the traditional single-machine system.
Keywords: distributed; Scripy framework; Web crawler
0? 引? 言
隨著大數據時代的到來,人們對數據的需求與日俱增。為了對萬維網上的數據進行特定的搜索,各種搜索引擎也是層出不窮,搜索引擎在數據搜集中站著越來越重要的地位,但正是因為信息的高速發(fā)展,用戶對信息的搜索也是越來越嚴苛,如今的搜索引擎也越來越難以滿足用戶的需求[1]。因此,互聯網數據的搜集成為當代科技必不可少的技術之一,網絡爬蟲技術應運而生。網絡爬蟲技術能夠實現互聯網信息的自動化搜集,并將相關信息存入數據庫內部。但傳統單機網絡爬蟲抓取效率低、穩(wěn)定性差、數據量少,不能滿足大數據時代下的數據需求;針對開源爬蟲方面,雖然已研發(fā)出Nutch、Larbin等網絡爬蟲項目,但普遍存在運行效率低、穩(wěn)定性差、不支持中文等問題。因此本文提出基于Scrapy框架的分布式網絡爬蟲系統。
1? 相關原理與技術
1.1? 網絡爬蟲
網絡爬蟲(Web Crawler),又稱為網絡蜘蛛(Web Spider)或Web信息采集器,是一個自動下載網頁的計算機程序或自動化腳本,是搜索引擎的重要組成部分[2]。網絡爬蟲通常從一個預先設定好的URL集合開始運行,首先將所有URL有序或隨機地放入到一個有序的待爬行隊列里;然后按照隊列順序,從隊列中取出URL并對URL地址發(fā)起網絡請求,得到網頁內容,分析頁面內容;再提取新的URL按先后順序存入待爬行隊列中,循環(huán)整個過程,直到待爬行隊列為空或滿足預設的爬行終止條件。該過程稱為網絡爬行(Web Crawling),網絡爬蟲根據設計需求和技術實現,大致可以分為以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)[3]。在實際使用場景中,通常是幾種爬蟲技術相結合實現的。為了提高爬行效率,通常會采取多點并行的設計架構,但需要在爬行過程中解決重復性(并行運行過程中,可能會產生重復URL)、爬行質量(并行運行過程中,每次爬取動作可能只獲取部分頁面,導致抓取到的數據不完善)。網絡爬蟲有很多使用場景,搜索引擎用通過網絡爬蟲來建立網頁索引,實現網絡資源的快速搜索;在進行網站維護時,網絡爬蟲用于檢查網站鏈接是否有效、源碼是否篡改等。
1.2? 網絡爬蟲框架Scrapy
Scrapy框架是一個用于結構化、模式化提取網絡資源的應用框架。最初是為了抓取網站數據而設計的,也可以用于在獲取API接口的數據(各類網站數據接口等)或者構造通用網絡爬蟲系統。Scrapy用途廣泛,可以用于數據挖掘、監(jiān)測和自動化測試[4]。Scrapy框架通過Twisted異步網絡庫來處理網絡通訊,實現網絡爬蟲的異步化。
Scrapy框架主要包括以下組件:Scrapy Engine(引擎);Spider Middlewares(蜘蛛中間件);Spiders(蜘蛛);Scheduler(Middlewares調度中間件);Scheduler(調度器);Downloader Middlewares(下載器中間件);Downloader(下載器);Item Pipeline(項目管道)。
1.3? Xpath頁面解析
Xpath全稱XMLpathLanguage,即XML路徑語言,它是一種用來確定XML文檔中某部分位置的語言,也適用于HTML文檔的定位和搜索。在分析網頁內容時,主要有三種提取網頁數據的方式:正則表達式、BeautifulSoup庫和Xpath。Xpath頁面解析主要有以下特點:提供了簡潔明了的路徑選擇表達式,高效實現對字符串、時間等字段的匹配能力;Xpath的路徑選擇表達式能實現網頁內容的序列化處理,能夠迅速定位網頁的標簽節(jié)點;Xpath比BeautifulSoup運行效率高、比正則表達式使用方便。因此本文使用Xpath對頁面進行解析。
1.4? Scrapy-Redis技術
Redis是一種使用c語言編寫的,支持網絡,可基于內存亦可持久化的日執(zhí)行并提供多種語言的Nosql數據庫。在Scrapy-Redis中存放了待爬取的request對象以及已被獲取的request對象指紋,基于Redis 緩存數據庫,我們可以實現分布式的增量式爬蟲。當獲取到一個request對象時,首先將該對象生成指紋,與緩存數據庫中的指紋相比較,若存在相同的指紋,表示該request對象已經被另外一臺服務器請求過,不需要再次存入緩存數據庫中,如不存在相同的指紋,則將該request對象放入數據庫中并且生成指紋存入數據庫中,這樣就可以通過redis實現多臺服務器的分布式爬蟲。當一臺服務器停止爬蟲再重新開始爬蟲時,由于之前的request對象已經存入緩存數據庫中,再重新爬蟲時,從redis中讀取request對象時,仍然從上次停止的地方開始爬取,這就實現了斷點續(xù)爬的功能,也就是增量式的爬蟲[5]。
2? 系統設計與實現
基于Scrapy框架的分布式網絡爬蟲系統架構分為數據層和業(yè)務層:數據層采用Scrapy爬蟲框架,負責信息數據的獲取和爬蟲系統調度的工作。通過繼承并重寫Spiders類,實現定制化爬蟲功能。數據層最終將數據存入MongoDB集群中,為業(yè)務層提供數據源。業(yè)務層采用Node.js框架技術,用Server類實現服務器收發(fā)請求功能,并提供正向和逆向的Ajax交互[6]。
2.1? 數據層設計與實現
數據層,負責網絡爬蟲的調度及數據的獲取、清洗和融合。數據層分為七部分:調度器、調度器中間件、下載器、下載器中間件、解析器、解析器中間件和存儲管道。Scrapy引擎,用來處理整個系統的數據流處理,觸發(fā)事務;解析器中間件,介于Scrapy引擎和解析器之間的鉤子框架,主要工作是處理Spider的響應輸入和請求輸出,包括漏洞信息的清洗工作。數據層繼承Spider類,并重寫parse(response)方法,在各個子類中可以選擇抓取數據的模式和日期,抓取數據的模式分為循環(huán)抓取、定時抓取和范圍抓取。
調度器中間件,介于Scrapy引擎和調度器之間的中間件,從Scrapy引擎發(fā)送到調度的請求和響應;調度器,用來接受引擎發(fā)過來的請求,壓入隊列中,并在引擎再次請求的時候返回,本文通過使用Scrapy-Redis存儲調度redis的訪問請求,實現分布式任務調度和爬取功能,網頁調度功能由重寫Scrapy引擎的Spider類實現,系統從調度器中取出一個鏈接(URL)用于接下來的抓取;調度器把URL封裝成一個請求(Request)傳給下載器;下載器把資源下載下來,并封裝成應答包(Response);爬蟲解析Response;解析出實體(Item),則交給實體管道進行進一步的處理;解析出的是鏈接(URL),則把URL交給調度器等待抓取。下載器中間件,位于Scrapy引擎和下載器之間的鉤子框架,主要是處理Scrapy引擎與下載器之間的請求及響應,數據層繼承DownloaderMiddleware類,并重寫process_request(request,spider)方法,分別設計了RotateUserAgentMiddleware類(提供隨機的偽裝User-Agent頭)、CookiesMiddleware類(負責cookies追蹤和維護)和HttpProxyMiddleware類(提供IP代理接口),其具體設計如圖1所示。
2.2? 業(yè)務層設計與實現
業(yè)務層是本系統的關鍵所在,本系統的所有業(yè)務邏輯功能和相關算法皆在本層實現,具體設計如圖2所示。使用業(yè)務層的優(yōu)勢在于可以降低表示層和數據層的功能復雜度,使表示層專注于請求響應,使數據層專注于數據操作,這樣不僅使系統結構清晰,而且可以最大程度上實現系統松耦合,便于業(yè)務功能的擴展和屏蔽接口具體實現細節(jié),能夠增強系統的擴展性和穩(wěn)定性。
2.3? 網頁判重模塊設計與實現
在網絡爬蟲運行過程中,可能存在同一頁面被多次下載的情況,不僅會延長運行時間,還會為增加系統負荷。本文通過控制URL下載隊列中的URL唯一性,解決爬取URL的重復性問題。首先在系統中建立一個全局變量,用于監(jiān)測是否某一URL曾被訪問過;然后在爬取過程中探測當前待爬取URL是否在全局變量中,即可完成URL的判重工作。本文建立一個URL去重池,在下載過程中,在去重池里的URL有且僅有一次爬取動作。
本文采用基于Hash算法的MD5壓縮映射存儲,實現URL去重池的功能。爬取過程中,MD5算法能夠將任意位數的字符串壓縮為128位整數,并映射為物理地址,且MD5進行Hash映射碰撞的概率非常小,幾乎可以忽略不計,可以實現URL去重池的唯一性。在爬蟲每一次爬取過程中,將在MD5存儲時發(fā)生碰撞的URL左移一位,對URL進行重復MD5處理。網頁判重流程圖如圖3所示。
本系統使用Scrapy框架中的Spider類,網絡爬蟲模塊類繼承Spider類,并實現start_request()方法,dont_filter參數設為False。本模塊首先獲取Url地址,接著采用MD5[45]壓縮算法將Url地址壓縮成長度為128位整數并映射成物理地址;隨后判斷整數是否重復:若不重復,則將MD5串存入去重庫中并將Url地址加入請求隊列中;若重復,則判斷是否發(fā)生碰撞(MD5串相同的情況下,Url地址不同,稱為發(fā)生碰撞。),若產生未產生碰撞,則丟棄Url地址;否則將Url地址左移一位重新進行MD5壓縮并比較是否重復,直至結束。
2.4? 網頁下載模塊設計與實現
網頁下載模塊在網頁判重模塊之后,本系統使用Scrapy框架中的下載器中間件(處理Scrapy引擎與下載器之間的請求及響應),繼承DownloaderMiddleware類,并重寫process_request(request,spider)方法。本系統先從請求隊列RequestQueue中提取Url地址,然后交給下載器中間件下載網頁內容;若下載過程中出錯,則調用RotateUserAgentMiddleware類(提供隨機的偽裝User-Agent頭)、CookiesMiddleware類(負責cookies追蹤和維護)和HttpProxyMiddleware類(提供IP代理接口),重新下載網頁內容,重復此過程3次;若最終仍下載失敗,則將Url地址和MD5字符串存入失敗隊列FailQueue中,等待存入數據庫中。網頁下載流程圖如圖4所示。
3? 實驗結果
3.1? 實驗數據
為驗證本文研究的基于Scrapy框架的分布式網絡爬蟲系統的高效率和穩(wěn)定性,以hao123為測試頁面,設置對照驗證試驗,其中本文研究的網絡爬蟲系統為實驗組,傳統單機網絡爬蟲系統為對照組。在實驗組中通過將url.py文件產生的url隊列存入至redis數據庫隊列內,再使用scrapy crawl命令執(zhí)行分布式爬取,最后將數據存入MongoDB中;而對照組采用傳統的Nutch網絡爬蟲進行數據抓取,分別測試實驗組以及對照組在不同的網頁數抓取過程中成功下載保存的網頁數量,網頁抓取統計結果如表1所示。
3.2? 實驗結果
根據上表1所示,對照組在進行網頁抓取時,網頁丟失數量較多、抓取時間較長,實驗組的網頁抓取成功率和運行效率明顯提升,訪問時間明顯降低,證明本文研究的基于Scrapy框架的分布式網絡爬蟲系統具有優(yōu)越性,可被廣泛應用推廣。
4? 結? 論
通過設計基于Scrapy框架的分布式網絡爬蟲系統,改進并優(yōu)化了傳統Scrapy框架,拓展了Scrapy框架的分布式能力,實現網絡爬蟲的分布式抓取和數據的非結構化存儲,經實驗結果發(fā)現基,基于Scrapy框架的分布式網絡爬蟲系統相較傳統單機網絡爬蟲系統,提升了網絡爬蟲的抓取效率和運行穩(wěn)定性。
參考文獻:
[1] 米切爾.Python網絡數據采集 [M].南京:東南大學出版社,2018.
[2] YU J K,LI M R,ZHANG D Y. A Distributed Web Crawler Model based on Cloud Computing [C]//The 2nd Information Technology and Mechatronics Engineering Conference (ITOEC 2016).2016:276-279.
[3] 劉順程,岳思穎.大數據時代下基于Python的網絡信息爬取技術 [J].電子技術與軟件工程,2017(21):160.
[4] 施威,夏斌.基于Scrapy的商品評價獲取系統設計 [J].微型機與應用,2017,36(19):12-15.
[5] 劉碩.精通scrapy網絡爬蟲 [M].北京:清華大學出版社,2017.
[6] 徐海嘯,董颯,李翔,等.分布式網絡爬蟲框架Crawlzilla [J].電子技術與軟件工程,2017(18):25-26.
作者簡介:周毅(1992—),男,漢族,遼寧鞍山人,中級工程師,碩士研究生,研究方向:信息通信;李威(1980—),男,漢族,遼寧鞍山人,高級工程師,碩士研究生,研究方向:信息通信;何金(1983—),男,漢族,遼寧阜新人,高級工程師,本科,研究方向:信息通信;程蕾(1990—),女,漢族,遼寧凌源人,中級工程師,碩士研究生,研究方向:信息通信;柳璐(1992—),女,漢族,遼寧東港人,中級工程師,碩士研究生,研究方向:信息通信。