如何維護爬蟲程序中的代理ip庫?

代理ip有的變得連接很慢,甚至連不上,有什麼樣的機制可以讓ip列表保持較好的可用性?


爬蟲代理IP池

在公司做分散式深網爬蟲,搭建了一套穩定的代理池服務,為上千個爬蟲提供有效的代理,保證各個爬蟲拿到的都是對應網站有效的代理IP,從而保證爬蟲快速穩定的運行,當然在公司做的東西不能開源出來。不過呢,閑暇時間手癢,所以就想利用一些免費的資源搞一個簡單的代理池服務。

1、問題

  • 代理IP從何而來?

  剛自學爬蟲的時候沒有代理IP就去西刺、快代理之類有免費代理的網站去爬,還是有個別代理能用。當然,如果你有更好的代理介面也可以自己接入。
  免費代理的採集也很簡單,無非就是:訪問頁面頁面 —&> 正則/xpath提取 —&> 保存

  • 如何保證代理質量?

  可以肯定免費的代理IP大部分都是不能用的,不然別人為什麼還提供付費的(不過事實是很多代理商的付費IP也不穩定,也有很多是不能用)。所以採集回來的代理IP不能直接使用,可以寫檢測程序不斷的去用這些代理訪問一個穩定的網站,看是否可以正常使用。這個過程可以使用多線程或非同步的方式,因為檢測代理是個很慢的過程。

  • 採集回來的代理如何存儲?

  這裡不得不推薦一個高性能支持多種數據結構的NoSQL資料庫SSDB,用於代理Redis。支持隊列、hash、set、k-v對,支持T級別數據。是做分散式爬蟲很好中間存儲工具。

  • 如何讓爬蟲更簡單的使用這些代理?

  答案肯定是做成服務咯,python有這麼多的web框架,隨便拿一個來寫個api供爬蟲調用。這樣有很多好處,比如:當爬蟲發現代理不能使用可以主動通過api去delete代理IP,當爬蟲發現代理池IP不夠用時可以主動去refresh代理池。這樣比檢測程序更加靠譜。

2、代理池設計

  代理池由四部分組成:

  • ProxyGetter:

  代理獲取介面,目前有5個免費代理源,每調用一次就會抓取這個5個網站的最新代理放入DB,可自行添加額外的代理獲取介面;

  • DB:

  用於存放代理IP,現在暫時只支持SSDB。至於為什麼選擇SSDB,大家可以參考這篇文章,個人覺得SSDB是個不錯的Redis替代方案,如果你沒有用過SSDB,安裝起來也很簡單,可以參考這裡;

  • Schedule:

  計劃任務用戶定時去檢測DB中的代理可用性,刪除不可用的代理。同時也會主動通過ProxyGetter去獲取最新代理放入DB;

  • ProxyApi:

  代理池的外部介面,由於現在這麼代理池功能比較簡單,花兩個小時看了下Flask,愉快的決定用Flask搞定。功能是給爬蟲提供get/delete/refresh等介面,方便爬蟲直接使用。

3、代碼模塊

  Python中高層次的數據結構,動態類型和動態綁定,使得它非常適合於快速應用開發,也適合於作為膠水語言連接已有的軟體部件。用Python來搞這個代理IP池也很簡單,代碼分為6個模塊:

  • Api:
      api介面相關代碼,目前api是由Flask實現,代碼也非常簡單。客戶端請求傳給Flask,Flask調用ProxyManager中的實現,包括get/delete/refresh/get_all;
  • DB:
      資料庫相關代碼,目前資料庫是採用SSDB。代碼用工廠模式實現,方便日後擴展其他類型資料庫;
  • Manager:
      get/delete/refresh/get_all等介面的具體實現類,目前代理池只負責管理proxy,日後可能會有更多功能,比如代理和爬蟲的綁定,代理和賬號的綁定等等;
  • ProxyGetter:
      代理獲取的相關代碼,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia這個五個網站的免費代理,經測試這個5個網站每天更新的可用代理只有六七十個,當然也支持自己擴展代理介面;
  • Schedule:
      定時任務相關代碼,現在只是實現定時去刷新代碼,並驗證可用代理,採用多進程方式;
  • Util:
      存放一些公共的模塊方法或函數,包含GetConfig:讀取配置文件config.ini的類,ConfigParse: 集成重寫ConfigParser的類,使其對大小寫敏感, Singleton:實現單例,LazyProperty:實現類屬性惰性計算。等等;
  • 其他文件:
      配置文件:Config.ini,資料庫配置和代理獲取介面配置,可以在GetFreeProxy中添加新的代理獲取方法,並在Config.ini中註冊即可使用;

