太陽軟件分享丨分布式ip代理池,可用率超高,趕快試試吧!
架構設計
這篇文章的目的是闡述haipproxy的主要架構和流程。該項目模塊是
基於Scrapy和Redis的分布式網絡爬蟲,用作IP爬取和校驗,對應於項目的crawler
基於Redis實現的分布式任務調度工具,對應於項目的scheduler和redis_util.py
Crawler分為代理爬取和校驗,兩者實現思想類似,主要使用Scrapy的spider_idle信號和DontCloseSpider異常來阻止Scrapy在沒有數據的時候關閉,靈感來自scrapy-redis(https://github.com/rmax/scrapy-redis)。
啟動調度器,包括代理網絡爬蟲調度器和校驗網絡爬蟲調度器。調度器會讀取rules.py中待爬取的網站,將其編排成任務存入各個任務隊列中
啟動各個網絡爬蟲,包括IP爬取和校驗程序。項目中網絡爬蟲和調度器都是高可用的,還可以根據實際情況進行分布式部署,無需改動代碼。由於本文的目標不是寫成該項目的詳細使用文檔,所以省略了如指定啟動網絡爬蟲類型和調度器類型的介紹
代理IP采集網絡爬蟲啟動後會到對應的任務隊列中獲取任務並執行,再把獲取到的結果存入一個init隊列中
init隊列由一個特殊的校驗器HttpbinInitValidator進行消費,它會過濾掉透明代理,再把可用代理輸入各個Validated隊列中
調度器會定時從Validated隊列中獲取代理IP,再將其存入一個臨時的隊列。這裏用一個臨時隊列是為了讓校驗更加公平,如果直接從Validated隊列中獲取資源進行校驗,那麽會增大不公平性
這時候各個校驗器(非init校驗器)會從對應的臨時隊列中獲取待校驗的IP並對其進行校驗,此處省略校驗細節
校驗完成後再將其放回到Validated隊列中,等待下一輪校驗
請求成功率(體現為分數)、響應速度和最近校驗時間滿足settings.py所配置要求的代理IP將會被網絡爬蟲客戶端所消費
為了屏蔽各個調用語言的差異性,目前實現的客戶端是squid客戶端,它還可以作為網絡爬蟲客戶端的中間件
到此,整個流程便完了。
太陽軟件分享丨分布式ip代理池,可用率超高,趕快試試吧!