爬蟲(chóng)之代理池維護(hù)

前言

做過(guò)爬蟲(chóng)的應(yīng)該都知道,在爬取反爬比較強(qiáng)的網(wǎng)站如果同一時(shí)間獲取的數(shù)據(jù)量過(guò)大就會(huì)導(dǎo)致封IP,例如豆瓣,搜狗之類的。那么我們我們的策略就是搭建自己的代理池悠瞬,Cookie池,使得爬蟲(chóng)更像是普通用戶在操作一樣以此來(lái)解決目標(biāo)網(wǎng)站封IP的問(wèn)題涯捻。在網(wǎng)上有大量公開(kāi)的免費(fèi)代理浅妆,如果經(jīng)濟(jì)基礎(chǔ)可以的話,我們也可以購(gòu)買付費(fèi)的代理IP障癌,用過(guò)的人也應(yīng)該知道凌外,無(wú)論是免費(fèi)的還是付費(fèi)的,其實(shí)都不能保證是可用的涛浙,因?yàn)榭赡艽薎P也會(huì)被其他人用來(lái)爬取同樣的目標(biāo)站點(diǎn)而封禁趴乡,或者代理服務(wù)器突然發(fā)生故障或網(wǎng)絡(luò)繁忙。一旦我們選用了一個(gè)不可用的代理蝗拿,這勢(shì)必會(huì)影響爬蟲(chóng)的工作效率晾捏。所以我們需要提前做篩選,將不可用的代理剔除掉哀托,從而保留可用的代理惦辛。小編今天就給大家?guī)?lái)如何搭建一個(gè)高效易用的代理池。

準(zhǔn)備工作

首先需要成功安裝Redis數(shù)據(jù)庫(kù)并啟動(dòng)服務(wù)仓手,另外還需要安裝aiohttp胖齐、request、redis-py嗽冒、pyquery呀伙、Flask庫(kù),Redis安裝可以參見(jiàn)百度添坊。

代理池的目標(biāo)

我們需要做到下面的幾個(gè)目標(biāo)剿另,來(lái)實(shí)現(xiàn)易用高效的代理池

基本模塊分為4塊:存儲(chǔ)模塊,獲取模塊贬蛙,檢測(cè)模塊雨女,接口模塊。

存儲(chǔ)模塊:負(fù)責(zé)存儲(chǔ)抓取下來(lái)的代理阳准。首先要保證代理不重復(fù)氛堕,要標(biāo)識(shí)代理的可用情況,還有動(dòng)態(tài)實(shí)時(shí)處理每個(gè)代理野蝇,所以一種比較高效和方便的存儲(chǔ)方式就是使用Redis的Sorted

Set讼稚,即有序集合括儒。,存儲(chǔ)模塊同時(shí)也是4個(gè)模塊中的中心模塊和基礎(chǔ)模塊锐想,將其他模塊串聯(lián)起來(lái)帮寻。

獲取模塊:需要定時(shí)在各大代理網(wǎng)站抓取代理。代理可以是免費(fèi)公開(kāi)代理也可以是付費(fèi)代理痛倚,代理的形式都是IP加端口,此模塊盡量從不同來(lái)源獲取澜躺,盡量抓取高匿代理蝉稳,抓取成功之后將可用代理保存到數(shù)據(jù)庫(kù)中。

檢測(cè)模塊:需要定時(shí)檢測(cè)數(shù)據(jù)庫(kù)中的代理掘鄙。這里需要設(shè)置一個(gè)檢測(cè)鏈接耘戚,最好是爬取那個(gè)網(wǎng)站就檢測(cè)那個(gè)網(wǎng)站,這樣更加有針對(duì)性操漠,如果要做一個(gè)通用型的代理收津,那可以設(shè)置百度等鏈接來(lái)檢測(cè)。另外浊伙,我們需要標(biāo)識(shí)每一個(gè)代理的狀態(tài)撞秋,如設(shè)置分?jǐn)?shù)標(biāo)識(shí),10分表示可用嚣鄙,分?jǐn)?shù)越少代表越不可用吻贿。檢測(cè)一次,如果代理可用哑子,我們可以將分?jǐn)?shù)標(biāo)識(shí)立即設(shè)置為滿分10分舅列,或者在原來(lái)的基礎(chǔ)上加1分;如果代理不可用卧蜓,可以將分?jǐn)?shù)標(biāo)識(shí)減1分帐要,當(dāng)分?jǐn)?shù)減到一定閥值后,代理就直接從數(shù)據(jù)庫(kù)移除弥奸,通過(guò)這樣的標(biāo)識(shí)分?jǐn)?shù)榨惠,我們就可以辨別代理的可用情況,選用的時(shí)候會(huì)更有針對(duì)性盛霎。

