Python爬蟲代理池

爬蟲代理IP池

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

一、問題

  • 代理IP從何而來?
      剛自學爬蟲的時候沒有代理IP就去西刺、快代理之類有免費代理的網站去爬,仍是有個別代理能用。固然,若是你有更好的代理接口也能夠本身接入。
      免費代理的採集也很簡單,無非就是:訪問頁面頁面 —> 正則/xpath提取 —> 保存
  • 如何保證代理質量?
      能夠確定免費的代理IP大部分都是不能用的,否則別人爲何還提供付費的(不過事實是不少代理商的付費IP也不穩定,也有不少是不能用)。因此採集回來的代理IP不能直接使用,能夠寫檢測程序不斷的去用這些代理訪問一個穩定的網站,看是否能夠正常使用。這個過程可使用多線程或異步的方式,由於檢測代理是個很慢的過程。
  • 採集回來的代理如何存儲?
      這裏不得不推薦一個高性能支持多種數據結構的NoSQL數據庫SSDB,用於代理Redis。支持隊列、hash、set、k-v對,支持T級別數據。是作分佈式爬蟲很好中間存儲工具。
  • 如何讓爬蟲更簡單的使用這些代理?
      答案確定是作成服務咯,python有這麼多的web框架,隨便拿一個來寫個api供爬蟲調用。這樣有不少好處,好比:當爬蟲發現代理不能使用能夠主動經過api去delete代理IP,當爬蟲發現代理池IP不夠用時能夠主動去refresh代理池。這樣比檢測程序更加靠譜。

    二、代理池設計

      代理池由四部分組成:
  • ProxyGetter:
      代理獲取接口,目前有5個免費代理源,每調用一次就會抓取這個5個網站的最新代理放入DB,可自行添加額外的代理獲取接口;
  • DB:
      用於存放代理IP,如今暫時只支持SSDB。至於爲何選擇SSDB,你們能夠參考這篇文章,我的以爲SSDB是個不錯的Redis替代方案,若是你沒有用過SSDB,安裝起來也很簡單,能夠參考這裏
  • Schedule:
      計劃任務用戶定時去檢測DB中的代理可用性,刪除不可用的代理。同時也會主動經過ProxyGetter去獲取最新代理放入DB;
  • ProxyApi:
      代理池的外部接口,因爲如今這麼代理池功能比較簡單,花兩個小時看了下Flask,愉快的決定用Flask搞定。功能是給爬蟲提供get/delete/refresh等接口,方便爬蟲直接使用。

    設計

    三、代碼模塊

      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中註冊便可使用;

    四、安裝

    下載代碼:
    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

    五、使用

      定時任務啓動後,會經過代理獲取方法fetch全部代理放入數據庫並驗證。此後默認每20分鐘會重複執行一次。定時任務啓動大概一兩分鐘後,即可在SSDB中看到刷新出來的可用的代理:

useful_proxy

  啓動ProxyApi.py後便可在瀏覽器中使用接口獲取代理,一下是瀏覽器中的截圖:
  index頁面:vue

    index

 

  get頁面:
    get
  get_all頁面:
  get_allpython

  爬蟲中使用,若是要在爬蟲代碼中使用的話, 能夠將此api封裝成函數直接使用,例如:git

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)})
    # ....

六、最後

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

  github項目地址:https://github.com/jhao104/proxy_poolweb

  我的博客:http://www.spiderpy.cn/數據庫

      歡迎關注微信公衆號:Pythoner每日一報flask

    

相關文章
相關標籤/搜索