每秒幾十萬的大規模網路爬蟲是如何煉成的?

CSDN資訊發表於2019-02-20

640?wx_fmt=gif

【CSDN 編者按】資料時代,網路爬蟲似乎是每個程式設計師的必備技能,在他們的眼中“一切皆可盤”。通常情況下,Python 憑藉優秀的效能優勢更受到程式設計師的喜愛,不過在本文中,作者介紹了他們公司一個強大的分散式網路爬蟲驅動,由Java編寫的系統能夠每秒可以訪問幾十萬個網頁!

python小白到大牛系統學習指南:

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

 

640?wx_fmt=jpeg

作者 | Nariman Jelveh@Mixnode Technologies Inc.
譯者 | 彎月

責編 | 郭芮
出品 | CSDN(ID:CSDNnews)

以下為譯文:

我們公司Mixnode的背後由一個極其高效的分散式網路爬蟲驅動,每秒可以訪問幾十萬個網頁。雖然在使用Mixnode時,你從來不需要考慮有關網路抓取的東西,但還是有很多人詢問我們如何才能如此快速地抓取這麼多網頁。

 

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

 

640?wx_fmt=png

Java

 

在為專案選擇程式語言時,許多因素都會影響到你的最終決策。內部專業知識、生態系統和原始效能是我們在尋找“完美”的程式語言時必須考慮的主要標準。

 

最終,我們認為Java是我們的最佳選擇,原因如下:

 

  • 內部專業知識:因為我們的團隊擁有豐富的Java專業知識,特別是分散式系統和網路軟體開發方面的知識,所以我們可以立即開始開發高質量的軟體。

 

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

 

  • 現有的參考專案:Apache Hadoop、Apache Cassandra和Elasticsearch全都是用Java開發的大型分散式系統專案的例子,它們為這個生態系統帶來了豐富的專業知識、靈感和先例。當出現問題或有疑問時,通常我們都會發現曾有人經歷過相同或類似的情況。這建立了一個強大的網路,從而使得用Java開發高效能資料驅動應用程式的過程變得更加簡單且經濟實惠。

 

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

 

雖然我們的核心網路爬蟲引擎是用Java編寫的,但在為手頭的工作選擇程式語言時我們都很務實。例如,我們也使用其他語言(例如Python,Perl和Node.js)來編寫指令碼、配置、監視、報告和管道的其他部分。

 

640?wx_fmt=png

無共享架構

 

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

 

此外,無共享架構大大減少了節點之間的通訊開銷,從而為我們提供了額外的效能提升。

 

640?wx_fmt=png

速率限制模組必須保證安全

 

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

 

因此,每個網路爬蟲也有責任對自己的請求速率進行限制,換句話說,確保連續兩次訪問之間有適當的延遲。你需要對請求速率進行限制的三個最重要的標準是:主機名和IP地址。

 

很顯然,這項工作需要從一開始就做到盡善盡美。由於一個簡單的錯誤就可能對你正在抓取的網站造成破壞性的後果,所以不容許出錯。在多執行緒環境中,在跟蹤請求和速率限制引數時,你還應該格外小心以防止競爭。

 

640?wx_fmt=png

快取是王道

 

在構建大規模資料驅動的應用程式時,快取網路事務通常是不可避免的,至少在管道的某些部分如此,特別是當相較於其他任務網路輸入/輸出更頻繁且開銷更大的情況下。但是,在大規模網路爬取的情況下,快取不僅是不可避免的,而且是在編寫程式碼之前就需要考慮的事項。

 

大規模網路爬取的情況下,有兩個操作需要及時快取:

 

  • Robots.txt查詢:從某個主機上訪問的每個URL獲取該主機robots.txt檔案的全新副本幾乎是不可能的,因此,你需要構建一個分散式的預讀快取,能夠持有並定期更新數百萬個網站的robots.txt檔案。

 

  • DNS解析:對於絕大多數URL,你需要至少執行一次DNS解析才能下載,這會增加每秒數千次的查詢。因此,DNS伺服器必然會限制你的訪問,或者在過重的負荷下崩潰。無論是哪種情況都會導致爬蟲停止,唯一的解決辦法就是儘可能快取DNS解析結果,並最大限度地減少不必要的查詢。

 

640?wx_fmt=png

解析HTML

 

爬蟲的基本任務之一就是從它訪問的每個頁面中提取連結(即解析),以便將它們新增到需要訪問頁面的佇列中。如果你需要大規模的爬取,那麼最好有一個高效能的HTML解析器,因為你需要提取大量的連結和後設資料。

 

大多數HTML解析庫會優先考慮簡單性、易用性和通用性,一般來講這是正確的設計。由於我們需要高速的連結提取,所以最終我們決定編寫自己的解析器,並針對查詢連結和一些原始DOM的查詢功能進行了優化。

 

HTML解析器還需要具有彈性,經過全面的測試,並且能夠處理大量出現的異常情況,因為並非每個HTML文件都是有效的。

 

640?wx_fmt=png

網路優化

 

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

 

以下是我們經常會用到的有關該主題的一些有用的資源:

 

  • Linux網路效能引數

    https://github.com/leandromoreira/linux-network-performance-parameters

 

  • 優化Web伺服器,實現高吞吐量和低延遲

    https://blogs.dropbox.com/tech/2017/09/optimizing-web-servers-for-high-throughput-and-low-latency/

 

  • Red Hat公司Linux網路效能調整指南

    https://access.redhat.com/sites/default/files/attachments/20150325_network_performance_tuning.pdf

 

640?wx_fmt=png

小結

 

構建大規模網路爬蟲是一項長期的專案,也是一項複雜的工作。我們必須精心設計和測試不同的模組,同時還需仔細觀測和研究權衡利弊。許多我們日常使用的計算機軟體元件都無法在網路爬蟲的工作負載下正常執行,因此我們需要從頭開始設計,同時還需不斷審查和優化其他元件,才能適應不斷變化的不斷擴大的網路。

 

我們的網路級爬蟲經過了漫長的發展,才成為了成熟穩定的平臺,我們期待分享更多關於學習構建基礎架構的經驗教訓。

如何快速成為python全棧工程師?

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

原文:https://www.mixnode.com/blog/posts/lessons-learned-building-a-modern-massive-scale-web-crawler

本文為 CSDN 翻譯,如需轉載,請註明來源出處。

【完】

640?wx_fmt=jpeg

 熱 文 推 薦 

☞ 京東末位淘汰 10% 高管 ;聊天寶驚現大 Bug:使用者可提現百萬;鬥魚回應“人去樓空” | 極客頭條

那些被遺忘的碼農

告別相殺!物件導向和函數語言程式設計共存

那些簡歷造假拿 Offer 的程式設計師,後來都怎麼樣了?

被V神點贊, 我是如何用五子棋打敗以太坊排名最高的應用的? |人物誌

☞ 50個最有價值的資料視覺化圖表(推薦收藏)

一鍵免費自動AI摳圖,效果連PS大哥也點贊!

史上最難的一道Java面試題


 

print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"

640?wx_fmt=gif點選“閱讀原文”,開啟 CSDN App 閱讀更貼心!

640?wx_fmt=png喜歡就點選“好看”吧!

相關文章