成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

wangjuntytl / 1115人閱讀

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

FooProxy

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

github 地址: FooProxy
背景

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

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

PyCharm 2018.2.4 (Professional Edition)

Python 3.7

MongoDB 4.0

Windows 7 64bits

需安裝的庫

pymongo

aiohttp

flask

requests

bs4

lxml

項目目錄

APIserver

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

components

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

config

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

const

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

custom

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

log

項目日志記錄模塊配置以及日志

tools

一些工具函數(shù)

main.py

項目入口文件

基本流程

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

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

驗證數(shù)據(jù)

打分存儲

循環(huán)檢測

擇優(yōu)剔劣

API調(diào)用

流程圖:

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

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

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

my_crawlers = []

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

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

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

采集器進程和驗證器進程共享一個變量:proxyList,是一個MultiProcessing.Manger.List對象??梢栽诙噙M程中
保持共享數(shù)據(jù)的同步(理論上),采集器定期采集的代理數(shù)據(jù)可以通過proxyList實時的傳遞給驗證器進行有效性驗證,因為采集器一次傳遞的數(shù)據(jù)比較多,所以驗證器使用異步驗證,能大大提高效率,具體使用自帶的asyncio實現(xiàn)的.

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

3.打分存儲(Rator)

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


mark_success 對采集器傳遞給驗證器的代理數(shù)據(jù),驗證成功后進行一次性的評分并且存儲

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

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

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

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

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

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

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

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

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

因為是對本地數(shù)據(jù)庫的io操作,使用了異步asyncio可以大大提高效率。

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

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

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

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

評分

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

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

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

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

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

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

使用

確保本機安裝MongoDB,并且下載好所有需要安裝庫,python3.7

可以先進行自定義的模式,在config中進行配置,可以運行多帶帶的模塊進行測試,如:

 #運行模式,置 1 表示運行,置 0 表示 不運行,全置 0 表示只運行 API server
  MODE = {
   "Collector" : 1,    #代理采集
   "Validator" : 1,    #驗證存儲
   "Scanner"   : 1,    #掃描本地庫
   "Detector"  : 1,    #高分檢測
 }

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

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

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

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

不足

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

沒有編寫驗證器與API服務(wù)器的超時請求代理功能

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

還沒有加入存活時間的考量

還沒接入爬蟲測試

...

效果

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

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

后話

比較符合預(yù)期

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19382.html

相關(guān)文章

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

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

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

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

    mrcode 評論0 收藏0
  • Kubernetes Master High Availability 高級實踐

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

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

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

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

    摘要:隨后,為了保險,重啟,火狐瀏覽器也重啟一下,然后開始抓的包,此時你會發(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 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<