為什么需要代理池
在爬取網(wǎng)站信息的過程中,有些網(wǎng)站為了防止爬蟲婚肆,可能會(huì)限制每個(gè)ip的訪問速度或訪問次數(shù)。對于限制訪問速度的情況木柬,我們可以通過time.sleep進(jìn)行短暫休眠后再次爬取慧脱。對于限制ip訪問次數(shù)的時(shí)候我們需要通過代理ip輪換去訪問目標(biāo)網(wǎng)址。所以建立并維護(hù)好一個(gè)有效的代理ip池也是爬蟲的一個(gè)準(zhǔn)備工作仅炊。
如何構(gòu)建一個(gè)代理池
安裝
安裝Python
至少Python3.5以上
安裝Redis
安裝好之后將Redis服務(wù)開啟
配置代理池
cd proxypool
進(jìn)入proxypool目錄斗幼,修改settings.py文件
PASSWORD為Redis密碼,如果為空抚垄,則設(shè)置為None
安裝依賴
pip3 install -r requirements.txt
打開代理池和API
python3 run.py
獲取代理
利用requests獲取方法如下
各模塊功能
- getter.py
爬蟲模塊
- class proxypool.getter.FreeProxyGetter
爬蟲類蜕窿,用于抓取代理源網(wǎng)站的代理谋逻,用戶可復(fù)寫和補(bǔ)充抓取規(guī)則。
schedule.py
調(diào)度器模塊class proxypool.schedule.ValidityTester
異步檢測類桐经,可以對給定的代理的可用性進(jìn)行異步檢測毁兆。
- class proxypool.schedule.PoolAdder
代理添加器,用來觸發(fā)爬蟲模塊阴挣,對代理池內(nèi)的代理進(jìn)行補(bǔ)充气堕,代理池代理數(shù)達(dá)到閾值時(shí)停止工作。
- class proxypool.schedule.Schedule
代理池啟動(dòng)類畔咧,運(yùn)行RUN函數(shù)時(shí)茎芭,會(huì)創(chuàng)建兩個(gè)進(jìn)程,負(fù)責(zé)對代理池內(nèi)容的增加和更新誓沸。
- db.py
Redis數(shù)據(jù)庫連接模塊
- class proxypool.db.RedisClient
數(shù)據(jù)庫操作類梅桩,維持與Redis的連接和對數(shù)據(jù)庫的增刪查該
- error.py
異常模塊
- class proxypool.error.ResourceDepletionError
資源枯竭異常,如果從所有抓取網(wǎng)站都抓不到可用的代理資源拜隧,
則拋出此異常宿百。
class proxypool.error.PoolEmptyError
代理池空異常,如果代理池長時(shí)間為空洪添,則拋出此異常垦页。
api.py
API模塊,啟動(dòng)一個(gè)Web服務(wù)器干奢,使用Flask實(shí)現(xiàn)痊焊,對外提供代理的獲取功能。
- utils.py
工具箱
- setting.py
設(shè)置