大規模爬蟲為什麼要管理DNS快取

王平發表於2019-06-20

10年前學爬蟲看的第一個開源爬蟲叫Larbin ,一個法國程式設計師用c++開發的,那時用Larbin簡單配置一下,因為它能自動遍歷抓取,一天幾乎能映象一箇中型網站,感嘆實在高效,但是那會不懂為什麼爬蟲要有一個dns模組,一是因為那會自己網路知識的匱乏,二是沒有感受過超大規模抓取,對dns快取節省的域名解析時間沒有感覺。

感受過大規模抓取後,對涉及到網路效能的每個點都想要極大優先,對域名解析到IP這個過程的時間消耗自然不能放過。

今天的話題就是說道:大規模爬蟲為什麼要管理DNS快取?

大規模爬蟲為什麼要管理DNS快取

DNS是什麼?

DNS是一個域名解析服務,負責解析域名對應的IP。我們在訪問網站時都是在瀏覽器裡輸入的一個個域名,但是在網路傳輸協議中都只是認一個個IP,所以在輸入域名的時候,先要做域名解析,這就是DNS要做的事情。

可以簡單的把訪問網頁看成如下這樣:

DNS解析

 

DNS具體是怎麼把域名解析成IP的?

有專門的DNS服務商,這些服務商通常就是電信運營商,比如中國電信這樣的。系統會訪問DNS服務商的IP,獲得對應域名的IP。DNS服務商的IP我們很熟悉,最為大家所熟知的就是114.114.114.114,在你的電腦上可以檢視你的DNS伺服器IP是多少。

檢查DNS伺服器的IP

DNS服務商那裡有一份域名對應IP的列表,它會把域名的IP返回給系統。

 

DNS解析耗時嗎?

相對於請求下載網頁的時間,DNS解析的耗時是很少的。通常是幾十毫秒。但是因為訪問一個IP的時候,會在不同的路由節點間跳轉,有可能要跳轉很多次才能路由到IP對應的機器上,所以有的DNS解析會耗時數百秒乃至數秒時間。

我們可以在Chrome瀏覽器的開發者工具中簡單測試下DNS解析耗時,下面是訪問一個網站Chrome記錄的各項耗時,紅框出DNS Lookup就是耗時151.59毫秒,這個耗時還算長的了。(因為瀏覽器和作業系統本身可能要做DNS快取,所以你訪問測算出的DNS耗時可能非常的短)

dns解析耗時

如果每次訪問都要做一次DNS解析,那我們一天要抓取一千萬張網頁,就算每次解析只耗時30毫秒,一千萬次抓取光做DNS解析就要30萬秒=3.47天。這是非常浪費的。

PS:Linux下面也可以使用dig命令來檢視dns解析耗時:

dig www.yuanrenxue.com

用dig命令檢查dns解析耗時

Query time就是dns的解析耗時,89毫秒。

 

為什麼要做DNS快取?

上面我們算過當大規模抓取,每次都要做DNS解析時,浪費的時間是非常大的。所以如果能在本地做DNS快取,每次系統都讀本地DNS的話,這個時間消耗估計是微妙級別,是能夠接受的。其實Windows本身是有DNS快取機制的,訪問一個域名後,系統會快取下域名對應的IP。我們的爬蟲通常是執行在Linux上的,Linux本身一般是沒有DNS快取的。

 

如何做DNS快取?

一種最簡單的方法就是修改/etc/hosts檔案,在檔案裡直接新增IP和域名,這樣:

hosts檔案做dns解析

但是如果域名很多,一個一個手動新增比較繁瑣,萬一對方IP改變了,那就會大面積抓取錯誤。

另一種方法使用DSN快取工具,諸如DNSmasq ,是一個小巧的DNS管理工具,配置方便,當你訪問過一個域名後,就會把域名對應的IP快取起來。一種自助式的,你配置好了就行,用起來挺方便。

第三種方法就是我開篇提到的,像Larbin爬蟲一樣,在自己的爬蟲程式中新增一個DNS模組,自己管理DSN快取。好處是不依賴其它的工具。像Scrapy爬蟲框架就有自己的DNS快取管理模組。感興趣的可以去看它原始碼是如何實現的。

把dns管理加到我在猿人學Python寫的《如何讓爬蟲一天抓取100萬張網頁》中就更加如虎添翼了。

話說有道面試題叫著《從瀏覽器輸入url到看到頁面》這裡面發生了什麼,如果你能弄懂裡面的細節的話,在網路優化上還有一些優化空間,並且還能找到一些反反爬的竅門。

當然抓取規模比較小的話,其實DNS解析這點浪費時間沒多少,當抓取規模很大時,你拿筆算一下浪費的時間,嘩嘩的。

 

還是廣而告知:

我最近在教學爬蟲:

一對一教學Python爬蟲,學會如何設計抓取海量資料的爬蟲;

學會如何高效分析/制定抓取策略;

學會APP/JS逆向;

傳授我用爬蟲技術的掙錢經驗,我的職場經驗。

全以實戰為主,學完能自己真實動手開發那種。

在猿人學Python公眾號選單欄-聯絡我,找到我的微信

 

爬蟲相關精彩文章:

大規模非同步新聞爬蟲的分散式實現

如何讓爬蟲一天抓取100萬張網頁

大規模非同步新聞爬蟲的實現思路

爬蟲技巧:逆向破解js程式碼加密,程式碼混淆不是難事

爬蟲掙錢系列:資料整合之–結構化人名的機會

爬蟲小偏方系列:robots.txt快速抓取網站的小竅門

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章