国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoDB 4.0 Python3.7 穩(wěn)定高效的評(píng)分制IP代理池APIserver

AndroidTraveler / 2864人閱讀

摘要:項(xiàng)目的主要運(yùn)行部分,采集器驗(yàn)證器打分檢測(cè)等功能實(shí)現(xiàn)的模塊。在中可以配置異步的并發(fā)量等來控制驗(yàn)證器。調(diào)用有了穩(wěn)定的高分代理數(shù)據(jù),那么就可以掛起一個(gè)為我們的爬蟲保駕護(hù)航,這一部分可以多帶帶拿出來編寫,使用其他框架之類的都是不錯(cuò)的選擇。

FooProxy

穩(wěn)健高效的評(píng)分制 IP代理池 + API服務(wù)提供,可以自己插入采集器進(jìn)行代理IP的爬取,支持 MongoDB 4.0 使用 Python3.7

github 地址: FooProxy
背景

因?yàn)槠綍r(shí)爬取某些網(wǎng)站數(shù)據(jù)時(shí),經(jīng)常被封IP,同時(shí)網(wǎng)上很多的接口又不方便,免費(fèi)的也少,穩(wěn)定的更少,所以自己寫了一個(gè)評(píng)分制的ip代理API進(jìn)行爬蟲的供給.
起初對(duì)MySQL和MongoDB進(jìn)行了兼容的編寫,后來發(fā)現(xiàn)在高并發(fā)的情況下,MySQL并不能很好的讀寫數(shù)據(jù),經(jīng)常莫名其妙的出現(xiàn)死機(jī)、讀寫巨慢、緩執(zhí)行等各種奇葩現(xiàn)象,對(duì)比MongoDB高效的數(shù)據(jù)文檔讀寫,最終還是放棄了mysql的兼容。(dev分支保留了對(duì)mysql的部分支持,如爬取評(píng)分)

環(huán)境
開發(fā)環(huán)境

PyCharm 2018.2.4 (Professional Edition)

Python 3.7

MongoDB 4.0

Windows 7 64bits

需安裝的庫(kù)

pymongo

aiohttp

flask

requests

bs4

lxml

項(xiàng)目目錄

APIserver

一個(gè)簡(jiǎn)單的代理API接口服務(wù)器,使用Flask實(shí)現(xiàn),可以自己按需求寫路由邏輯。這部分當(dāng)然可以獨(dú)立出來寫,只是集成寫在了項(xiàng)目里面。

components

項(xiàng)目的主要運(yùn)行部分,采集器、驗(yàn)證器、打分檢測(cè)等功能實(shí)現(xiàn)的模塊。

config

其中的DBsettings是數(shù)據(jù)庫(kù)的設(shè)置,用戶名密碼之類的,以及存儲(chǔ)的數(shù)據(jù)庫(kù)名,還有備用有效數(shù)據(jù)庫(kù)(standby)的自定義名字和高分穩(wěn)定數(shù)據(jù)庫(kù)(stable)的自定義名字。config文件是整個(gè)項(xiàng)目的主要參數(shù)配置,可以設(shè)置采集器采集間隔、驗(yàn)證器的抓取驗(yàn)證數(shù)量間隔和協(xié)程并發(fā)極值等。

const

項(xiàng)目的靜態(tài)配置,一般不用動(dòng)的設(shè)置參數(shù)

custom

自定義模塊,可以編寫自己要增加的爬蟲采集函數(shù)到采集器中進(jìn)行數(shù)據(jù)采集

log

項(xiàng)目日志記錄模塊配置以及日志

tools

一些工具函數(shù)

main.py

項(xiàng)目入口文件

基本流程

整個(gè)項(xiàng)目的流程其實(shí)很簡(jiǎn)單,采集數(shù)據(jù)模塊主要是編寫代理網(wǎng)站的爬蟲,可以進(jìn)行任意的爬蟲增減

采集數(shù)據(jù)

驗(yàn)證數(shù)據(jù)

打分存儲(chǔ)

循環(huán)檢測(cè)

擇優(yōu)剔劣

API調(diào)用

流程圖:

1.采集數(shù)據(jù)(Collector)

