分布式ip代理池,具有高可用性,趕緊試試吧!用了大概兩個月的時間,到現在為止,高可用的分布式代理IP池(https://github.com/SpiderClub/haipproxy)終于完成了,現在在Github上開源。寫這個項目主要有兩個原因。第一,我的部分工作通常需要和網絡爬蟲打交道,代理IP有時候可以起到非常重要的作用。我調查過一些開源的代理IP收集程序,發現在抓取、解析、檢查、資源調度等方面總有不盡如人意的地方。第二,與一位網友(不嚴格地說是伯樂)的交流,讓邊肖有了一些用Scrapy編寫分布式網絡爬蟲的想法,而這恰好是一個嘗試驗證這些想法的機會。
結構化
本文的目的是解釋haipproxy的主要架構和流程。項目模塊是
一個基于Scrapy和Redis的分布式網絡爬蟲,用于IP抓取和檢查,對應項目的爬蟲。
基于Redis實現的分布式任務調度工具,對應于項目的調度器和redis_util.py
爬蟲分為代理抓取和驗證,實現思路類似。它主要是利用Scrapy的spider_idle信號和DontCloseSpider異常來防止Scrapy在沒有數據時關閉。靈感來自Scrapy-redis(https://github . com/rmax/Scrapy-redis)。
啟動調度程序,包括代理爬蟲調度程序和驗證爬蟲調度程序。調度器會讀取rules.py中要抓取的網站,并整理成任務,存放在各個任務隊列中。
啟動每個網絡爬蟲,包括IP抓取和驗證程序。項目中的網絡爬蟲和調度器具有很高的可用性,可以根據實際情況分布式部署,無需修改代碼。由于本文的目標不是編寫該項目的詳細使用文檔,因此省略了指定啟動網絡爬蟲類型和調度器類型的介紹。
IP采集爬蟲啟動后,會從相應的任務隊列中獲取任務并執行,然后將獲取的結果存儲在一個init隊列中。
init隊列由一個特殊的驗證器HttpbinInitValidator使用,該驗證器過濾掉透明代理,然后將可用的代理輸入到每個經過驗證的隊列中。
調度程序將定期從經驗證的隊列中獲取代理IP,并將其存儲在臨時隊列中。這里,臨時隊列用于使驗證更加公平。如果直接從已驗證的隊列中獲取資源進行驗證,會增加不公平性。
此時,每個驗證者(非init驗證者)都會從對應的臨時隊列中獲取待驗證的IP并進行驗證,此處省略驗證細節。
驗證完成后,將其放回已驗證的隊列中,等待下一輪驗證。
請求成功率(以分數表示)、響應速度和最近檢查時間滿足settings.py配置的要求的代理IP將被網絡爬蟲客戶端消耗。
為了屏蔽各調用語言的差異,目前實現的客戶端是squid客戶端,也可以作為網絡爬蟲客戶端的中間件。
至此,整個過程完成。