如何構建爬蟲代理服務?

dellagaoyx 8年前發布 | 26K 次閱讀 Squid 數據庫 網絡爬蟲

起因

做過爬蟲的人應該都知道,抓的網站和數據多了,如果爬蟲抓取速度過快,免不了觸發網站的防爬機制,幾乎用的同一招就是封IP。解決方案有2個:

  • 1、同一IP,放慢速度(爬取速度慢)

  • 2、使用代理IP訪問(推薦)

第一種方案犧牲的就是時間和速度,來換取數據,但是一般情況下我們的時間是很寶貴的,理想情況下是用最短的時間獲取最多的數據。所以第二種方案是推薦的,那么從哪里能找到這么多代理IP呢?


尋找代理

程序猿不懂的時候就去尋找嘛,google、度娘,輸入關鍵字:免費代理IP,前幾頁幾乎都是提供代理IP的網站,一一打開后觀察發現,幾乎都是一個列表頁,展示少則幾十、多至幾百個IP。

但是仔細觀察你就會發現,每個網站提供的免費IP是有限的,拿來用幾個就會發現,有的也已經失效了。當然,他們更傾向于你購買人家的代理,人家就靠這個賺錢嘛。

身為狡猾的程序猿,當然不能因為這點困難就跪了,仔細想一下,既然搜索引擎能搜到這么多提供代理的網站,每個網站提供幾十或幾百個,假如有10家網站,那加在一起也有幾百到幾千個IP。

那么好了,你要做的事情就是,把這些網站記錄下來,用程序把IP抓過來就好了,想想是不是很簡單?

測試代理

通過剛才的方式,應該可以獲得幾百或上千的代理IP了。

等等,這么多IP,難道別人真的就免費送給你了么?當然不是,前面也提到過,這些代理中,有很大一部分已經是失效的了。那么怎么辦?如何知道哪些代理是有效,哪些是不可用的呢?

很簡單,掛上這些代理,訪問某一個穩定的網站,然后看是否能正常訪問,可以正常訪問的就是可用的,不能訪問的不就是無效的嘛。

最快速的,用curl命令就可以測試某個代理是否可用:

# 使用代理 48.139.133.93:3128 訪問 網易首頁
curl -x "48.139.133.93:3128"
"http://www.163.com"

當然,這種方式只是為了演示方便,實際最好的方式是: 
用多線程方式,使用代理去訪問某個網站,然后輸出可用的代理。 
這樣做能最快速的找出可用代理。

使用代理

現在已經可以通過上面的方式,找出可用的代理了,如果應用到程序中,應該不用我多說,大部分都應該會用了。 
例如,剛才把可用的代理輸入到某個文件中,每一行是一個代理,那么就可以這樣使用:

  • 1、讀取代理文件

  • 2、隨機選擇代理IP,發起HTTP請求

這樣,如果代理有幾百個,基本上可以保持一段時間抓取某個網站的數據了,抓個幾千幾萬條數據不成問題。

但是,如果我想持續不斷的從某個網站獲取數據,或者是抓取上百萬甚至上億的網頁數據,那這樣肯定是不行的。

持續不斷供應代理

剛才的方式是,一次性抓取某幾個代理網站,然后通過程序測試每個代理是否可用,得到可用的代理列表。但是這只是一次性的,而且代理量往往很少,在持續抓取中肯定無法滿足需要。那么怎么能持續不斷的找到可用代理呢?

  • 1、找到更多的代理網站(數據基礎)

  • 2、定時監控這些代理網站,獲取代理

  • 3、拿到代理IP后,程序自動檢測,輸出可用代理(文件或數據庫)

  • 4、程序加載文件或數據庫,隨機選取代理IP發起HTTP請求

按照上面的方式,可以寫出一個自動采集代理的程序,然后爬蟲端就可以定時去文件/數據庫中獲取然后使用就可以了。但是有一個小問題,怎樣知道每個代理的質量如何?也就是說,代理的速度怎么樣?

  • 1、在檢測代理時,記錄請求響應時間

  • 2、響應時間從短到長,加權重值,響應短的使用率高一些

  • 3、限制某段時間內最大使用次數

前面幾點只是基礎,這3點可以進一步優化你的代理程序,輸出有優先級的代理列表,爬蟲端根據權重和最大使用次數使用代理。這樣做的好處:保證使用高質量代理,同時防止某一代理頻繁使用防止被封。


 

服務化

上面經過一系列的完善和優化,已經搭建好了一個可用的代理服務,只不過是基于文件系統或數據庫的。

爬蟲端要想使用這些代理,只能是讀取文件或讀取數據庫,然后根據某種規則選擇代理使用,這樣做比較繁瑣,能不能讓爬蟲端使用代理變得簡單一些?那么就需要把代理訪問做成服務化。

有個大名鼎鼎的服務器軟件squid,利用它的cache_peer鄰居代理機制,就可以幫這個事情做的很完美。

把代理列表的代理,按照squid的cache_peer機制按照一定格式,寫在配置文件中即可。

squid是個代理服務器軟件,一般情況下是這樣使用的,假如爬蟲在機器A,squid安裝在機器B,需要爬取的網站服務器是機器C,代理IP是機器D/E/F…

  • 1、不使用代理:爬蟲機器A請求 —> 網站機器C

  • 2、使用代理:爬蟲機器A —> 代理IP機器D/E/F/... —> 網站機器C

  • 3、使用squid:爬蟲機器A—>squid(機器B,cache_peer機制管理調度代理D/E/F) —> 網站機器C

這樣做的好處就是:爬蟲端不用考慮如何加載和選擇可用代理,給出一個代理列表給squid,按照配置文件的規則,它就可以幫你管理和調度選擇代理。最重要的是,爬蟲端使用代理只需訪問squid的服務端口就可以了!

進一步整合

現在服務化也搭建完成了,唯一差得一步就是整合:

  • 1、定時監控代理源網站(30分/1小時都可),解析出所有代理IP,入數據庫

  • 2、從數據庫中取出所有代理,訪問某個固定的網站,找出訪問成功的代理,更新數據庫可用標記和響應時間

  • 3、從數據庫中加載所有可用代理,通過某種算法,根據響應時間計算使用權重和最大使用次數

  • 4、按照squid的cache_peer格式,寫入配置文件

  • 5、重新加載squid配置文件,刷新squid下的代理列表

  • 6、爬蟲指定squid的服務IP和端口,進行純粹的爬取操作

一個完整的代理服務通過這樣的方法就可以搭建完成,定時輸出高質量代理。爬蟲端不用關心代理的采集和測試,只管使用squid的統一服務入口爬取數據即可。

 

 

來自:http://mp.weixin.qq.com/s?timestamp=1480384968&src=3&ver=1&signature=Og1oc-BdYOt3qKBuT6qH*llkQCJ3kgpYudghF-lAJdaKn9NakIuLKqA8fmGD*uzLVVwLg*zS0UH-3HDCz6XhO99PXE*B1TWwZH7RfAlQUBe*-7KmXNkbxjlXVtNDLwfON8NmDE*-8FTHRAy2zKNkfpd3i5*idYqMzsrDSqCfcYA=

 

 本文由用戶 dellagaoyx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!