爬蟲福音:GitHub 超火爆開源 IP 代理池!
↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能
后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包
經(jīng)常有粉絲在后臺(tái)留言,問:大佬,運(yùn)行你的爬蟲程序怎么報(bào)錯(cuò)了?
我讓他把報(bào)錯(cuò)信息發(fā)過來,看過之后一聲嘆息。
大多數(shù)粉絲是直接拿著代碼就開始運(yùn)行,然后就是等待結(jié)果,完全不去仔細(xì)閱讀和理解源碼,遇到報(bào)錯(cuò)就直接過來詢問。
多數(shù)爬蟲源碼運(yùn)行的報(bào)錯(cuò)都是由于訪問目標(biāo)網(wǎng)站過于頻繁,從而導(dǎo)致目標(biāo)網(wǎng)站返回錯(cuò)誤或者沒有數(shù)據(jù)返回。
目前大多數(shù)網(wǎng)站都是有反爬措施的,如果 IP 在一定時(shí)間內(nèi) 請(qǐng)求次數(shù)超過了一定的閾值就會(huì)觸發(fā)反爬措施,拒絕訪問,也就是我們經(jīng)常聽到的“封IP”。
那么怎么解決這個(gè)問題呢?
一種解決辦法就是降低訪問頻率,訪問一次就等待一定時(shí)長,然后再次訪問。這種方法對(duì)于反爬措施不嚴(yán)格的網(wǎng)站是有效的。
如果遇到反爬措施嚴(yán)格的網(wǎng)站,訪問次數(shù)多了還是會(huì)被封殺。而且有時(shí)候你需要爬取數(shù)據(jù),這種解決辦法會(huì)使獲取數(shù)據(jù)的周期特別長。
第二種解決辦法就是使用代理 IP。我不斷地切換 IP 訪問,讓目標(biāo)網(wǎng)站認(rèn)為是不同的用戶在訪問,從而繞過反爬措施。這也是最常見的方式。
接著,我們又面臨一個(gè)問題:哪來這么多獨(dú)立 IP 地址呢?
最省事的方式當(dāng)然是花錢買服務(wù),這種花錢買到的 IP 一般都是比較穩(wěn)定可靠的。
今天我們來聊一下不花錢免費(fèi)獲取代理 IP 的方式。
ProxyPool 簡介
ProxyPool 是一個(gè)爬蟲的代理 IP 池,主要功能為定時(shí)采集網(wǎng)上發(fā)布的免費(fèi)代理驗(yàn)證入庫,定時(shí)驗(yàn)證入庫的代理保證代理的可用性,提供API和CLI兩種使用方式。
同時(shí)你也可以擴(kuò)展代理源以增加代理池IP的質(zhì)量和數(shù)量。
獲取項(xiàng)目
我們可以通過兩種方式獲取 ProxyPool 項(xiàng)目。
第一種是通過命令行下載:
git clone [email protected]:jhao104/proxy_pool.git
第二種是下載對(duì)應(yīng)的 zip 壓縮包:

安裝依賴
我們獲取到項(xiàng)目之后,進(jìn)入到項(xiàng)目的根目錄,運(yùn)行下面的代碼來安裝項(xiàng)目所需的依賴包:
pip install -r requirements.txt
修改配置文件
要在本地運(yùn)行項(xiàng)目,我們需要針對(duì)本地環(huán)境修改一些配置。打開項(xiàng)目中的 setting.py 這個(gè)文件,根據(jù)自己本地的環(huán)境和要求修改配置。
#?setting.py?為項(xiàng)目配置文件
#?配置API服務(wù)
HOST?=?"0.0.0.0"???????????????#?IP
PORT?=?5000????????????????????#?監(jiān)聽端口
#?配置數(shù)據(jù)庫
DB_CONN?=?'redis://:[email protected]:8888/0'
#?配置?ProxyFetcher
PROXY_FETCHER?=?[
????"freeProxy01",??????#?這里是啟用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py
????"freeProxy02",
????#?....
]
主要修改的幾項(xiàng)配置是監(jiān)聽端口(PORT)、 Redis 數(shù)據(jù)庫的配置(DB_CONN)和啟用的代理方法名(PROXY_FETCHER)。
啟動(dòng)項(xiàng)目
修改完配置之后,我們就可以愉快地使用了。
這個(gè)項(xiàng)目總體分為兩個(gè)部分:爬取代理 IP 和 取用代理 IP。
如果你要啟用爬取代理 IP 的服務(wù),直接運(yùn)行下面命令:
python proxyPool.py schedule
啟動(dòng)之后,你就可以看到如下的控制臺(tái)信息了:

程序每隔一段時(shí)間就會(huì)定時(shí)爬取一下,直到我們的 IP 池里面有一定數(shù)量的可用 IP 。
其實(shí),作者在這個(gè)項(xiàng)目中運(yùn)用的原來就是到一些免費(fèi)的代理網(wǎng)站采集 IP,然后測試 IP 的可用性,可用的就存入 Redis 中,不可用就丟棄。
所以你完全可以自己寫一套程序?qū)崿F(xiàn)這個(gè)邏輯。
使用代理 IP
要使用代理 IP,你需要啟動(dòng) webApi 服務(wù):
python proxyPool.py server
啟動(dòng)web服務(wù)后, 默認(rèn)配置下會(huì)開啟 http://127.0.0.1:5010 的api接口服務(wù):

如果要在爬蟲代碼中使用的話, 可以將此api封裝成函數(shù)直接使用,例如:
import?requests
def?get_proxy():
????return?requests.get("http://127.0.0.1:5010/get/").json()
def?delete_proxy(proxy):
????requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
#?your?spider?code
def?getHtml():
????#?....
????retry_count?=?5
????proxy?=?get_proxy().get("proxy")
????while?retry_count?>?0:
????????try:
????????????html?=?requests.get('http://www.example.com',?proxies={"http":?"http://{}".format(proxy)})
????????????#?使用代理訪問
????????????return?html
????????except?Exception:
????????????retry_count?-=?1
????#?刪除代理池中代理
????delete_proxy(proxy)
????return?None
總結(jié)
作為學(xué)習(xí)使用的 IP 代理池,這項(xiàng)目獲取的足夠使用了,但是對(duì)于一些復(fù)雜的爬蟲項(xiàng)目或者商業(yè)項(xiàng)目的話,可能比較夠嗆,畢竟這種爬取的免費(fèi)代理質(zhì)量肯定沒有那么好,不穩(wěn)定是正常的。


