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