1. 程式人生 > >太陽軟件分享丨分布式ip代理池,可用率超高,趕快試試吧!

太陽軟件分享丨分布式ip代理池,可用率超高,趕快試試吧!

啟動網絡 隊列 pid don 完成 軟件分享 模塊 pro squid

歷時大致兩個月,到現在終於完成了高可用分布式代理IP池(https://github.com/SpiderClub/haipproxy),目前開源在了Github上。寫這個項目的原因主要有兩點,一是本人平時的部分工作需要和網絡爬蟲打交道,代理IP在有的時候還可以發揮非常重要的作用,調研過一些開源的代理IP采集程序,發現在爬取、解析、校驗、資源調度等這些方面總有一些不盡人意的地方;二是和一個網友(不嚴格的說算得上是伯樂)的交流讓小編有了關於使用Scrapy來寫分布式網絡爬蟲的一些想法,正好還可以借助這個機會來嘗試證實這些想法。

  架構設計

  這篇文章的目的是闡述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代理池,可用率超高,趕快試試吧!