您好,登錄后才能下訂單哦!
在公司做分布式深網(wǎng)爬蟲,搭建了一套穩(wěn)定的代理池服務(wù),為上千個(gè)爬蟲提供有效的代理,保證各個(gè)爬蟲拿到的都是對(duì)應(yīng)網(wǎng)站有效的代理IP,從而保證爬蟲快速穩(wěn)定的運(yùn)行,當(dāng)然在公司做的東西不能開源出來。不過呢,閑暇時(shí)間手癢,所以就想利用一些免費(fèi)的資源搞一個(gè)簡單的代理池服務(wù)。
1、問題
代理IP從何而來?
剛自學(xué)爬蟲的時(shí)候沒有代理IP就去西刺、快代理之類有免費(fèi)代理的網(wǎng)站去爬,還是有個(gè)別代理能用。當(dāng)然,如果你有更好的代理接口也可以自己接入。
免費(fèi)代理的采集也很簡單,無非就是:訪問頁面頁面 —> 正則/xpath提取 —> 保存
如何保證代理質(zhì)量?
可以肯定免費(fèi)的代理IP大部分都是不能用的,不然別人為什么還提供付費(fèi)的(不過事實(shí)是很多代理商的付費(fèi)IP也不穩(wěn)定,也有很多是不能用)。所以采集回來的代理IP不能直接使用,可以寫檢測程序不斷的去用這些代理訪問一個(gè)穩(wěn)定的網(wǎng)站,看是否可以正常使用。這個(gè)過程可以使用多線程或異步的方式,因?yàn)闄z測代理是個(gè)很慢的過程。
采集回來的代理如何存儲(chǔ)?
這里不得不推薦一個(gè)高性能支持多種數(shù)據(jù)結(jié)構(gòu)的NoSQL數(shù)據(jù)庫SSDB,用于代理Redis。支持隊(duì)列、hash、set、k-v對(duì),支持T級(jí)別數(shù)據(jù)。是做分布式爬蟲很好中間存儲(chǔ)工具。
如何讓爬蟲更簡單的使用這些代理?
答案肯定是做成服務(wù)咯,python有這么多的web框架,隨便拿一個(gè)來寫個(gè)api供爬蟲調(diào)用。這樣有很多好處,比如:當(dāng)爬蟲發(fā)現(xiàn)代理不能使用可以主動(dòng)通過api去delete代理IP,當(dāng)爬蟲發(fā)現(xiàn)代理池IP不夠用時(shí)可以主動(dòng)去refresh代理池。這樣比檢測程序更加靠譜。
2、代理池設(shè)計(jì)
代理池由四部分組成:
ProxyGetter:
代理獲取接口,目前有5個(gè)免費(fèi)代理源,每調(diào)用一次就會(huì)抓取這個(gè)5個(gè)網(wǎng)站的最新代理放入DB,可自行添加額外的代理獲取接口;
DB:
用于存放代理IP,現(xiàn)在暫時(shí)只支持SSDB。至于為什么選擇SSDB,大家可以參考這篇文章,個(gè)人覺得SSDB是個(gè)不錯(cuò)的Redis替代方案,如果你沒有用過SSDB,安裝起來也很簡單,可以參考這里;
Schedule:
計(jì)劃任務(wù)用戶定時(shí)去檢測DB中的代理可用性,刪除不可用的代理。同時(shí)也會(huì)主動(dòng)通過ProxyGetter去獲取最新代理放入DB;
ProxyApi:
代理池的外部接口,由于現(xiàn)在這么代理池功能比較簡單,花兩個(gè)小時(shí)看了下Flask,愉快的決定用Flask搞定。功能是給爬蟲提供get/delete/refresh等接口,方便爬蟲直接使用。
3、代碼模塊
Python中高層次的數(shù)據(jù)結(jié)構(gòu),動(dòng)態(tài)類型和動(dòng)態(tài)綁定,使得它非常適合于快速應(yīng)用開發(fā),也適合于作為膠水語言連接已有的軟件部件。用Python來搞這個(gè)代理IP池也很簡單,代碼分為6個(gè)模塊:
Api:
api接口相關(guān)代碼,目前api是由Flask實(shí)現(xiàn),代碼也非常簡單。客戶端請(qǐng)求傳給Flask,F(xiàn)lask調(diào)用ProxyManager中的實(shí)現(xiàn),包括get/delete/refresh/get_all;
DB:
數(shù)據(jù)庫相關(guān)代碼,目前數(shù)據(jù)庫是采用SSDB。代碼用工廠模式實(shí)現(xiàn),方便日后擴(kuò)展其他類型數(shù)據(jù)庫;
Manager:
get/delete/refresh/get_all等接口的具體實(shí)現(xiàn)類,目前代理池只負(fù)責(zé)管理proxy,日后可能會(huì)有更多功能,比如代理和爬蟲的綁定,代理和賬號(hào)的綁定等等;
ProxyGetter:
代理獲取的相關(guān)代碼,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia這個(gè)五個(gè)網(wǎng)站的免費(fèi)代理,經(jīng)測試這個(gè)5個(gè)網(wǎng)站每天更新的可用代理只有六七十個(gè),當(dāng)然也支持自己擴(kuò)展代理接口;
Schedule:
定時(shí)任務(wù)相關(guān)代碼,現(xiàn)在只是實(shí)現(xiàn)定時(shí)去刷新代碼,并驗(yàn)證可用代理,采用多進(jìn)程方式;
Util:
存放一些公共的模塊方法或函數(shù),包含GetConfig:讀取配置文件config.ini的類,ConfigParse: 集成重寫ConfigParser的類,使其對(duì)大小寫敏感, Singleton:實(shí)現(xiàn)單例,LazyProperty:實(shí)現(xiàn)類屬性惰性計(jì)算。等等;
其他文件:
配置文件:Config.ini,數(shù)據(jù)庫配置和代理獲取接口配置,可以在GetFreeProxy中添加新的代理獲取方法,并在Config.ini中注冊(cè)即可使用;
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.txt pip install -r requirements.txt
啟動(dòng):
Python
需要分別啟動(dòng)定時(shí)任務(wù)和api 到Config.ini中配置你的SSDB 到Schedule目錄下: >>>python ProxyRefreshSchedule.py 到Api目錄下: >>>python ProxyApi.py 需要分別啟動(dòng)定時(shí)任務(wù)和api 到Config.ini中配置你的SSDB 到Schedule目錄下: >>>python ProxyRefreshSchedule.py 到Api目錄下: >>>python ProxyApi.py
5、使用
定時(shí)任務(wù)啟動(dòng)后,會(huì)通過代理獲取方法fetch所有代理放入數(shù)據(jù)庫并驗(yàn)證。此后默認(rèn)每20分鐘會(huì)重復(fù)執(zhí)行一次。定時(shí)任務(wù)啟動(dòng)大概一兩分鐘后,便可在SSDB中看到刷新出來的可用的代理:
useful_proxy
啟動(dòng)ProxyApi.py后即可在瀏覽器中使用接口獲取代理,一下是瀏覽器中的截圖:
index頁面:
get頁面:
get_all頁面:
爬蟲中使用,如果要在爬蟲代碼中使用的話, 可以將此api封裝成函數(shù)直接使用,例如:
Python
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)}) # .... 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、最后
時(shí)間倉促,功能和代碼都比較簡陋,以后有時(shí)間再改進(jìn)。喜歡的在github上給個(gè)star。感謝!
github項(xiàng)目地址:https://github.com/jhao104/proxy_pool
總結(jié)
以上所述是小編給大家介紹的Python爬蟲代理池服務(wù),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。