最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬蟲代理IP池實現(xiàn)方法

 更新時間:2017年01月05日 22:20:05   作者:Jhao  
在公司做分布式深網(wǎng)爬蟲,搭建了一套穩(wěn)定的代理池服務(wù),為上千個爬蟲提供有效的代理,保證各個爬蟲拿到的都是對應(yīng)網(wǎng)站有效的代理IP,從而保證爬蟲快速穩(wěn)定的運行,所以就想利用一些免費的資源搞一個簡單的代理池服務(wù)。

在公司做分布式深網(wǎng)爬蟲,搭建了一套穩(wěn)定的代理池服務(wù),為上千個爬蟲提供有效的代理,保證各個爬蟲拿到的都是對應(yīng)網(wǎng)站有效的代理IP,從而保證爬蟲快速穩(wěn)定的運行,當(dāng)然在公司做的東西不能開源出來。不過呢,閑暇時間手癢,所以就想利用一些免費的資源搞一個簡單的代理池服務(wù)。

1、問題

代理IP從何而來?
剛自學(xué)爬蟲的時候沒有代理IP就去西刺、快代理之類有免費代理的網(wǎng)站去爬,還是有個別代理能用。當(dāng)然,如果你有更好的代理接口也可以自己接入。   免費代理的采集也很簡單,無非就是:訪問頁面頁面 —> 正則/xpath提取 —> 保存

如何保證代理質(zhì)量?
可以肯定免費的代理IP大部分都是不能用的,不然別人為什么還提供付費的(不過事實是很多代理商的付費IP也不穩(wěn)定,也有很多是不能用)。所以采集回來的代理IP不能直接使用,可以寫檢測程序不斷的去用這些代理訪問一個穩(wěn)定的網(wǎng)站,看是否可以正常使用。這個過程可以使用多線程或異步的方式,因為檢測代理是個很慢的過程。

采集回來的代理如何存儲?
這里不得不推薦一個高性能支持多種數(shù)據(jù)結(jié)構(gòu)的NoSQL數(shù)據(jù)庫SSDB,用于代理Redis。支持隊列、hash、set、k-v對,支持T級別數(shù)據(jù)。是做分布式爬蟲很好中間存儲工具。

如何讓爬蟲更簡單的使用這些代理?
答案肯定是做成服務(wù)咯,python有這么多的web框架,隨便拿一個來寫個api供爬蟲調(diào)用。這樣有很多好處,比如:當(dāng)爬蟲發(fā)現(xiàn)代理不能使用可以主動通過api去delete代理IP,當(dāng)爬蟲發(fā)現(xiàn)代理池IP不夠用時可以主動去refresh代理池。這樣比檢測程序更加靠譜。

2、代理池設(shè)計

代理池由四部分組成:

ProxyGetter:
代理獲取接口,目前有5個免費代理源,每調(diào)用一次就會抓取這個5個網(wǎng)站的最新代理放入DB,可自行添加額外的代理獲取接口;

DB:
用于存放代理IP,現(xiàn)在暫時只支持SSDB。至于為什么選擇SSDB,大家可以參考這篇文章,個人覺得SSDB是個不錯的Redis替代方案,如果你沒有用過SSDB,安裝起來也很簡單,可以參考這里;

Schedule:
計劃任務(wù)用戶定時去檢測DB中的代理可用性,刪除不可用的代理。同時也會主動通過ProxyGetter去獲取最新代理放入DB;

ProxyApi:
代理池的外部接口,由于現(xiàn)在這么代理池功能比較簡單,花兩個小時看了下Flask,愉快的決定用Flask搞定。功能是給爬蟲提供get/delete/refresh等接口,方便爬蟲直接使用。

設(shè)計

[HTML_REMOVED] 設(shè)計

3、代碼模塊

Python中高層次的數(shù)據(jù)結(jié)構(gòu),動態(tài)類型和動態(tài)綁定,使得它非常適合于快速應(yīng)用開發(fā),也適合于作為膠水語言連接已有的軟件部件。用Python來搞這個代理IP池也很簡單,代碼分為6個模塊:

Api:   api接口相關(guān)代碼,目前api是由Flask實現(xiàn),代碼也非常簡單。客戶端請求傳給Flask,F(xiàn)lask調(diào)用ProxyManager中的實現(xiàn),包括get/delete/refresh/get_all;

DB:   數(shù)據(jù)庫相關(guān)代碼,目前數(shù)據(jù)庫是采用SSDB。代碼用工廠模式實現(xiàn),方便日后擴(kuò)展其他類型數(shù)據(jù)庫;

Manager:   get/delete/refresh/get_all等接口的具體實現(xiàn)類,目前代理池只負(fù)責(zé)管理proxy,日后可能會有更多功能,比如代理和爬蟲的綁定,代理和賬號的綁定等等;

ProxyGetter:   代理獲取的相關(guān)代碼,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia這個五個網(wǎng)站的免費代理,經(jīng)測試這個5個網(wǎng)站每天更新的可用代理只有六七十個,當(dāng)然也支持自己擴(kuò)展代理接口;

