高可用性的分布式IP代理池,現(xiàn)在就試試吧。花了大約兩個(gè)月的時(shí)間,到目前為止,高度可用的分布式代理IP池終于完成了,現(xiàn)在已經(jīng)在Github上開源了。寫這個(gè)項(xiàng)目主要有兩個(gè)原因。首先,我的部分工作通常涉及處理網(wǎng)絡(luò)爬蟲,代理IP有時(shí)可以發(fā)揮非常重要的作用。筆者調(diào)查了一些開源的代理IP收集程序,發(fā)現(xiàn)這些程序在抓取、解析、檢查、資源調(diào)度等方面總是存在一些不盡如人意的地方。第二,通過與一位網(wǎng)友(嚴(yán)格意義上不算伯樂)的交流,我產(chǎn)生了一些關(guān)于使用Scrapy編寫分布式網(wǎng)絡(luò)爬蟲的想法,而這恰好是一個(gè)嘗試驗(yàn)證這些想法的機(jī)會(huì)。
本文的目的是解釋haipproxy的主要體系結(jié)構(gòu)和過程項(xiàng)目模塊。一個(gè)基于Scrapy和Redis的分布式網(wǎng)絡(luò)爬蟲,用于IP爬行和檢查,對(duì)應(yīng)于項(xiàng)目的爬蟲?;赗edis的分布式任務(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)閉。啟動(dòng)調(diào)度程序,包括代理爬蟲調(diào)度程序和驗(yàn)證爬蟲調(diào)度程序。調(diào)度程序?qū)⒆x取rules.py中要爬取的網(wǎng)站,將它們組織成任務(wù),并將它們存儲(chǔ)在每個(gè)任務(wù)隊(duì)列中。
啟動(dòng)每一個(gè)網(wǎng)絡(luò)爬蟲,包括IP抓取和驗(yàn)證程序。項(xiàng)目中的網(wǎng)絡(luò)爬蟲和調(diào)度器具有高可用性,可以根據(jù)實(shí)際情況進(jìn)行分布式部署,無需修改代碼。由于本文的目的不是為該項(xiàng)目編寫詳細(xì)的使用文檔,因此省略了指定啟動(dòng)網(wǎng)絡(luò)爬蟲類型和調(diào)度器類型的介紹。
IP收集爬蟲啟動(dòng)后,它將從相應(yīng)的任務(wù)隊(duì)列中獲取任務(wù)并執(zhí)行它們,然后將獲取的結(jié)果存儲(chǔ)在一個(gè)init隊(duì)列中。
init隊(duì)列由一個(gè)特殊的驗(yàn)證器HttpbinInitValidator使用,它過濾出透明的代理,然后將可用的代理輸入到每個(gè)驗(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)證者)將從相應(yīng)的臨時(shí)隊(duì)列中獲取要驗(yàn)證的IP并進(jìn)行驗(yàn)證。此處省略驗(yàn)證細(xì)節(jié)。驗(yàn)證完成后,將其放回已驗(yàn)證隊(duì)列,等待下一輪驗(yàn)證。Web Crawler客戶端將使用其請(qǐng)求成功率(以分?jǐn)?shù)表示)、響應(yīng)速度和最后檢查時(shí)間滿足settings.py中配置的需求的代理IP。
動(dòng)態(tài)IP模擬器
為了屏蔽調(diào)用語言之間的差異,目前實(shí)現(xiàn)的客戶端是Squid客戶端,它也可以用作網(wǎng)絡(luò)爬蟲客戶端的中間件,至此整個(gè)過程就完成了。