Python爬蟲(chóng)代理池

爬蟲(chóng)代理IP池

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

1、問(wèn)題

代理IP從何而來(lái)?

剛自學(xué)爬蟲(chóng)的時(shí)候沒(méi)有代理IP就去西刺、快代理之類(lèi)有免費(fèi)代理的網(wǎng)站去爬,還是有個(gè)別代理能用。當(dāng)然,如果你有更好的代理接口也可以自己接入。

免費(fèi)代理的采集也很簡(jiǎn)單,無(wú)非就是:訪(fǎng)問(wèn)頁(yè)面頁(yè)面 —> 正則/xpath提取 —> 保存

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

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

采集回來(lái)的代理如何存儲(chǔ)?

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

如何讓爬蟲(chóng)更簡(jiǎn)單的使用這些代理?

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

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è)人覺(jué)得SSDB是個(gè)不錯(cuò)的Redis替代方案,如果你沒(méi)有用過(guò)SSDB,安裝起來(lái)也很簡(jiǎn)單,可以參考這里;

Schedule:

計(jì)劃任務(wù)用戶(hù)定時(shí)去檢測(cè)DB中的代理可用性,刪除不可用的代理。同時(shí)也會(huì)主動(dòng)通過(guò)ProxyGetter去獲取最新代理放入DB;

ProxyApi:

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

image

3、代碼模塊

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

Api:

api接口相關(guān)代碼,目前api是由Flask實(shí)現(xiàn),代碼也非常簡(jiǎn)單??蛻?hù)端請(qǐng)求傳給Flask,F(xiàn)lask調(diào)用ProxyManager中的實(shí)現(xiàn),包括get/delete/refresh/get_all;

DB:

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

Manager:

get/delete/refresh/get_all等接口的具體實(shí)現(xiàn)類(lèi),目前代理池只負(fù)責(zé)管理proxy,日后可能會(huì)有更多功能,比如代理和爬蟲(chóng)的綁定,代理和賬號(hào)的綁定等等;

ProxyGetter:

代理獲取的相關(guān)代碼,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia這個(gè)五個(gè)網(wǎng)站的免費(fèi)代理,經(jīng)測(cè)試這個(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的類(lèi),ConfigParse: 集成重寫(xiě)ConfigParser的類(lèi),使其對(duì)大小寫(xiě)敏感, Singleton:實(shí)現(xiàn)單例,LazyProperty:實(shí)現(xiàn)類(lèi)屬性惰性計(jì)算。等等;

其他文件:

配置文件:Config.ini,數(shù)據(jù)庫(kù)配置和代理獲取接口配置,可以在GetFreeProxy中添加新的代理獲取方法,并在Config.ini中注冊(cè)即可使用;

4、安裝

下載代碼:

image

安裝依賴(lài):

pip install -r requirements.txt

啟動(dòng):

image

5、使用

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

image

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

index頁(yè)面:

image

get頁(yè)面:

image

get_all頁(yè)面:

image

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

image

6、最后

時(shí)間倉(cāng)促,功能和代碼都比較簡(jiǎn)陋,以后有時(shí)間再改進(jìn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,746評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,666評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,477評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,960評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,200評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,617評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,807評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,049評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,425評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,674評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,432評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,769評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • 爬蟲(chóng)代理IP池 在公司做分布式深網(wǎng)爬蟲(chóng),搭建了一套穩(wěn)定的代理池服務(wù),為上千個(gè)爬蟲(chóng)提供有效的代理,保證各個(gè)爬蟲(chóng)拿到的...
    派派森森閱讀 450評(píng)論 0 1
  • 在公司做分布式深網(wǎng)爬蟲(chóng),搭建了一套穩(wěn)定的代理池服務(wù),為上千個(gè)爬蟲(chóng)提供有效的代理,保證各個(gè)爬蟲(chóng)拿到的都是對(duì)應(yīng)網(wǎng)站有效...
    嗨學(xué)編程閱讀 314評(píng)論 0 1
  • 地址:https://github.com/Python3WebSpider/ProxyPool 為什么需要代理池...
    造數(shù)科技閱讀 10,003評(píng)論 3 18
  • 親愛(ài)的寶貝,今天忽落你了,上午的時(shí)候媽媽一直在給姥姥家打掃衛(wèi)生,所以沒(méi)來(lái)得及顧上你,一年中媽媽都不在家,姥姥在家辛...
    劉韓旭媽媽閱讀 279評(píng)論 0 1
  • 親愛(ài)的,我去了你的城市,走過(guò)了你走過(guò)的那條小巷,喝過(guò)了你喝過(guò)的咖啡,看過(guò)了你看過(guò)的電影,突然好想你,突然鋒利的回憶...
    夢(mèng)里穿過(guò)天堂閱讀 919評(píng)論 0 0