1、分布式網絡數據抓取系統(tǒng)說明
(1)深入分析網絡數據(金融、教育单山、汽車類)爬蟲的特點碍现,設計了分布式網絡數據(金融、教育米奸、汽車類)系統(tǒng)爬取策略昼接、抓取字段、動態(tài)網頁抓取方法悴晰、分布式結構和數據存儲等功能辩棒。
(2)簡要說明分布式網絡數據(金融、教育膨疏、汽車類)抓取系統(tǒng)的實現(xiàn)過程一睁。包括爬蟲編寫、爬蟲避禁(各種反爬手段)佃却、動態(tài)網頁數據抓取者吁、數據存儲等內容
(3)對需要爬取的網絡數據的網站進行可定制化配置網頁模板,進行數據抓人撬А(暫時不考慮界面化)
2复凳、系統(tǒng)功能架構設計
分布式爬蟲抓取系統(tǒng)主要包含以下功能:
1.爬蟲功能:爬取策略的設計 、內容數據字段的設計灶泵、增量爬取育八、請求去重
2.中間件:反爬機制、ajax動態(tài)加載數據赦邻、爬蟲下載異常處理
3.數據存儲:抓取字段設計髓棋、數據存儲
3、系統(tǒng)分布式架構
?????? 分布式采用主從結構設置一個Master服務器和多個Slave服務器惶洲,Master端管理Redis數據庫和分發(fā)下載任務按声,Slave部署Scrapy爬蟲提取網頁和解析提取數據,最后將解析的數據存儲在同一個MongoDb數據庫中恬吕。分布式爬蟲架構如圖所示
???????? 應用Redis數據庫實現(xiàn)分布式抓取签则,基本思想是Scrapy爬蟲獲取的到的detail_request的urls都放到Redis Queue中,所有爬蟲也都從指定的Redis Queue中獲取requests铐料,Scrapy-Redis組件中默認使用SpiderPriorityQueue來確定url的先后次序渐裂,這是由sorted set實現(xiàn)的一種非FIFO、LIFO方式钠惩。因此柒凉,待爬隊列的共享是爬蟲可以部署在其他服務器上完成同一個爬取任務的一個關鍵點。此外妻柒,為了解決Scrapy單機局限的問題扛拨,Scrapy將結合Scrapy-Redis組件進行開發(fā),Scrapy-Redis總體思路就是這個工程通過重寫Scrapy框架中的scheduler和spider類举塔,實現(xiàn)了調度绑警、spider啟動和redis的交互求泰。實現(xiàn)新的dupefilter和queue類,達到了判重和調度容器和redis的交互计盒,因為每個主機上的爬蟲進程都訪問同一個redis數據庫渴频,所以調度和判重都統(tǒng)一進行統(tǒng)一管理,達到了分布式爬蟲的目的
4北启、系統(tǒng)實現(xiàn)
4.1卜朗、爬取策略的設計
?????? 由scrapy的結構分析可知,網絡爬蟲從初始地址開始咕村,根據spider中定義的目標地址獲的正則表達式或者Xpath獲得更多的網頁鏈接场钉,并加入到待下載隊列當中,進行去重和排序之后懈涛,等待調度器的調度逛万。
?????? 在這個系統(tǒng)中,新的鏈接可以分為兩類批钠,一類是目錄頁鏈接宇植,也就是我們通常看到的下一頁的鏈接埋心,一類是內容詳情頁鏈接指郁,也就是我們需要解析網頁提取字段的鏈接,指向的就是實際的頁面信息拷呆。網絡需從每一個目錄頁鏈接當中闲坎,提取到多個內容頁鏈接,加入到待下載隊列準備進一步爬取洋腮。爬取流程如下:
?????? 此處是Master端的目標鏈接的爬取策略箫柳,因為采取的分布式主從模式,Master端爬蟲主要爬取下載到內容詳情頁鏈接啥供,通過redis分享下載任務給其他slave端的爬蟲。Slave端主要是負責對詳情頁鏈接的進一步解析提取存儲到數據庫中库糠。
1)?對于Master端:
最核心模塊是解決翻頁問題和獲取每一頁內容詳情頁鏈接伙狐。Master端主要采取以下爬取策略:
1.?向redis往key為next_link插入初始鏈接,從初始頁鏈接開始
2.?爬蟲從redis中key為next_link中取到初始鏈接瞬欧,開始運行爬蟲
3.?將下載器返回的Response,爬蟲根據spider定義的爬取規(guī)則識別是否有下一頁鏈接贷屎,若有鏈接,存儲進redis中艘虎,保存key為next_link唉侄,同時根據匹配規(guī)則是否匹配到多個內容詳情頁鏈接,若匹配到野建,則存儲進Redis,保存key為detail_request插入下載鏈接属划,給slave端的spider使用恬叹,即是Slave端的下載任務。
4.?爬蟲繼續(xù)從redis中key為next_link取值同眯,若有值绽昼,繼續(xù)步驟2,若為空须蜗,爬蟲則等待新的鏈接硅确。
2)?對于Slave端:
最核心模塊是從redis獲得下載任務,解析提取字段明肮。Slave端主要采取以下爬取策略:
1.爬蟲從redis中key為detail_request中取到初始鏈接菱农,開始運行爬蟲
2.將下載器返回的Response,爬蟲根據spider定義的爬取規(guī)則識別是否有匹配規(guī)則的內容字段,若有將字段存儲柿估,返回到模型中大莫,等待數據存儲操作。
重復步驟1官份,直到帶爬取隊列為空只厘,爬蟲則等待新的鏈接。
4.2爬蟲的具體實現(xiàn)
?????? 爬蟲程序的包含四個部分舅巷,分別是對象定義程序羔味,數據抓取程序,數據處理程序和下載設置程序钠右,此處的組成是Slave端赋元,Master少了對象定義程序以及數據處理程序,Master端主要是下載鏈接的爬取飒房。
數據抓取程序:
??? 數據抓取程序分Master端和Slave端搁凸,數據抓取程序從Redis中獲得初始地址,數據抓取程序中定義了抓取網頁的規(guī)則和使用Xpath提取字段數據的方法狠毯、css selector選擇器提取數據的方法等
4.3去重與增量爬取
?????? 去重與增量爬取护糖,對于服務器有很重大的意義,能夠減少服務器的壓力以及保證數據的準確性嚼松。如果不采取去重處理嫡良,那么抓取的內容會抓取大量重復內容,讓爬蟲效率極大的下降献酗。其實去重流程很簡單寝受,核心就是每次請求的時候,先判斷這個請求是否在已經爬取的隊列當中罕偎。如果已存在很澄,則舍棄當前請求。
具體實現(xiàn)步驟:
(1)?從待爬隊列中獲取url
(2)?將即將請求的url判斷是否已經爬取,若已爬取甩苛,則將請求忽略蹂楣,未爬取,繼續(xù)其他操作并將url插入已爬取隊列中
(3)?重復步驟1
4.4爬蟲中間件
?????? 爬蟲中間件能夠幫助我們在scrapy抓取流程中自由的擴展自己的程序浪藻,以下有爬蟲防屏蔽中間件捐迫,下載器異常狀態(tài)中間件以及非200狀態(tài)中間件。
(1)爬蟲防屏蔽組件的實現(xiàn)
?????? 訪問一個網站的網頁的時候爱葵,會給網站帶了一定的負載施戴,而爬蟲程序則是模擬了我們正常訪問網頁的過程,但是萌丈。大規(guī)模的爬蟲會給網站增加大量的負載赞哗,影響正常用戶的訪問。為保證網頁能夠別大多數正常用戶的訪問辆雾,大多數網站都有相應的防爬蟲策略肪笋。一旦訪問行為被認定為爬蟲,網站將會采取一定的措施度迂,限制你的訪問藤乙,比如提示你,訪問過于頻繁讓你輸入驗證碼惭墓,更嚴重者坛梁,會封掉你的ip,禁止你訪問該網站腊凶。本系統(tǒng)定向抓取網頁數據的時候划咐,將不間斷的訪問網站內容,如果不采取偽裝措施钧萍,很容易被網站識別為爬蟲行為而屏蔽掉褐缠。
本系統(tǒng)采用以下方法來防止爬蟲被屏蔽:
1.?模擬不同的瀏覽器行為
2.?以一定的頻率更換代理服務器和網關
3.?降低爬蟲爬取網頁的頻率,減少并發(fā)爬取的進程风瘦,限制每個ip并發(fā)爬取的次數队魏,犧牲一定的效率來換取系統(tǒng)的穩(wěn)定性。
4.?禁用cookie弛秋,網站會在用戶訪問時在cookie中插入一些信息來判斷是否是機器人器躏,我們屏蔽調cookie,也有利于我們的身份不容意暴露蟹略。
爬蟲防網站屏蔽原理如下圖所示:
(a)模擬不同瀏覽器行為實現(xiàn)思路及代碼
原理: scrapy有下載中間件,在這個中間件我們可以對請求跟響應進行自定義處理遏佣,核心就是對請求的屬性進行修改
首先主要是對下載中間件進行了擴展挖炬,首先在seetings.py上面增加中間件,擴展中間件状婶,主要是寫一個user-agent列表意敛,將常用的瀏覽器請求頭保存為一個列表馅巷,再讓請求的頭文件隨機在列表中取一個agent值,然后到下載器進行下載草姻。
綜上钓猬,每次發(fā)出請求的時候模擬使用不同的瀏覽器對目標網站進行訪問。
(b)使用代理ip進行爬取的實現(xiàn)思路撩独。
首先在settings.py上面增加中間件敞曹,擴展下載組件請求的頭文件隨機從代理ip池中取出一個代理值然后到下載器進行下載。
1.?代理ip池的設計與開發(fā)流程如下:
a.?對免費代理ip網站進行抓取综膀。
b.?對代理ip進行存儲并驗證
c.?驗證通過存儲進數據庫
d.驗證不通過的則刪除
(c)爬蟲異常狀態(tài)組件的處理
?????? 爬蟲沒有被屏蔽運行時澳迫,訪問網站不是一直都是200請求成功,而是有各種各樣的狀態(tài)剧劝,像上述爬蟲被禁的時候橄登,其實返回的狀態(tài)是302,防止屏蔽組件就是捕捉到302狀態(tài)加以實現(xiàn)的讥此。同時異常狀態(tài)的處理有利于爬蟲的健壯性拢锹。
在settings中擴展中間件捕捉到異常的情況之后,將請求Request重新加入到待下載隊列當中流程如下:
(d)數據存儲模塊
數據存儲模塊主要負責將slave端爬取解析的頁面進行存儲萄喳。使用Mongodb對數據進行存儲卒稳。
Scrapy支持數據存儲的格式有json,csv和xml等文本格式取胎,用戶可以在運行爬蟲時設置展哭,例如:scrapy crawl spider
-o items.json -t json,也可以在Scrapy工程文件額ItemPipline文件中定義,同時闻蛀,Scrapy也支持數據庫存儲匪傍,如Mongodb,Redis等觉痛,當數據量大到一定程度時役衡,可以做Mongodb或者Reids的集群來解決問題,本系統(tǒng)數據存儲如下圖所示:
5.總結
以上就是分布式網絡數據抓取系統(tǒng)設計部分薪棒,采用分布式的設計是因為單機爬蟲的爬取量和爬取速度的局限性手蝎,這是V1.0版本,后續(xù)將會繼續(xù)對相關部分進行完善俐芯。