采集器進(jìn)程是一個(gè)周期循環(huán),使用了多線程對(duì)每一個(gè)代理網(wǎng)站進(jìn)行數(shù)據(jù)采集,即:一個(gè)代理網(wǎng)站爬蟲一個(gè)線程。因?yàn)闆]有數(shù)據(jù)共享,這里沒有GPL。項(xiàng)目?jī)?nèi)置了兩個(gè)代理數(shù)據(jù)采集爬蟲,一個(gè)是個(gè)人網(wǎng)站的nyloner,一個(gè)是66ip代理網(wǎng)站的爬蟲(在crawlers.py文件中),如果想要增加代理爬蟲,可以自己在custom目錄下的custom.py文件中進(jìn)行增加刪減,只需要保證你的爬蟲返回的結(jié)果數(shù)據(jù)結(jié)構(gòu)和要求的一致就好。如下:

def some_crawler_func():
    """
    自己定義的一個(gè)采集爬蟲
    約定:
        1.無參數(shù)傳入
        2.返回格式是:[":",":",...]
        3.寫完把函數(shù)名加入下面的my_crawlers列表中,如
          my_crawlers = [some_crawler_func,...]
    """
    pass

my_crawlers = []

一個(gè)數(shù)據(jù)采集爬蟲函數(shù)就是一個(gè)采集器,寫完函數(shù)在my_crawlers中加進(jìn)去就可以。在config中設(shè)置一個(gè)周期時(shí)間,就可以讓爬蟲定期采集更新數(shù)據(jù)。

在采集的過程中,如果出現(xiàn)采集器爬蟲被封IP,可以通過自己的APIserver請(qǐng)求代理,然后再繼續(xù)采集,這一部分沒有寫,不過可以實(shí)現(xiàn)

2.驗(yàn)證數(shù)據(jù)(Validator)

采集器進(jìn)程和驗(yàn)證器進(jìn)程共享一個(gè)變量:proxyList,是一個(gè)MultiProcessing.Manger.List對(duì)象。可以在多進(jìn)程中
保持共享數(shù)據(jù)的同步(理論上),采集器定期采集的代理數(shù)據(jù)可以通過proxyList實(shí)時(shí)的傳遞給驗(yàn)證器進(jìn)行有效性驗(yàn)證,因?yàn)椴杉饕淮蝹鬟f的數(shù)據(jù)比較多,所以驗(yàn)證器使用異步驗(yàn)證,能大大提高效率,具體使用自帶的asyncio實(shí)現(xiàn)的.

驗(yàn)證器實(shí)現(xiàn)基本上也是調(diào)用了一個(gè)驗(yàn)證api來判斷代理的有效性,可以自己更換api實(shí)現(xiàn),可在validator.py中詳細(xì)了解。在config中可以配置異步的并發(fā)量等來控制驗(yàn)證器。

3.打分存儲(chǔ)(Rator)

打分器進(jìn)程主要是與驗(yàn)證器配合,當(dāng)采集器采集的數(shù)據(jù)經(jīng)過驗(yàn)證器驗(yàn)證后,確定有效,則讓打分器進(jìn)行評(píng)分,中間可以加入自定義數(shù)據(jù)處理模塊,打分后直接存儲(chǔ)在standby數(shù)據(jù)庫(kù),而后供本地檢測(cè)器進(jìn)行周期檢測(cè),打分器也是一個(gè)周期循環(huán),不斷的對(duì)代理數(shù)據(jù)進(jìn)行更新補(bǔ)充。內(nèi)置在驗(yàn)證器與掃描器中。打分器主要的三個(gè)函數(shù):mark_success,mark_fail,mark_update.


mark_success 對(duì)采集器傳遞給驗(yàn)證器的代理數(shù)據(jù),驗(yàn)證成功后進(jìn)行一次性的評(píng)分并且存儲(chǔ)

mark_fail 對(duì)驗(yàn)證器進(jìn)行驗(yàn)證,代理無效的數(shù)據(jù)進(jìn)行失敗打分處理(達(dá)到刪除條件則刪除,否則扣分更新數(shù)據(jù)庫(kù))

mark_update 對(duì)非初次打分的代理數(shù)據(jù)進(jìn)行更新,即驗(yàn)證有效的數(shù)據(jù)再次驗(yàn)證時(shí)仍有效,則進(jìn)行加分之類的數(shù)據(jù)庫(kù)更新

具體的評(píng)分步驟在下面會(huì)詳細(xì)說明,不過還有很大的提升空間,只是初步試了一下。

4.循環(huán)掃描(Scanner)

