国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python爬蟲代理池服務

2020-01-04 15:47:10
字體:
來源:轉載
供稿:網友

在公司做分布式深網爬蟲,搭建了一套穩定的代理池服務,為上千個爬蟲提供有效的代理,保證各個爬蟲拿到的都是對應網站有效的代理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等接口,方便爬蟲直接使用。

python,爬蟲,代理池

3、代碼模塊

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

Api:

api接口相關代碼,目前api是由Flask實現,代碼也非常簡單??蛻舳苏埱髠鹘oFlask,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、安裝

下載代碼:

Python

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

安裝依賴:

Python

pip install -r requirements.txtpip install -r requirements.txt

啟動:

Python

需要分別啟動定時任務和api到Config.ini中配置你的SSDB到Schedule目錄下:>>>python ProxyRefreshSchedule.py到Api目錄下:>>>python ProxyApi.py需要分別啟動定時任務和api到Config.ini中配置你的SSDB到Schedule目錄下:>>>python ProxyRefreshSchedule.py到Api目錄下:>>>python ProxyApi.py

5、使用

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

python,爬蟲,代理池

useful_proxy

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

index頁面:

python,爬蟲,代理池

get頁面:

python,爬蟲,代理池

get_all頁面:

python,爬蟲,代理池

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

Python

import requestsdef get_proxy(): return requests.get("http://127.0.0.1:5000/get/").contentdef delete_proxy(proxy): requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))# your spider codedef spider(): # .... requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)}) # ....import requestsdef get_proxy(): return requests.get("http://127.0.0.1:5000/get/").contentdef delete_proxy(proxy): requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))# your spider codedef spider(): # .... requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)}) # ....

6、最后

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

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

總結

以上所述是小編給大家介紹的Python爬蟲代理池服務,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东丰县| 南川市| 阿合奇县| 武宣县| 平昌县| 贺州市| 潍坊市| 彭山县| 宁国市| 庐江县| 格尔木市| 丘北县| 虞城县| 广宁县| 长乐市| 丹东市| 清镇市| 会东县| 托克逊县| 行唐县| 绥江县| 姜堰市| 天峨县| 凌海市| 蒙城县| 铜山县| 彭水| 确山县| 丹巴县| 连江县| 商城县| 永康市| 莱阳市| 松原市| 调兵山市| 辽阳市| 庆安县| 剑阁县| 嘉鱼县| 甘谷县| 公主岭市|