小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python 爬蟲代理池

 yespon 2017-02-22

來源:開源中國

作者:j_hao104

鏈接:https://my.oschina.net/jhao104/blog/799883(點擊尾部閱讀原文前往)


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


1、問題


  • 代理IP從何而來?


剛自學爬蟲的時候沒有代理IP就去西刺、快代理之類有免費代理的網(wǎng)站去爬,還是有個別代理能用。當然,如果你有更好的代理接口也可以自己接入。

免費代理的采集也很簡單,無非就是:訪問頁面頁面 —> 正則/xpath提取 —> 保存


  • 如何保證代理質(zhì)量?


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


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


這里不得不推薦一個高性能支持多種數(shù)據(jù)結(jié)構(gòu)的NoSQL數(shù)據(jù)庫SSDB,用于代理Redis。支持隊列、hash、set、k-v對,支持T級別數(shù)據(jù)。是做分布式爬蟲很好中間存儲工具。


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


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


2、代理池設(shè)計


代理池由四部分組成:


  • ProxyGetter:


代理獲取接口,目前有5個免費代理源,每調(diào)用一次就會抓取這個5個網(wǎng)站的最新代理放入DB,可自行添加額外的代理獲取接口;


  • DB:


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


  • Schedule:


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


  • ProxyApi:


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


3、代碼模塊


Python中高層次的數(shù)據(jù)結(jié)構(gòu),動態(tài)類型和動態(tài)綁定,使得它非常適合于快速應(yīng)用開發(fā),也適合于作為膠水語言連接已有的軟件部件。用Python來搞這個代理IP池也很簡單,代碼分為6個模塊:


  • Api:


api接口相關(guān)代碼,目前api是由Flask實現(xiàn),代碼也非常簡單??蛻舳苏埱髠鹘oFlask,F(xiàn)lask調(diào)用ProxyManager中的實現(xiàn),包括get/delete/refresh/get_all;


  • DB:


數(shù)據(jù)庫相關(guān)代碼,目前數(shù)據(jù)庫是采用SSDB。代碼用工廠模式實現(xiàn),方便日后擴展其他類型數(shù)據(jù)庫;


  • Manager:


get/delete/refresh/get_all等接口的具體實現(xiàn)類,目前代理池只負責管理proxy,日后可能會有更多功能,比如代理和爬蟲的綁定,代理和賬號的綁定等等;


  • ProxyGetter:


代理獲取的相關(guān)代碼,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia這個五個網(wǎng)站的免費代理,經(jīng)測試這個5個網(wǎng)站每天更新的可用代理只有六七十個,當然也支持自己擴展代理接口;


  • Schedule:


定時任務(wù)相關(guān)代碼,現(xiàn)在只是實現(xiàn)定時去刷新代碼,并驗證可用代理,采用多進程方式;


  • Util:


存放一些公共的模塊方法或函數(shù),包含GetConfig:讀取配置文件config.ini的類,ConfigParse: 集成重寫ConfigParser的類,使其對大小寫敏感, Singleton:實現(xiàn)單例,LazyProperty:實現(xiàn)類屬性惰性計算。等等;


  • 其他文件:


配置文件:Config.ini,數(shù)據(jù)庫配置和代理獲取接口配置,可以在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


啟動:


需要分別啟動定時任務(wù)和api

Config.ini中配置你的SSDB

Schedule目錄下:

>>>python ProxyRefreshSchedule.py

Api目錄下:

>>>python ProxyApi.py


5、使用


定時任務(wù)啟動后,會通過代理獲取方法fetch所有代理放入數(shù)據(jù)庫并驗證。此后默認每20分鐘會重復執(zhí)行一次。定時任務(wù)啟動大概一兩分鐘后,便可在SSDB中看到刷新出來的可用的代理:



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


index頁面:


get頁面:


get_all頁面:



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


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.', proxies={'http''http://{}'.format(get_proxy)})

    # ....


6、最后


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


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



●本文編號277,以后想閱讀這篇文章直接輸入277即可。

●輸入m可以獲取到文章目錄

相關(guān)推薦↓↓↓
 

算法與數(shù)據(jù)結(jié)構(gòu)

推薦:《15個技術(shù)類公眾微信

涵蓋:程序人生、算法與數(shù)據(jù)結(jié)構(gòu)、黑客技術(shù)與網(wǎng)絡(luò)安全、大數(shù)據(jù)技術(shù)、前端開發(fā)、Java、Python、Web開發(fā)、安卓開發(fā)、iOS開發(fā)、C/C++、.NET、Linux、數(shù)據(jù)庫、運維等。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多