現(xiàn)在很多網(wǎng)站都是對單個 IP 地址有訪問次數(shù)限制,如果你在短時(shí)間內(nèi)訪問過于頻繁。該網(wǎng)站會封掉你 IP,讓你在一段時(shí)間內(nèi)無法正常該網(wǎng)站。突破反爬蟲機(jī)制的一個重要舉措就是代理 IP翼闽。擁有龐大穩(wěn)定的 IP 代理,在爬蟲工作中將起到重要的作用,但是從成本的角度來說洲炊,一般穩(wěn)定的 IP 池都很貴感局。因此,我為 Scrapy 爬蟲編寫個免費(fèi) IP 代理池插件暂衡。
1 特點(diǎn)
該插件適用的程序是基于 Scrapy 框架編寫的爬蟲程序询微。插件通過爬取免費(fèi)代理地址,然后過濾掉無效 IP 代理后存放到 Mysql 數(shù)據(jù)庫狂巢。另外撑毛,它會每 10 分鐘輪詢數(shù)據(jù)庫中的 IP 代理數(shù)量。如果代理地址因?yàn)檫B接失敗次數(shù)超過 3 次被刪除唧领,從而導(dǎo)致代理不夠藻雌,它會后臺重新爬取新的 IP 代理。
2 收集的代理網(wǎng)站
- 無憂代理(data5u)
- ip181 代理
- 快代理
- 西刺代理
3 項(xiàng)目說明
startrun.py
項(xiàng)目的主入口斩个。它負(fù)責(zé)啟動 Scrapy 爬蟲和代理池胯杭。your_scrapy_project
該目錄下主要存放兩個文件:config.py
和settings.py
。config.py 是代理池的項(xiàng)目配置信息受啥。而 settings.py 是你的 Scrapy 爬蟲項(xiàng)目的配置參考代碼做个。ProxyPoolWorker.py
ProxyPoolWorker.py
是 IP代理池模塊的管理類,負(fù)責(zé)啟動和維護(hù) IP 代理池滚局。proxyDBManager.py
proxyDBManager.py
位于 dbManager 包下叁温。它是數(shù)據(jù)庫操作類。主要工作是創(chuàng)建數(shù)據(jù)庫表核畴、往數(shù)據(jù)庫中插入 IP 代理、查詢數(shù)據(jù)庫中剩余的 IP 代理總數(shù)冲九、從數(shù)據(jù)庫中隨機(jī)查詢一個 IP 代理谤草、對連接超時(shí)或失敗的 IP 代理做處理跟束。proxyModel.py
proxyModel.py
在model
包下。它是 IP 代理對象類丑孩。requestEnginer.py
requestEnginer.py
位于requester
目錄下冀宴。requestEnginer 是整個爬蟲代理池的網(wǎng)絡(luò)引擎。它采用 Session 的形式來發(fā)起 HTTP 請求温学。同時(shí)略贮,它還負(fù)責(zé)驗(yàn)證代理地址有效性, 達(dá)到過濾掉無用 IP 代理的目的。scrapy
scrapy 目錄是一些 Scrapy 框架的自定義中間件仗岖。RandomUserAgentMiddleware.py
是為 HTTP 請求隨機(jī)設(shè)置個 User-agent逃延。middlewares.py
有兩個職責(zé)。一是為 HTTP 請求隨機(jī)設(shè)置個 IP 代理轧拄。二是負(fù)責(zé)捕獲并處理 HTTP 異常請求揽祥。spiders
該包主要是爬取各大代理網(wǎng)站的爬蟲。
4 使用方法
4.1 安裝依賴
使用本插件檩电,你需要通過 pip 安裝以下依賴:
- requests
- apscheduler
- pymysql
4.2 修改配置
將
startrun.py
放到你的 Scrapy 項(xiàng)目的主目錄下拄丰。例如你項(xiàng)目名為 demo,那么你需要放到 demo 的目錄下俐末。修改
config.py
里面的 Mysql 相關(guān)配置信息料按。然后將其放到你的 Scrapy 項(xiàng)目的二級目錄下。假如你項(xiàng)目名為 demo卓箫,那么你需要放到 demo /demo 的目錄下载矿。參考
setting.py
,修改你的 Scrapy 項(xiàng)目中的setting.py
文件丽柿。主要是在你項(xiàng)目中增加以下代碼:
# 默認(rèn)使用 IP 代理池
if IF_USE_PROXY:
DOWNLOADER_MIDDLEWARES = {
# 第二行的填寫規(guī)則
# yourproject.myMiddlewares(文件名).middleware類
# 設(shè)置 User-Agent
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
'proxyPool.scrapy.RandomUserAgentMiddleware.RandomUserAgentMiddleware': 400,
# 設(shè)置代理
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None,
'proxyPool.scrapy.middlewares.ProxyMiddleware': 100,
# 設(shè)置自定義捕獲異常中間層
'proxyPool.scrapy.middlewares.CatchExceptionMiddleware': 105,
}
5 寫在最后
本項(xiàng)目目前是第一版恢准,可能有些不完善的地方。如果你有寶貴的完善建議或者有更多的代理網(wǎng)站甫题,可以反饋給我馁筐。我會持續(xù)完善本項(xiàng)目。最后坠非,本項(xiàng)目也在 github 上開源了敏沉。傳送門
上篇閱讀:Python 實(shí)現(xiàn)識別弱圖片驗(yàn)證碼
推薦閱讀:Python定時(shí)任務(wù)(下)