當(dāng)驗(yàn)證器的有效數(shù)據(jù)經(jīng)過打分器存進(jìn)本地standby數(shù)據(jù)庫(kù)中后,怎么保證這一次存進(jìn)去的數(shù)據(jù)以后能保證調(diào)用時(shí)仍可用呢?使用掃描器周期循環(huán)檢測(cè)!掃描器會(huì)在你給定的掃描周期間隔不斷地對(duì)本地standby數(shù)據(jù)庫(kù)進(jìn)行掃描驗(yàn)證,無效的數(shù)據(jù)則直接刪除,有效的數(shù)據(jù)會(huì)對(duì)其得分、響應(yīng)時(shí)間、驗(yàn)證時(shí)間等字段進(jìn)行及時(shí)的更新,保證代理數(shù)據(jù)的實(shí)時(shí)有效。

在掃描器內(nèi)部其實(shí)也是有一個(gè)驗(yàn)證函數(shù)來進(jìn)行掃描驗(yàn)證。詳見scanner.py

5.擇優(yōu)剔劣(Detector)

存儲(chǔ)在standby數(shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)過掃描器的掃描檢測(cè),可以保證其有效性,當(dāng)是如果想要穩(wěn)定的代理供給APIserver,那么必須有一個(gè)檢測(cè)器來進(jìn)行挑揀代理,Detector會(huì)周期性的進(jìn)行掃描standby和stable兩個(gè)數(shù)據(jù)庫(kù),對(duì)其中符合高分穩(wěn)定條件的代理存進(jìn)stable數(shù)據(jù)庫(kù),對(duì)失效的高分代理進(jìn)行剔除,這些都可以在config中進(jìn)行自定義配置高分穩(wěn)定條件。如:

#采集器采集數(shù)據(jù)時(shí)間間隔,單位:秒
COLLECT_TIME_GAP    = 3600*1
#驗(yàn)證器的最大并發(fā)量
CONCURRENCY         = 100
#驗(yàn)證器一次取出多少條 抓取的 代理進(jìn)行驗(yàn)證
VALIDATE_AMOUNT     = 500
#驗(yàn)證器驗(yàn)證抓取數(shù)據(jù)頻率 : 秒/次
VALIDATE_F          = 5
#驗(yàn)證器請(qǐng)求超時(shí)重試次數(shù)
VALIDATE_RETRY      = 5
#掃描器的最大并發(fā)協(xié)程數(shù)量
COROUTINE_MAX       = 300
#掃描器一次取出多少條 本地庫(kù) 的代理進(jìn)行驗(yàn)證
LOCAL_AMOUNT        = 500
#掃描器驗(yàn)證本地庫(kù)頻率 : 秒/次
VALIDATE_LOCAL      = 60*1
#檢測(cè)器檢測(cè)數(shù)據(jù)庫(kù)的頻率: 秒/次
DETECT_LOCAL        = 60*1
#檢測(cè)器一次取出多少條有效庫(kù)的代理進(jìn)行篩選
DETECT_AMOUNT       = 1000
#檢測(cè)器一次取出多少條高分穩(wěn)定數(shù)據(jù)庫(kù)的代理進(jìn)行檢測(cè)
DETECT_HIGH_AMOUNT  = 1000
#高分穩(wěn)定數(shù)據(jù)庫(kù)代理數(shù)據(jù)連續(xù)多少次無效則從穩(wěn)定數(shù)據(jù)庫(kù)中剔除
DELETE_COMBO        = 30
#代理IP成功率的最低要求,低于此要求均刪除,100次周期測(cè)試 0.2=20%
MIN_SUCCESS_RATE    = 0.2
#有效代理數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)至高分穩(wěn)定數(shù)據(jù)庫(kù)的成功率最低要求 0.8=80%
#以及測(cè)試總數(shù)的最低要求
STABLE_MIN_RATE     = 0.8500
STABLE_MIN_COUNT    = 100

因?yàn)槭菍?duì)本地?cái)?shù)據(jù)庫(kù)的io操作,使用了異步asyncio可以大大提高效率。

6.API調(diào)用(APIserver)

有了穩(wěn)定的高分代理數(shù)據(jù),那么就可以掛起一個(gè)api server為我們的爬蟲保駕護(hù)航,這一部分可以多帶帶拿出來編寫,使用其他框架django之類的都是不錯(cuò)的選擇。項(xiàng)目里只是為了演示使用,使用Flask進(jìn)行了簡(jiǎn)單的路由設(shè)置,因?yàn)闇y(cè)試爬蟲在本機(jī),所以使用了下面幾個(gè)api而已,具體可以自己擴(kuò)展。

