分布式網絡數據抓取系統(tǒng)設計與實現(xiàn)

分布式網絡數據抓取系統(tǒng)設計與實現(xiàn)

1、分布式網絡數據抓取系統(tǒng)說明

(1)深入分析網絡數據(金融、教育单山、汽車類)爬蟲的特點碍现,設計了分布式網絡數據(金融、教育米奸、汽車類)系統(tǒng)爬取策略昼接、抓取字段、動態(tài)網頁抓取方法悴晰、分布式結構和數據存儲等功能辩棒。

(2)簡要說明分布式網絡數據(金融、教育膨疏、汽車類)抓取系統(tǒng)的實現(xiàn)過程一睁。包括爬蟲編寫、爬蟲避禁(各種反爬手段)佃却、動態(tài)網頁數據抓取者吁、數據存儲等內容

(3)對需要爬取的網絡數據的網站進行可定制化配置網頁模板,進行數據抓人撬А(暫時不考慮界面化)

2复凳、系統(tǒng)功能架構設計


系統(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值,然后到下載器進行下載草姻。


User-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ù)對相關部分進行完善俐芯。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末棵介,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吧史,更是在濱河造成了極大的恐慌邮辽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吨述,居然都是意外死亡岩睁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門揣云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捕儒,“玉大人,你說我怎么就攤上這事邓夕×跤ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵翎迁,是天一觀的道長栋猖。 經常有香客問我,道長汪榔,這世上最難降的妖魔是什么蒲拉? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮痴腌,結果婚禮上雌团,老公的妹妹穿的比我還像新娘。我一直安慰自己士聪,他們只是感情好锦援,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剥悟,像睡著了一般灵寺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上区岗,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天略板,我揣著相機與錄音,去河邊找鬼慈缔。 笑死叮称,一個胖子當著我的面吹牛,可吹牛的內容都是我干的藐鹤。 我是一名探鬼主播瓤檐,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娱节!你這毒婦竟也來了挠蛉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肄满,失蹤者是張志新(化名)和其女友劉穎碌秸,沒想到半個月后绍移,有當地人在樹林里發(fā)現(xiàn)了一具尸體悄窃,經...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讥电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧抗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩敌。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖横媚,靈堂內的尸體忽然破棺而出纠炮,到底是詐尸還是另有隱情,我是刑警寧澤灯蝴,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布恢口,位于F島的核電站,受9級特大地震影響穷躁,放射性物質發(fā)生泄漏耕肩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一问潭、第九天 我趴在偏房一處隱蔽的房頂上張望猿诸。 院中可真熱鬧,春花似錦狡忙、人聲如沸梳虽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窜觉。三九已至,卻和暖如春北专,著一層夾襖步出監(jiān)牢的瞬間禀挫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工逗余, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留特咆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓录粱,卻偏偏與公主長得像腻格,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啥繁,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容