每秒採集幾十萬資料的大規模分散式爬蟲是如何煉成的?

思通數科x發表於2022-04-16

在大資料時代,資料採集或網路爬蟲似乎是每個程式設計師的必備技能,一般情況下,工程師會通過Python爬蟲框架快速的編寫出爬蟲程式對網頁資料抓取,不過在大規模資料採集的時候就不是一個簡簡單單的爬蟲程式了。例如,分散式爬蟲系統,在為我們的輿情繫統(gitee.com/stonedtx/yuqing)開源情報系統(gitee.com/stonedtx/open-source-intelligence) 提供大量的資料支撐。

在此,向大家介紹我們由Java編寫的系統能夠每秒可以訪問幾十萬個網頁的分散式網路爬蟲系統!

在這篇文章中,將與大家分享多年來我們在構建與優化爬蟲方面所獲得的經驗以及教訓。

這是我們大規模分散式爬蟲系統的系統(操作介面),自己稱之為:爬蟲工廠。

這是我們即將上線“開源情報”系統裡的“資料管理” (資料中臺)子系統。

經過這麼多專案的實戰經歷和經驗,同時與市場和客戶不斷的碰撞,造就了我們強大的資料採集能力。

一、程式語言
在為專案選擇程式語言時,許多因素都會影響到我們的最終決策。中間我們嘗試過python和Go語言的爬蟲和分散式爬蟲的方案。我們在內部專業知識、生態系統,這幾個方面尋找“完美”的程式語言方案。最終,我們認為Java是我們的最佳選擇,原因如下:

1.內部專業知識:我們的團隊成員擁有豐富的Java專業知識,有好幾個Java開發“老司機”都是10年、15年、20年的經驗,他們都在分散式系統和網路高併發、海量資料儲存開發方面有豐富的實戰經驗。

2.現有軟體框架:大規模的網路爬蟲需要建立在久經考驗的強大、可擴充套件且安全的網路、系統和實用程式模組之上。Java擁有最活躍的開源生態系統,特別是在網路和分散式應用程式方面。Netty、SpringBoot和Google Guava等軟體包證明Java生態系統擁有高質量的開源模組。

3.現有的專案整合:Hadoop、Cassandra、Kafka、Elasticsearch全都是用Java開發的大型分散式系統專案,因為這個生態系統給我們帶來了豐富又強大的基礎以及靈感和先例。從而使得用Java開發高效能資料驅動應用程式的過程變得更加簡單且經濟實惠。

4.Java的動態語言:在我們最新的分佈爬蟲系統中採用了動態語言,我們把動態語言程式碼通過模板生成,並儲存在MySQL中,這樣對大量的爬蟲通過視覺化和低程式碼的方式大大降低的維護成本和爬蟲開發成本。

5.原始效能和可靠性:在效能和可靠性方面,Java擁有靜態型別,強大的垃圾收集以及久經實戰考驗的虛擬機器等最重要的特性。

雖然核心網路爬蟲引擎是用Java編寫的,我們也使用其他語言(例如Python和Node.js)來編寫自然語言處理、深度學習演算法、監視、報告和管道的其他部分的子系統。

我們的分散式爬蟲叢集採用了無單點的架構,工作負載在獨立的無狀態節點上進行分割和分佈,這可以消除大規模分散式系統的災難(單點故障)。另外,該架構允許我們逐個節點更新和升級底層軟體,而不會中斷整個操作。


二、請求速率與訪問安全
網站的主要設計目的是供人類訪問,一位普通使用者每分鐘只能瀏覽很少的頁面。網路爬蟲每秒能夠訪問數千甚至數百萬個網頁,因此,如果不小心,網路爬蟲很容易在很短的時間內耗盡網站資源,造成破壞性的後果。而且,一個普通的網站會有多個機器人同時抓取,所以這個問題會被放大。

因此,每個網路爬蟲也有責任對自己的請求速率進行限制,換句話說,確保連續兩次訪問之間有適當的延遲,這項工作不容許出錯,否則對請求網站和自己都會產生不利的反應。


三、快取為王道
在構建大規模分散式資料應用系統的情況下,系統快取是必不可少的,特別是網路輸入&輸出頻繁且開銷更大的情況下。
例如場景1:在大規模網路爬取的情況下,為了避免資料重複抓取以及後續的資料重複處理,那麼就需要把每個URL獲取,並且儲存下來。因此,你需要構建一個分散式的預讀快取,能夠持有並定期更新數百萬個網站的上億的URL地址倉庫。
例如場景2:減少dns的請求,提高資料採集的效能。對於絕大多數URL,你需要至少執行一次DNS解析才能下載,這會增加每秒數千次的查詢。因此,DNS伺服器必然會限制你的訪問,或者在過重的負荷下崩潰。無論是哪種情況都會導致爬蟲停止,唯一的解決辦法就是儘可能快取DNS解析結果,並最大限度地減少不必要的查詢。


四、解析HTML
爬蟲的基本任務之一就是從它訪問的每個頁面中提取所需要的資料。如果大規模的資料爬取,那麼最好有一個高效能的HTML解析器,因為你需要提取大量的連結和後設資料。大多數HTML解析庫會優先考慮簡單性、易用性和通用性,一般來講這是正確的設計。由於我們需要高速的連結提取,所以最終我們決定編寫自己的解析器,並針對查詢連結和一些原始DOM的查詢功能進行了優化。HTML解析器還需要具有彈性,經過全面的測試,並且能夠處理大量出現的異常情況,因為並非每個HTML文件都是有效的。

我們目前即將開源的資料採集系統,裡面整合了微軟開源playwright(https://playwright.dev)的js渲染解析引擎。這樣在開發爬蟲的過程中我們就不需要去考慮js網頁資料的問題了,大大提高了我們對網站爬蟲的開發效率。


五、網路與系統的優化
通常作業系統的預設配置無法處理大規模網路爬蟲的網路需求。通常我們需要根據具體情況,優化作業系統的網路堆疊,使其發揮最大潛力。對於大規模的網路爬蟲來說,優化的目標在於最大化吞吐量和開啟連線的數量。

以下是我們經常會實際遇到需要優化的問題和場景:

1.Linux系統效能引數
一般Linux效能調優都用什麼工具? - 知乎

2.Web伺服器效能優化
java web伺服器效能優化策略? - 知乎

3.Java JVM效能優化
Java效能優化之JVM GC(垃圾回收機制) - 知乎

開源專案地址:

   目前我們已經將上述技術實踐開源,請關注我們釋出的開源專案。
  開源免費輿情監測網路監控系統: 思通輿情 是一款開源免費的輿情繫統,支援本地化部署。支援對海量的輿情資料進行交叉分析和深度挖掘,為使用者提供全面的輿情資料,專業的輿情分析,快速的輿情處理等服務,提升企業品牌價值和風控能力。#輿情繫統#輿情監測#網路輿情#開源輿情#免費輿情#輿情分析icon-default.png?t=M3C8https://gitee.com/stonedtx/yuqing  

相關文章