haipproxy高可用核心策略

昨日使用haipproxy作為代理源,對(duì)知乎進(jìn)行了數(shù)據(jù)抓取相關(guān)的性能測(cè)試榔幸,測(cè)試效果還不錯(cuò)郎楼,有興趣的可以點(diǎn)擊項(xiàng)目主頁(yè)查看測(cè)試結(jié)果。但是它仍有繼續(xù)優(yōu)化的空間肪笋,所以筆者打算單獨(dú)寫(xiě)一篇文章來(lái)單獨(dú)闡述它現(xiàn)有的IP篩選策略月劈,也就是題目說(shuō)的高可用策略。而關(guān)于部署的高可用后續(xù)文章會(huì)談及到藤乙,這里暫時(shí)按下不表猜揪。

下文主要會(huì)談到校驗(yàn)器和客戶(hù)端的IP篩選策略。


校驗(yàn)器

我們知道坛梁,一個(gè)代理IP有多個(gè)屬性而姐,比如成功請(qǐng)求率、響應(yīng)速度划咐、是否支持Get/Post方法拴念、是否匿名和該IP所處位置等钧萍。這些往往也是衡量一個(gè)IP質(zhì)量的可參照標(biāo)準(zhǔn)。而從互聯(lián)網(wǎng)上采集的免費(fèi)IP大多數(shù)是短效的政鼠,所以代理IP對(duì)應(yīng)的最近驗(yàn)證時(shí)間也是一個(gè)很重要的參考標(biāo)準(zhǔn)风瘦。haipproxy目前主要參照請(qǐng)求成功率響應(yīng)速度公般、最近驗(yàn)證時(shí)間是否匿名這四個(gè)維度對(duì)代理IP進(jìn)行篩選万搔。精力所限,目前還未打算對(duì)IP位置進(jìn)行完善官帘,而IP位置對(duì)于已登錄的賬戶(hù)來(lái)說(shuō)具有比較重要的意義瞬雹。還有一點(diǎn)是,對(duì)于同一個(gè)代理IP刽虹,代理不同網(wǎng)站的效果可能大不相同酗捌,所幸的是,haipproxy可以根據(jù)自己需求定制校驗(yàn)器

根據(jù)haipproxy架構(gòu)篇的介紹涌哲,我們可以知道haipproxy initvalidator會(huì)過(guò)濾掉部分透明的代理ip胖缤,另外一個(gè)過(guò)濾透明IP的地方是proxy spiders,它在抓取代理IP的時(shí)候會(huì)直接丟棄透明代理IP膛虫。因此草姻,是否匿名這個(gè)標(biāo)注我們已經(jīng)實(shí)現(xiàn)了,后續(xù)所有的validated queues中存儲(chǔ)的都是匿名及高匿IP稍刀。

請(qǐng)求成功率是以打分的方式來(lái)做的撩独,這樣做的原因是不需要對(duì)歷時(shí)成功請(qǐng)求次數(shù)和失敗請(qǐng)求次數(shù)進(jìn)行記錄和計(jì)算,優(yōu)化了部分性能账月,又可以體現(xiàn)一個(gè)IP的穩(wěn)定性综膀。
那么打分的標(biāo)準(zhǔn)又是怎樣的呢?haipproxy會(huì)先給定一個(gè)初始分?jǐn)?shù)(5)局齿。當(dāng)成功一次剧劝,我們就對(duì)該代理加1分,為了防止分?jǐn)?shù)短時(shí)間急劇增大抓歼,在分?jǐn)?shù)大于一定閾值(10)后就對(duì)其進(jìn)行更平滑的加分處理讥此,具體為round(10/score, 2),這樣谣妻,分?jǐn)?shù)會(huì)越來(lái)越難升高萄喳,但是足夠衡量每個(gè)代理IP的穩(wěn)定性了。當(dāng)失敗一次蹋半,就要分情況處理了他巨。我們知道,很多免費(fèi)代理IP可能短時(shí)間失效,比如代理端口被關(guān)了染突。這種情況下捻爷,haipproxy會(huì)直接丟棄該代理IP,因?yàn)樗鼪](méi)有繼續(xù)校驗(yàn)的必要性了份企,再對(duì)它進(jìn)行校驗(yàn)只會(huì)增加校驗(yàn)器的負(fù)擔(dān)也榄。但是如果本次校驗(yàn)超時(shí)了,校驗(yàn)器會(huì)將該代理IP減一分薪棒,直到分?jǐn)?shù)為0手蝎,則刪除榕莺。對(duì)于不同分?jǐn)?shù)的IP的選取會(huì)在客戶(hù)端部分進(jìn)行說(shuō)明俐芯。

響應(yīng)速度這個(gè)標(biāo)準(zhǔn)比較容易評(píng)判,haipproxy的做法是為校驗(yàn)器爬蟲(chóng)加載一個(gè)profilemiddleware钉鸯,從而獲取到請(qǐng)求成功的代理IP的響應(yīng)時(shí)間吧史。同理,最近校驗(yàn)時(shí)間也比較容易獲取到唠雕,我們使用redis的zset數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)它贸营。

客戶(hù)端

目前,haipproxy實(shí)現(xiàn)了兩種形式的客戶(hù)端:squidpy_cli岩睁。前者是語(yǔ)言無(wú)關(guān)的钞脂,它使用squid作為二級(jí)代理,它會(huì)定時(shí)自動(dòng)更新squid配置文件捕儒,以獲取新的可用代理冰啃,獲取的方法和使用py_cli相同,下面會(huì)講到刘莹。使用squid作為二級(jí)代理的好處是便于服務(wù)化阎毅,同時(shí)是語(yǔ)言無(wú)關(guān)的,我們的爬蟲(chóng)端只需要將代理設(shè)置為http://squid_host:3128就可以了点弯,不用關(guān)心其它扇调,但是這么做有一點(diǎn)不好的是,它的調(diào)度是輪詢(xún)IP抢肛,并且對(duì)于不可用或者低質(zhì)量IP的處理和反饋是不透明的狼钮。基于這點(diǎn)捡絮,有必要實(shí)現(xiàn)基于不同語(yǔ)言的客戶(hù)端熬芜。