root = "http://localhost:5000"
# 請(qǐng)求代理 kind為代理種類,anony為高匿,normal為透明
root+"/proxy/"
# 請(qǐng)求代理 直接返回一個(gè)高匿代理
root+"/proxy"

可以在apiserver.py中自己實(shí)現(xiàn)路由。

評(píng)分

簡(jiǎn)單的評(píng)分可以使代理ip篩選更加簡(jiǎn)單,其中的具體設(shè)置可以再const.settings中更改,一個(gè)代理IP數(shù)據(jù)的得分主要是:

一次請(qǐng)求的基礎(chǔ)分 score-basic :100-10x(響應(yīng)時(shí)間-1)

請(qǐng)求成功的得分 score-success : (基礎(chǔ)分+測(cè)試總數(shù)x上一次分?jǐn)?shù))/(測(cè)試總數(shù)+1)+自定義成功加分?jǐn)?shù)x成功率x連續(xù)成功數(shù)

請(qǐng)求失敗的得分 score-fail : (基礎(chǔ)分+測(cè)試總數(shù)x上一次分?jǐn)?shù))/(測(cè)試總數(shù)+1)-自定義失敗減分?jǐn)?shù)x失敗率x連續(xù)失敗數(shù)

穩(wěn)定性 stability : 得分x成功率x測(cè)試數(shù)/自定義精度

與三個(gè)變量成正比的穩(wěn)定性根據(jù)得分設(shè)置可以很快的兩極化穩(wěn)定與不穩(wěn)定的代理,從而進(jìn)行篩選。

使用

確保本機(jī)安裝MongoDB,并且下載好所有需要安裝庫(kù),python3.7

可以先進(jìn)行自定義的模式,在config中進(jìn)行配置,可以運(yùn)行多帶帶的模塊進(jìn)行測(cè)試,如:

 #運(yùn)行模式,置 1 表示運(yùn)行,置 0 表示 不運(yùn)行,全置 0 表示只運(yùn)行 API server
  MODE = {
   "Collector" : 1,    #代理采集
   "Validator" : 1,    #驗(yàn)證存儲(chǔ)
   "Scanner"   : 1,    #掃描本地庫(kù)
   "Detector"  : 1,    #高分檢測(cè)
 }

可以在config中的DBsettings配置好數(shù)據(jù)庫(kù)設(shè)置

按照自己需求更改評(píng)分量(const.setting中,默認(rèn)不用更改)

配置后可以直接在DOS下或PyCharm等有標(biāo)準(zhǔn)stdout的環(huán)境下運(yùn)行 python main.py

運(yùn)行一段時(shí)間就可以看到穩(wěn)定的效果

不足

穩(wěn)定性沒有很好的標(biāo)準(zhǔn)判斷,不過100次測(cè)試85%以上的成功率就已經(jīng)很好了

沒有編寫驗(yàn)證器與API服務(wù)器的超時(shí)請(qǐng)求代理功能

API 服務(wù)器沒有多帶帶拿出來編寫

還沒有加入存活時(shí)間的考量

還沒接入爬蟲測(cè)試

...

效果

備用有效數(shù)據(jù)庫(kù),開啟1.5個(gè)小時(shí)后:

高分穩(wěn)定數(shù)據(jù)庫(kù)

后話

比較符合預(yù)期

經(jīng)過連續(xù)6天的測(cè)試,程序運(yùn)行正常

備用有效數(shù)據(jù)庫(kù)與高分穩(wěn)定數(shù)據(jù)庫(kù)的同步更新誤差在5分鐘左右

只有一個(gè)數(shù)據(jù)采集爬蟲的情況下,一個(gè)小時(shí)采集一次,一次1000條數(shù)據(jù)[采集66ip代理網(wǎng)],8個(gè)小時(shí)內(nèi)穩(wěn)定的有效代理995左右,高分穩(wěn)定的有200條左右,主要在于代理網(wǎng)站的質(zhì)量

經(jīng)過并發(fā)爬蟲測(cè)試,可以使用到實(shí)際項(xiàng)目中

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42612.html