4、安裝

下載代碼:

git clone git@github.com:jhao104/proxy_pool.git

或者直接到https://github.com/jhao104/proxy_pool 下載zip文件

安裝依賴:

pip install -r requirements.txt

啟動:

需要分別啟動定時任務和api
到Config.ini中配置你的SSDB

到Schedule目錄下:
&>&>&>python ProxyRefreshSchedule.py

到Api目錄下:
&>&>&>python ProxyApi.py

5、使用

  定時任務啟動後,會通過代理獲取方法fetch所有代理放入資料庫並驗證。此後默認每20分鐘會重複執行一次。定時任務啟動大概一兩分鐘後,便可在SSDB中看到刷新出來的可用的代理:

啟動ProxyApi.py後即可在瀏覽器中使用介面獲取代理,一下是瀏覽器中的截圖:

  index頁面:

get:

get_all:

爬蟲中使用,如果要在爬蟲代碼中使用的話, 可以將此api封裝成函數直接使用,例如:

import requests

def get_proxy():
return requests.get("http://127.0.0.1:5000/get/").content

def delete_proxy(proxy):
requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))

# your spider code

def spider():
# ....
requests.get("https://www.example.com", proxies={"http": "http://{}".format(get_proxy)})
# ....

6、最後

  時間倉促,功能和代碼都比較簡陋,以後有時間再改進。喜歡的在github上給個star。感謝!

github項目地址:[https://github.com/jhao104/proxy_pool](https://github.com/jhao104/proxy_pool)


scrapy爬微博評論的時候用http://ipway.net這個代理


我也寫個代理池,你們都是Python我的C# 思路差不多https://github.com/wangqifan/ProxyPool


最簡單有效的方式,代理IP肯定是要使用的,在使用的時候進行驗證,如果無效直接捨棄。而工具最佳就是redis的set維護代理IP庫,使用smember做到共享使用,spop進行捨棄。至於代理IP如何驗證有效性,類似這種:

//轉自千界雲 免費代理IP的獲取方式

public static boolean checkProxy(String ip, Integer port){

try {

//您的IP地址 可以換成任何比較快的網頁

Jsoup.connect("Json在線解析及格式化驗證")

.timeout(3*1000)

.proxy(ip, port, null)

.get();

System.out.println(ip+":"+port);

return true;

} catch (Exception e) {

return false;

}

}


最近寫研究爬蟲大法,苦於對方反爬封IP,後來找到了http://www.natcp.com 的免費代理RestAPI介面搞定了,程序中自動調用,最近開放測試中,爬蟲小白們抓緊啦~快跟老司機上車~


現在驗證碼太厲害了,VPS撥號的IP以後估計越來越不行了


如果需要大量的ip代理池,找我們咯。5000個埠,500條線程並發,ip代理數以萬計。


在這一步就報錯了,求解釋啊,


如果有能力,自己建獨享代理IP伺服器,很穩定,不存在所謂的失效。

否則通過購買動態代理IP的,要設置驗證程序,把所有代理IP放在Redis或者其他文件中,按幾分鐘測試一遍,失效就刪除。


我是下了個驗證程序,用資料庫里的ip代理去訪問百度。。。然後不可用的就刪掉


不如創建一個驗證代理的服務吧,定期掃描庫存代理,更新可用性,遇到不可用的就刪除或者標記。


推薦閱讀:

python模擬登錄知乎,captcha是手工輸入,為什麼也提示captcha錯了?
如何解析網頁視頻的原始地址?
anaconda是幹什麼的,是 python的第三方解釋環境嗎?
Chrome的開發者工具怎麼查看錶單數據?網路選項卡里的參數一項在哪裡?
Python輸出豆瓣個人主頁源代碼出現編碼錯誤?

TAG:爬蟲計算機網路 |