接口模塊:需要用API來(lái)提供對(duì)外服務(wù)的接口冒冬。其實(shí)我們可以直接連接數(shù)據(jù)庫(kù)來(lái)取對(duì)應(yīng)的數(shù)據(jù)摩渺,但是這樣就需要知道數(shù)據(jù)庫(kù)的連接信息简烤,并且要配置連接,而比較安全和方便的方式就是提供一個(gè)Web API接口摇幻,我們通過(guò)訪問(wèn)接口即可拿到可用代理横侦。另外挥萌,由于可用代理可能有多個(gè),那么我們可以設(shè)置一個(gè)隨機(jī)返回某個(gè)可用代理的接口枉侧,這樣就能保證每個(gè)可用代理都可以取到引瀑,實(shí)現(xiàn)負(fù)載均衡。

設(shè)計(jì)思路已經(jīng)很明確了榨馁,現(xiàn)在我們就用代碼來(lái)實(shí)現(xiàn)代理池憨栽。

首先是存儲(chǔ)模塊,我們需要定義一個(gè)類來(lái)操作數(shù)據(jù)庫(kù)的有序集合翼虫,定義一些方法來(lái)實(shí)現(xiàn)分?jǐn)?shù)的設(shè)置屑柔、代理的獲取等。核心代碼如下:

其次是獲取模塊珍剑,獲取模塊的邏輯相對(duì)簡(jiǎn)單掸宛,只需要寫一個(gè)爬蟲(chóng)來(lái)從各大網(wǎng)站抓取代理就可以了。核心代碼如下:

方便起見(jiàn)招拙,我們將獲取代理的每個(gè)方法統(tǒng)一定義為crawl開(kāi)頭唧瘾,這樣擴(kuò)展的時(shí)候只需要添加crawl開(kāi)頭的方法即可。這里實(shí)現(xiàn)了幾個(gè)示例别凤,爬取的大都是網(wǎng)上的免費(fèi)網(wǎng)站饰序,還有小白購(gòu)買的付費(fèi)代理(現(xiàn)在已經(jīng)不能用了),如果你有自己的付費(fèi)代理规哪,也只需要添加到里面即可菌羽。每個(gè)代理方法都定義成了生成器,通過(guò)yeild返回一個(gè)個(gè)代理由缆。程序首先獲取網(wǎng)頁(yè)注祖,然后用解析庫(kù)進(jìn)行解析,解析出IP加端口的形式然后返回均唉。

然后定義了一個(gè)get_proxies()方法是晨,將所有的以crawl開(kāi)頭的方法調(diào)用一遍,獲取每個(gè)方法返回的代理并組合成列表形式返回舔箭。這里我們用元類來(lái)實(shí)現(xiàn)這個(gè)方法罩缴。代碼如下:

最后定義了一個(gè)Getter類,用來(lái)動(dòng)態(tài)的調(diào)用所有以crawl開(kāi)頭的方法层扶,然后獲取抓到的代理箫章,將其加入到數(shù)據(jù)庫(kù)存儲(chǔ)起來(lái):

我們已經(jīng)成功的將各個(gè)網(wǎng)站的代理獲取下來(lái)了,現(xiàn)在就需要檢測(cè)模塊來(lái)對(duì)所有代理進(jìn)行多輪檢測(cè)镜会。代理檢測(cè)可用檬寂,分?jǐn)?shù)就設(shè)置為10,不可用就丟棄或者減1戳表,這樣就可以實(shí)時(shí)改變每個(gè)代理的可用情況桶至。如要獲取有效代理只需要獲取分?jǐn)?shù)高的代理即可昼伴。由于代理的數(shù)量非常多。為了提高檢測(cè)效率镣屹,我們?cè)谶@里使用了異步請(qǐng)求庫(kù)aiohttp來(lái)進(jìn)行檢測(cè)圃郊。