Schedule:   定時任務(wù)相關(guān)代碼,現(xiàn)在只是實現(xiàn)定時去刷新代碼,并驗證可用代理,采用多進(jìn)程方式;

Util:   存放一些公共的模塊方法或函數(shù),包含GetConfig:讀取配置文件config.ini的類,ConfigParse: 集成重寫ConfigParser的類,使其對大小寫敏感, Singleton:實現(xiàn)單例,LazyProperty:實現(xiàn)類屬性惰性計算。等等;

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

4、安裝

下載代碼:

git clone git@github.com:jhao104/proxy_pool.git

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

安裝依賴:

pip install -r requirements.txt

啟動:

需要分別啟動定時任務(wù)和api
到Config.ini中配置你的SSDB

到Schedule目錄下:
>>>python ProxyRefreshSchedule.py

到Api目錄下:
>>>python ProxyApi.py

5、使用

定時任務(wù)啟動后,會通過代理獲取方法fetch所有代理放入數(shù)據(jù)庫并驗證。此后默認(rèn)每20分鐘會重復(fù)執(zhí)行一次。定時任務(wù)啟動大概一兩分鐘后,便可在SSDB中看到刷新出來的可用的代理:

useful_proxy

啟動ProxyApi.py后即可在瀏覽器中使用接口獲取代理,一下是瀏覽器中的截圖:
index頁面:


index

get頁面:


get

get_all頁面:


get_all

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

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、最后

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

項目地址:https://github.com/jhao104/proxy_pool

相關(guān)文章

  • 詳解PyQt5?事件處理機(jī)制

    詳解PyQt5?事件處理機(jī)制

    PyQt為事件處理提供了兩種機(jī)制高級的信號與槽機(jī)制,以及低級的事件處理機(jī)制,這篇文章主要介紹了PyQt5?事件處理機(jī)制,需要的朋友可以參考下
    2022-11-11
  • 10行Python代碼實現(xiàn)Web自動化管控的示例代碼

    10行Python代碼實現(xiàn)Web自動化管控的示例代碼

    這篇文章主要介紹了10行Python代碼實現(xiàn)Web自動化管控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python 中使用 Selenium 單擊網(wǎng)頁按鈕功能

    Python 中使用 Selenium 單擊網(wǎng)頁按鈕功能

    Selenium是一個用于測試網(wǎng)站的自動化測試工具,支持各種瀏覽器包括Chrome、Firefox、Safari等主流界面瀏覽器,同時也支持phantomJS無界面瀏覽器,本篇文章將介紹如何在 Python 中使用 selenium 單擊網(wǎng)頁上的按鈕,感興趣的朋友一起看看吧
    2023-11-11
  • Tornado Application的實現(xiàn)

    Tornado Application的實現(xiàn)

    本文主要介紹了Tornado Application的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • python數(shù)字圖像處理skimage讀取顯示與保存圖片

    python數(shù)字圖像處理skimage讀取顯示與保存圖片

    這篇文章主要為大家介紹了python數(shù)字圖像處理使用skimage讀取顯示與保存圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)詳解

    Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)詳解

    本文給大家匯總介紹了Python中的5種內(nèi)建數(shù)據(jù)結(jié)構(gòu)以及操作示例,非常的詳細(xì),有需要的小伙伴可以參考下。
    2016-02-02
  • Python中if語句的使用方法及實例代碼

    Python中if語句的使用方法及實例代碼

    if語句能夠進(jìn)行條件測試,并依據(jù)一定的條件進(jìn)行具體的操作,下面這篇文章主要給大家介紹了關(guān)于Python中if語句的使用方法及實例代碼,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 使用Python破解RAR文件密碼的代碼實例

    使用Python破解RAR文件密碼的代碼實例

    這篇文章主要介紹了使用Python破解RAR文件密碼的代碼實例,rar 壓縮文件資源又不少是被加密的,密碼通常也比較簡單,我們可以通過暴力破解的方式來獲取,通常耗時也比較小,需要的朋友可以參考下
    2023-11-11
  • Python腳本激活Linux密碼的方法(crypt模塊)

    Python腳本激活Linux密碼的方法(crypt模塊)

    今天小編給大家分享一個非常不錯的方法破解linux口令,主要是利用linux系統(tǒng)中的crypt模塊模擬了linux系統(tǒng)中用戶密碼的加密,操作也很方便,對python破解linux口令相關(guān)知識感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解

    Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解

    這篇文章主要為大家介紹了Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評論

桑植县| 进贤县| 孟津县| 会昌县| 台前县| 阳朔县| 石门县| 平塘县| 贵南县| 柘城县| 铁岭县| 东光县| 栾城县| 佛学| 沂源县| 灵台县| 砀山县| 宁波市| 永清县| 常德市| 鸡东县| 自治县| 惠水县| 建宁县| 浙江省| 湖口县| 巴塘县| 禹州市| 宜州市| 宁夏| 眉山市| 灵寿县| 扬州市| 信阳市| 清远市| 阆中市| 临夏县| 遂平县| 峨眉山市| 福安市| 吉安市|