亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解Python爬蟲(chóng)代理池服務(wù)

 更新時(shí)間:2018年02月28日 14:24:40   投稿:mrr  
這篇文章主要介紹了Python爬蟲(chóng)代理池服務(wù)的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

在公司做分布式深網(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就去西刺、快代理之類有免費(fèi)代理的網(wǎng)站去爬,還是有個(gè)別代理能用。當(dāng)然,如果你有更好的代理接口也可以自己接入。

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

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

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

3、代碼模塊

Python中高層次的數(shù)據(jù)結(jié)構(gòu),動(dòng)態(tà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)單??蛻舳苏?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。代碼用工廠模式實(shí)現(xiàn),方便日后擴(kuò)展其他類型數(shù)據(jù)庫(kù);

Manager:

get/delete/refresh/get_all等接口的具體實(shí)現(xiàn)類,目前代理池只負(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的類,ConfigParse: 集成重寫(xiě)ConfigParser的類,使其對(duì)大小寫(xiě)敏感, Singleton:實(shí)現(xiàn)單例,LazyProperty:實(shí)現(xiàn)類屬性惰性計(jì)算。等等;

其他文件:

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

4、安裝

下載代碼:

Python

git clone git@github.com:jhao104/proxy_pool.git
或者直接到https://github.com/jhao104/proxy_pool 下載zip文件
git clone git@github.com:jhao104/proxy_pool.git
或者直接到https://github.com/jhao104/proxy_pool 下載zip文件

安裝依賴:

Python

pip install -r requirements.txt
pip install -r requirements.txt

啟動(dòng):

Python

需要分別啟動(dòng)定時(shí)任務(wù)和api
到Config.ini中配置你的SSDB
到Schedule目錄下:
>>>python ProxyRefreshSchedule.py
到Api目錄下:
>>>python ProxyApi.py
需要分別啟動(dòng)定時(shí)任務(wù)和api
到Config.ini中配置你的SSDB
到Schedule目錄下:
>>>python ProxyRefreshSchedule.py
到Api目錄下:
>>>python ProxyApi.py

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)的可用的代理:

useful_proxy

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

index頁(yè)面:

get頁(yè)面:


get_all頁(yè)面:

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

Python

import requests
def get_proxy():
 return requests.get("http://127.0.0.1:5000/get/").content
def delete_proxy(proxy):
 requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))
# your spider code
def spider():
 # ....
 requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)})
 # ....
import requests
def get_proxy():
 return requests.get("http://127.0.0.1:5000/get/").content
def delete_proxy(proxy):
 requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))
# your spider code
def spider():
 # ....
 requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)})
 # ....

6、最后

時(shí)間倉(cāng)促,功能和代碼都比較簡(jiǎn)陋,以后有時(shí)間再改進(jìn)。喜歡的在github上給個(gè)star。感謝!

github項(xiàng)目地址:https://github.com/jhao104/proxy_pool

總結(jié)

以上所述是小編給大家介紹的Python爬蟲(chóng)代理池服務(wù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • python面試題之列表聲明實(shí)例分析

    python面試題之列表聲明實(shí)例分析

    這篇文章主要介紹了python面試題之列表聲明,結(jié)合實(shí)例形式分析了Python列表的聲明、計(jì)算相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 詳解Python調(diào)用華為API實(shí)現(xiàn)圖像標(biāo)簽

    詳解Python調(diào)用華為API實(shí)現(xiàn)圖像標(biāo)簽

    華為云圖像標(biāo)簽可識(shí)別上千種通用物體以及數(shù)百種場(chǎng)景標(biāo)簽,一個(gè)圖像可包含多個(gè)標(biāo)簽內(nèi)容,語(yǔ)義內(nèi)容非常豐富。本文將通過(guò)Python調(diào)用華為API實(shí)現(xiàn)圖像標(biāo)簽,需要的可以參考一下
    2022-04-04
  • 提高python代碼可讀性利器pycodestyle使用詳解

    提高python代碼可讀性利器pycodestyle使用詳解

    鑒于 Python 在數(shù)據(jù)科學(xué)中的流行,我將深入研究 pycodestyle 的使用方法,以提高 Python 代碼的質(zhì)量和可讀性。如果你想提升代碼質(zhì)量,歡迎收藏學(xué)習(xí),有所收獲,點(diǎn)贊支持
    2021-11-11
  • 什么是python類屬性

    什么是python類屬性

    在本篇文章里小編給大家分享了關(guān)于python類屬性的相關(guān)知識(shí)點(diǎn),需要的朋友們可以參考學(xué)習(xí)下。
    2020-06-06
  • Python實(shí)現(xiàn)發(fā)送email的幾種常用方法

    Python實(shí)現(xiàn)發(fā)送email的幾種常用方法

    這篇文章主要介紹了Python實(shí)現(xiàn)發(fā)送email的幾種常用方法,非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • django雙下劃線的具體使用

    django雙下劃線的具體使用

    雙下劃線約定通常用于執(zhí)行一些特定的查詢操作,本文主要介紹了django雙下劃線的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • python實(shí)現(xiàn)通訊錄系統(tǒng)

    python實(shí)現(xiàn)通訊錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解

    這篇文章主要介紹了Python數(shù)字圖像處理之霍夫線變換實(shí)現(xiàn)詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python變量不能以數(shù)字打頭詳解

    python變量不能以數(shù)字打頭詳解

    下面小編就為大家?guī)?lái)一篇python變量不能以數(shù)字打頭詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家。也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Python?Pygame實(shí)戰(zhàn)之紅心大戰(zhàn)游戲的實(shí)現(xiàn)

    Python?Pygame實(shí)戰(zhàn)之紅心大戰(zhàn)游戲的實(shí)現(xiàn)

    說(shuō)起Windows自帶的游戲,相信許多80、90后的朋友都不陌生。本文就將利用Python中的Pygame模塊實(shí)現(xiàn)一下windows經(jīng)典游戲之一的紅心大戰(zhàn),需要的可以參考一下
    2022-02-02

最新評(píng)論