為了方便的獲取代理和使代理池可以作為一個(gè)獨(dú)立服務(wù)運(yùn)行,我們?cè)黾恿艘粋€(gè)接口模塊女蜈,并以Web API的形式暴露可用代理持舆。

最后通過(guò)調(diào)度模塊調(diào)用調(diào)用以上模塊以多線程方式運(yùn)行起來(lái)。

最后我們運(yùn)行一下

再打開(kāi)瀏覽器配置的API接口 http://127.0.0.1:5555伪窖,即可看到其首頁(yè)逸寓。

再訪問(wèn)http://127.0.0.1:5555/random,即可獲取隨機(jī)可用代理惰许。

到此我們的代理池就已經(jīng)搭建成功了席覆。有了代理池史辙,爬蟲(chóng)就會(huì)方便許多汹买。另外小編建議如果搭建自己的代理池,最好是選擇付費(fèi)代理聊倔。畢竟穩(wěn)定性高一些晦毙。網(wǎng)上的免費(fèi)代理在爬取某些網(wǎng)站還是比較吃力。

讀者如果有需要ADSL代理池搭建的思路耙蔑,可以在公眾號(hào)后臺(tái)留言见妒。后續(xù)會(huì)給出Cookie池搭建的方案。

完整代碼地址獲取可在公眾號(hào)后臺(tái)回復(fù)【代理池】獲得

對(duì)爬蟲(chóng)甸陌,數(shù)據(jù)分析须揣,算法感興趣的朋友們,可以加微信公眾號(hào) TWcoding钱豁,我們一起玩轉(zhuǎn)Python耻卡。

If it works for you.Please,star.

自助者,天助之

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牲尺,隨后出現(xiàn)的幾起案子卵酪,更是在濱河造成了極大的恐慌,老刑警劉巖谤碳,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃卡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜒简,警方通過(guò)查閱死者的電腦和手機(jī)瘸羡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搓茬,“玉大人最铁,你說(shuō)我怎么就攤上這事讯赏。” “怎么了冷尉?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵漱挎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雀哨,道長(zhǎng)磕谅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任雾棺,我火速辦了婚禮膊夹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捌浩。我一直安慰自己放刨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布尸饺。 她就那樣靜靜地躺著进统,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浪听。 梳的紋絲不亂的頭發(fā)上螟碎,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音迹栓,去河邊找鬼掉分。 笑死,一個(gè)胖子當(dāng)著我的面吹牛克伊,可吹牛的內(nèi)容都是我干的酥郭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愿吹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼不从!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起洗搂,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤消返,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后耘拇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撵颊,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年惫叛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倡勇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘉涌,死狀恐怖妻熊,靈堂內(nèi)的尸體忽然破棺而出夸浅,到底是詐尸還是另有隱情,我是刑警寧澤扔役,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布帆喇,位于F島的核電站,受9級(jí)特大地震影響亿胸,放射性物質(zhì)發(fā)生泄漏坯钦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一侈玄、第九天 我趴在偏房一處隱蔽的房頂上張望婉刀。 院中可真熱鬧,春花似錦序仙、人聲如沸突颊。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)律秃。三九已至,卻和暖如春挥等,著一層夾襖步出監(jiān)牢的瞬間友绝,已是汗流浹背堤尾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工肝劲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郭宝。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓辞槐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粘室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榄檬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評(píng)論 25 707
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,930評(píng)論 2 89
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)衔统,斷路器鹿榜,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 昨天在網(wǎng)易上看到一個(gè)熟悉卻不了解的名字--陳丹青,點(diǎn)開(kāi)看了他的發(fā)布會(huì)演講:文學(xué)與讀書锦爵!就陳先生而言舱殿,他不是讀書人,...
    Milly116閱讀 372評(píng)論 1 1
  • 鑼很脆的響了一下险掀,全場(chǎng)嘈雜的嘮嗑聲漸漸沒(méi)了沪袭,手機(jī)屏幕也一個(gè)個(gè)熄下去。 川劇樟氢,變臉冈绊,開(kāi)始侠鳄! 先是一個(gè)老生,邁著四方步...
    鐵馬書生閱讀 451評(píng)論 1 1