相關(guān)文章

  • MongoDB 4.0 Python3.7 穩(wěn)定高效評(píng)分IP代理APIserver

    摘要:項(xiàng)目的主要運(yùn)行部分,采集器驗(yàn)證器打分檢測(cè)等功能實(shí)現(xiàn)的模塊。在中可以配置異步的并發(fā)量等來控制驗(yàn)證器。調(diào)用有了穩(wěn)定的高分代理數(shù)據(jù),那么就可以掛起一個(gè)為我們的爬蟲保駕護(hù)航,這一部分可以單獨(dú)拿出來編寫,使用其他框架之類的都是不錯(cuò)的選擇。 FooProxy 穩(wěn)健高效的評(píng)分制 IP代理池 + API服務(wù)提供,可以自己插入采集器進(jìn)行代理IP的爬取,支持 MongoDB 4.0 使用 Python3....

    wangjuntytl 評(píng)論0 收藏0
  • 8、web爬蟲講解2—urllib庫(kù)爬蟲—ip代理—用戶代理ip代理結(jié)合應(yīng)用

    摘要:百度云搜索搜網(wǎng)盤淘寶券使用代理格式化,第一個(gè)參數(shù),請(qǐng)求目標(biāo)可能是或者對(duì)應(yīng)設(shè)置初始化將代理設(shè)置成全局當(dāng)使用請(qǐng)求時(shí)自動(dòng)使用代理引入隨機(jī)模塊文件格式化注意第一個(gè)參數(shù)可能是或者,對(duì)應(yīng)設(shè)置初始化將代理設(shè)置成全局當(dāng)使用請(qǐng)求時(shí)自動(dòng)使用代理請(qǐng)求 【百度云搜索:http://bdy.lqkweb.com】 【搜網(wǎng)盤:http://www.swpan.cn】 【淘寶券:http://www.tbquan....

    mrcode 評(píng)論0 收藏0
  • Kubernetes Master High Availability 高級(jí)實(shí)踐

    摘要:才云科技云開源高級(jí)工程師唐繼元受邀社群,在線分享高級(jí)實(shí)踐,介紹如何構(gòu)建環(huán)境。除命令外的停止都是異常停止。 才云科技云開源高級(jí)工程師唐繼元受邀DBAplus社群,在線分享《Kubernetes Master High Availability 高級(jí)實(shí)踐》,介紹如何構(gòu)建Kubernetes Master High Availability環(huán)境。 以下是分享實(shí)錄: 大家好,我是才云科技的唐繼...

    JiaXinYi 評(píng)論0 收藏0
  • 從應(yīng)用到平臺(tái) - 云服務(wù)架構(gòu)演進(jìn)過程

    摘要:應(yīng)用的研發(fā)上線運(yùn)維運(yùn)營(yíng)形成閉環(huán),順利完成從對(duì)內(nèi)服務(wù)到公共平臺(tái)的升級(jí)。從功能角度,只能支持靜態(tài)方式設(shè)置反向代理,然后,而平臺(tái)有服務(wù)對(duì)應(yīng)的后端服務(wù)和端口是有動(dòng)態(tài)調(diào)整需求。架構(gòu)上是基礎(chǔ)組件需要進(jìn)行升級(jí),數(shù)據(jù)訪問層日志監(jiān)控系統(tǒng)等。 介紹 ? ? ? ?MaxLeap早期是一家研發(fā)、運(yùn)營(yíng)移動(dòng)應(yīng)用和手機(jī)游戲公司,發(fā)展過程中積累了很多通用組件。這些組件很大程度幫公司在移動(dòng)研發(fā)過程中節(jié)省了時(shí)間和成本,...

    LiangJ 評(píng)論0 收藏0
  • 9、web爬蟲講解2—urllib庫(kù)爬蟲—實(shí)戰(zhàn)爬取搜狗微信公眾號(hào)—抓包軟件安裝Fiddler4講解

    摘要:隨后,為了保險(xiǎn),重啟,火狐瀏覽器也重啟一下,然后開始抓的包,此時(shí)你會(huì)發(fā)現(xiàn)你的連接并不安全等類似提示已經(jīng)消失,并且已經(jīng)能夠抓包了。 【百度云搜索,搜各種資料:http://www.bdyss.com】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 封裝模塊 #!/usr/bin/env?python #?-*-?coding:?utf-8?-*- import?urll...

    go4it 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

AndroidTraveler

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<