py_clihaipproxy代理獲取的python實(shí)現(xiàn)。挑選可用代理的具體做法如下:

  • 根據(jù)配置文件的設(shè)置分別從validated_queue锦援、ttl_queuespeed_queue中挑選出滿(mǎn)足配置參數(shù)需求的代理再對(duì)其求交集猛蔽,參數(shù)默認(rèn)值是LOWEST_SCORE = 6TTL_VALIDATED_RESOURCE = 2LONGEST_RESPONSE_TIME = 10,表示的意思是選擇分?jǐn)?shù)大于6且最近驗(yàn)證時(shí)間在2分鐘以?xún)?nèi)且最長(zhǎng)響應(yīng)時(shí)間不超過(guò)10s的代理曼库。這樣可以對(duì)上述的各個(gè)標(biāo)準(zhǔn)做合理的保證区岗。在上述挑選方式選出來(lái)的代理數(shù)量不足(len(proxies) < len(pool)*2)的時(shí)候,會(huì)放寬挑選要求毁枯,對(duì)速度和最近驗(yàn)證時(shí)間求交集慈缔,然后和成功率做并集。如果代理數(shù)量還不足种玛,它還會(huì)放低要求藐鹤,對(duì)滿(mǎn)足最近驗(yàn)證時(shí)間和成功率的集合做并集。

  • 在爬蟲(chóng)客戶(hù)端調(diào)用py_cli的時(shí)候赂韵,代理客戶(hù)端ProxyFetcher會(huì)首先調(diào)用refresh()方法娱节,如果ProxyFetcher中的可用代理量不夠,那么就會(huì)通過(guò)上一步的算法對(duì)IP池進(jìn)行擴(kuò)充祭示,如果數(shù)量足夠肄满,那么就會(huì)根據(jù)代理的調(diào)度策略選取合適的IP進(jìn)行使用。

  • 目前共有兩種代理調(diào)度策略质涛。(1)輪詢(xún)策略稠歉。代理池是一個(gè)隊(duì)列結(jié)構(gòu),每次從隊(duì)首拿一個(gè)IP進(jìn)行使用汇陆,如果該IP請(qǐng)求成功怒炸,則放到隊(duì)尾,如果不成功毡代,則需要調(diào)用ProxyFetcherproxy_feedback()方法將結(jié)果進(jìn)行反饋阅羹。這種策略的好處是IP負(fù)載比較均衡。但是缺點(diǎn)在于月趟,IP質(zhì)量參差不齊灯蝴,有的響應(yīng)時(shí)間很快,有的響應(yīng)時(shí)間很慢孝宗,并且高質(zhì)量的免費(fèi)代理IP的生命周期可能很短穷躁,這樣就無(wú)法充分利用。(2)貪婪策略因妇。使用此種策略的時(shí)候问潭,需要爬蟲(chóng)端對(duì)每次請(qǐng)求的響應(yīng)時(shí)間進(jìn)行記錄,每次使用后調(diào)用proxy_feedback()方法以決定該代理IP是否繼續(xù)下一次請(qǐng)求的時(shí)候被使用婚被。如果使用某個(gè)代理IP的響應(yīng)時(shí)間低于傳入的response_time參數(shù)狡忙,那么就會(huì)一直使用它,直到不能用就從代理池中刪除址芯。如果時(shí)間高于了response_time灾茁,那么它會(huì)把該IP放入隊(duì)尾窜觉。概括起來(lái),該策略就是低質(zhì)量IP輪詢(xún)北专,高質(zhì)量IP一直使用禀挫。


上述便是目前關(guān)于haipproxy的代理IP挑選策略的所有細(xì)節(jié)。如果項(xiàng)目對(duì)您有用拓颓,不妨在Github上給個(gè)star语婴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驶睦,隨后出現(xiàn)的幾起案子砰左,更是在濱河造成了極大的恐慌,老刑警劉巖场航,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠导,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡旗闽,警方通過(guò)查閱死者的電腦和手機(jī)酬核,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)适室,“玉大人,你說(shuō)我怎么就攤上這事举瑰〉妨荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵此迅,是天一觀的道長(zhǎng)汽畴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)耸序,這世上最難降的妖魔是什么忍些? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮坎怪,結(jié)果婚禮上罢坝,老公的妹妹穿的比我還像新娘。我一直安慰自己搅窿,他們只是感情好嘁酿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著男应,像睡著了一般闹司。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐飘,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天游桩,我揣著相機(jī)與錄音牲迫,去河邊找鬼。 笑死借卧,一個(gè)胖子當(dāng)著我的面吹牛恩溅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谓娃,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脚乡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滨达?” 一聲冷哼從身側(cè)響起奶稠,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捡遍,沒(méi)想到半個(gè)月后锌订,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡画株,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年辆飘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谓传。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜈项,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出续挟,到底是詐尸還是另有隱情紧卒,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布诗祸,位于F島的核電站跑芳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏直颅。R本人自食惡果不足惜博个,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望功偿。 院中可真熱鬧盆佣,春花似錦、人聲如沸脖含。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)养葵。三九已至征堪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間关拒,已是汗流浹背佃蚜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工庸娱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐算。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓熟尉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洲脂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斤儿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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