為什么需要代理池
在爬取網(wǎng)站信息的過程中,有些網(wǎng)站為了防止爬蟲,可能會(huì)限制每個(gè)ip的訪問速度或訪問次數(shù)。對(duì)于限制訪問速度的情況,我們可以通過time.sleep進(jìn)行短暫休眠后再次爬取。對(duì)于限制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
異步檢測(cè)類,可以對(duì)給定的代理的可用性進(jìn)行異步檢測(cè)。
- class proxypool.schedule.PoolAdder
代理添加器,用來觸發(fā)爬蟲模塊,對(duì)代理池內(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é)對(duì)代理池內(nèi)容的增加和更新。
- db.py
Redis數(shù)據(jù)庫連接模塊
- class proxypool.db.RedisClient
數(shù)據(jù)庫操作類,維持與Redis的連接和對(duì)數(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),對(duì)外提供代理的獲取功能。
- utils.py
工具箱
- setting.py
設(shè)置