
現(xiàn)在很多網(wǎng)站都是對(duì)單個(gè) IP 地址有訪問(wèn)次數(shù)限制,如果你在短時(shí)間內(nèi)訪問(wèn)過(guò)于頻繁。該網(wǎng)站會(huì)封掉你 IP,讓你在一段時(shí)間內(nèi)無(wú)法正常該網(wǎng)站。突破反爬蟲(chóng)機(jī)制的一個(gè)重要舉措就是代理 IP。擁有龐大穩(wěn)定的 IP 代理,在爬蟲(chóng)工作中將起到重要的作用,但是從成本的角度來(lái)說(shuō),一般穩(wěn)定的 IP 池都很貴。因此,我為 Scrapy 爬蟲(chóng)編寫(xiě)個(gè)免費(fèi) IP 代理池插件。
1 特點(diǎn)
該插件適用的程序是基于 Scrapy 框架編寫(xiě)的爬蟲(chóng)程序。插件通過(guò)爬取免費(fèi)代理地址,然后過(guò)濾掉無(wú)效 IP 代理后存放到 Mysql 數(shù)據(jù)庫(kù)。另外,它會(huì)每 10 分鐘輪詢(xún)數(shù)據(jù)庫(kù)中的 IP 代理數(shù)量。如果代理地址因?yàn)檫B接失敗次數(shù)超過(guò) 3 次被刪除,從而導(dǎo)致代理不夠,它會(huì)后臺(tái)重新爬取新的 IP 代理。
2 收集的代理網(wǎng)站
- 無(wú)憂代理(data5u)
- ip181 代理
- 快代理
- 西刺代理
3 項(xiàng)目說(shuō)明
startrun.py
項(xiàng)目的主入口。它負(fù)責(zé)啟動(dòng) Scrapy 爬蟲(chóng)和代理池。your_scrapy_project
該目錄下主要存放兩個(gè)文件:config.py和settings.py。config.py 是代理池的項(xiàng)目配置信息。而 settings.py 是你的 Scrapy 爬蟲(chóng)項(xiàng)目的配置參考代碼。ProxyPoolWorker.py
ProxyPoolWorker.py是 IP代理池模塊的管理類(lèi),負(fù)責(zé)啟動(dòng)和維護(hù) IP 代理池。proxyDBManager.py
proxyDBManager.py位于 dbManager 包下。它是數(shù)據(jù)庫(kù)操作類(lèi)。主要工作是創(chuàng)建數(shù)據(jù)庫(kù)表、往數(shù)據(jù)庫(kù)中插入 IP 代理、查詢(xún)數(shù)據(jù)庫(kù)中剩余的 IP 代理總數(shù)、從數(shù)據(jù)庫(kù)中隨機(jī)查詢(xún)一個(gè) IP 代理、對(duì)連接超時(shí)或失敗的 IP 代理做處理。proxyModel.py
proxyModel.py在model包下。它是 IP 代理對(duì)象類(lèi)。requestEnginer.py
requestEnginer.py位于requester目錄下。requestEnginer 是整個(gè)爬蟲(chóng)代理池的網(wǎng)絡(luò)引擎。它采用 Session 的形式來(lái)發(fā)起 HTTP 請(qǐng)求。同時(shí),它還負(fù)責(zé)驗(yàn)證代理地址有效性, 達(dá)到過(guò)濾掉無(wú)用 IP 代理的目的。scrapy
scrapy 目錄是一些 Scrapy 框架的自定義中間件。RandomUserAgentMiddleware.py是為 HTTP 請(qǐng)求隨機(jī)設(shè)置個(gè) User-agent。middlewares.py有兩個(gè)職責(zé)。一是為 HTTP 請(qǐng)求隨機(jī)設(shè)置個(gè) IP 代理。二是負(fù)責(zé)捕獲并處理 HTTP 異常請(qǐng)求。spiders
該包主要是爬取各大代理網(wǎng)站的爬蟲(chóng)。
4 使用方法
4.1 安裝依賴(lài)
使用本插件,你需要通過(guò) pip 安裝以下依賴(lài):
- requests
- apscheduler
- pymysql
4.2 修改配置
將
startrun.py放到你的 Scrapy 項(xiàng)目的主目錄下。例如你項(xiàng)目名為 demo,那么你需要放到 demo 的目錄下。修改
config.py里面的 Mysql 相關(guān)配置信息。然后將其放到你的 Scrapy 項(xiàng)目的二級(jí)目錄下。假如你項(xiàng)目名為 demo,那么你需要放到 demo /demo 的目錄下。參考
setting.py,修改你的 Scrapy 項(xiàng)目中的setting.py文件。主要是在你項(xiàng)目中增加以下代碼:
# 默認(rèn)使用 IP 代理池
if IF_USE_PROXY:
DOWNLOADER_MIDDLEWARES = {
# 第二行的填寫(xiě)規(guī)則
# yourproject.myMiddlewares(文件名).middleware類(lèi)
# 設(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ě)在最后
本項(xiàng)目目前是第一版,可能有些不完善的地方。如果你有寶貴的完善建議或者有更多的代理網(wǎng)站,可以反饋給我。我會(huì)持續(xù)完善本項(xiàng)目。最后,本項(xiàng)目也在 github 上開(kāi)源了。傳送門(mén)
上篇閱讀:Python 實(shí)現(xiàn)識(shí)別弱圖片驗(yàn)證碼
推薦閱讀:Python定時(shí)任務(wù)(下)