大規模數據抓取架構設計
來自專欄 Python數據5 人贊了文章
本文首發微信公眾號 pydatame 作者 陸建強
向讀者們問好。
工作了之後,時間不如自由時候多,再加上最近支撐618業務需求,好久沒更新了,請大家諒解一下~
今天分享的內容是系統架構設計方面的,會基於Python語言給出技術棧選型建議,但是不會深入到代碼細節上。
大系統設計,我覺得最應該強調的概念就是解耦,每一部分都專註做此部分需要解決的問題,然後通過各種方式結合起來,形成一個完整的系統。
這裡提到的各種方式,隊列應該會佔據比較大的比例,包括消息隊列、任務隊列。其次資料庫也可以作為耦合各子系統的媒介。RPC調用也是一種方式。文件的話用的就很少了,內存中傳遞數據的方式也存在很多問題。
好了,帶著」解耦「這個概念,開始看大規模抓取的架構設計。先宏觀上介紹一下。
第一部分,我們需要知道要採集哪些網站,進一步說,知道要採集哪些網址對應的內容。稱為,分發(dispatcher)。
第二部分,我們需要把指定URL的內容採集下來。稱為,爬蟲(spider或者crawler)。
第三部分,需要把採集下來的HTML內容或者JSON內容按照一定的規則做解析,解析出想要的各欄位。稱為,解析(parse)。
第四部分,解析後的數據要保存到資料庫。稱為,保存(save)。
額外的部分,統計、監控和報警。
下面分開詳細講每部分會涉及的內容以及技術棧推薦。
分發:需要有一批URL,這些URL可以是已經通過非技術方式收集的,也可以是」解析「模塊返回的。很常見的場景是我需要博客的文章詳情,那麼我會先把文章首頁當做第一批任務,然後返回給我列表頁的URL,把列表頁URL當第二批任務,返迴文章詳情頁的URL,然後把文章詳情頁的URL當第三批任務,再去採集。這邊技術棧的話就是伺服器端框架,建議Flask或者Django,個人傾向於Flask,因為輕量,高度可定義。
聽到這你別噴我把這麼簡單的事情複雜化。比如你說可以在scrapy中寫三個回調函數解決整個博客的全站抓取問題。那考慮下這個網站博文有1M篇,單機就不行了吧,考慮分散式了吧,每台機器處理哪些任務呢?任務怎麼分配等等問題在簡單的系統里根本沒法擴展。哦,你還可以跟我說,用scrapy-redis解決任務分配問題,再拋個需求:周期調度,優先順序控制採集頻率、出錯重試。新增一個網站也是要重寫一套解析代碼的,當然這個問題是沒法避免的,不過我後面會提出優化的方式。
爬蟲:本身的任務比較簡單,就一個GET請求。不過要考慮到帶Cookie訪問,切換IP放封禁,再加上像淘寶這種的Cookie和IP是綁定在一起的,還需要額外處理。像登錄態之類的維持,又是另外一個話題,也是支撐爬蟲順利工作的必要條件。還有像今日頭條系的產品還會對請求參數加密,不過這塊應該屬於任務的規則,在分發時候完成。技術棧,建議Scrapy,因為可以用middleware處理cookie或者IP問題,不然用aiohttp之類的需要手動維護cookie等。
解析:為什麼考慮把爬蟲和解析分開呢,解析速度肯定是比抓取速度快很多的,大概一台解析伺服器大概能支撐幾十台爬蟲伺服器返回的請求。另外更重要的一個原因,像scrapy或者簡單的requests等,解析邏輯都是用代碼寫好的,就是說新增一種類型的網址,就要重新用re、bs4、xpath等實現一份解析規則。我的做法呢,寫了一個解析引擎,通過配置語言無關的解析模板,實現解析。給大家提供這種思路,就是把解析邏輯從代碼中抽離出來,因為寫符合規範的解析模板成本比寫解析代碼低得多。推薦用我寫的parse-conf解析引擎,不需要寫強耦合語言中的代碼實現各欄位解析。
保存:這邊主要考慮寫速度,如果我用爬蟲集群去下載數據,寫性能會是整個系統的瓶頸。推薦Hbase,寫性能好一些,不過掃描速度會慢。下面還會提到如何解決寫瓶頸的問題。
再說一下各部分之間的關聯,建議用kafka做消息隊列去關聯各子系統。不推薦rabbitMQ等傳統消息隊列的原因主要是考慮高吞吐量。因為是消費者是拉模式,所以充分發揮消費者的性能的同時,也不會出現因數據量大下游處理端無法支撐的問題。
統計、監控和報警:分兩方面做,一方面是實時的,一方面是離線的。像爬蟲返回結果非200的情況,以及無法解析的情況,還有Cookie失效,代理IP失效等情況,這種是要及時告訴分發端,要求它重新投遞任務。基於日誌的離線分析可以實現統計、監控和報警的需求。技術棧推薦用Flume、kafka、ElasticSearch。當然Logstash也可以考慮,沒做推薦的原因還是考慮數據規模的問題,Flume比Logstash強在吞吐上。Logstash強項是日誌欄位的解析。
上文提到的parse-conf模板解析引擎可以從知識星球[數據]獲取。
下面是推廣,都是技術相關:
數據交流微信群(免費),付費微信群,知識星球[數據]。
加我微信(公眾號內獲取),註明需求。
本公眾號二維碼:
http://weixin.qq.com/r/ii8lPdDEHI1jrZRe93qY (二維碼自動識別)
數據交流微信群,可以交流包括但不限於數據抓取、數據分析、數據挖掘、大數據等內容。嚴格禁止廣告、無意義推廣和邀請鏈接。
付費微信群:
- 有我的朋友們,其中有在讀牛津大學、香港大學、香港中文大學、清華大學等高校數學、計算機以及金融專業的博士,也有業界騰訊、小米、百度、今日頭條各崗位的工程師。
- 群友免費提供的各種資源,比如:微軟企業用戶帳號(免費ofiice系列、onedrive大容量、outlook企業郵箱等),EDU郵箱接收學生專屬福利,提供VPS做開發、測試,超低價商品優惠信息線報,京東免郵券,不定時現金紅包。
知識星球:
https://t.zsxq.com/aiYzByV (二維碼自動識別)
推薦閱讀:
※「數據故事」的兩大危險信號
※關於冒險島2傷害公式的驗證
※2018年世界十大強國GDP排名,中國大數據力壓日本,僅次於美國
※Stata之動態面板數據操作
※匯法,正在引爆在線法律服務的大數據?