現(xiàn)在很多網(wǎng)站都是對單個 IP 地址有訪問次數(shù)限制,如果你在短時間內(nèi)訪問過于頻繁。該網(wǎng)站會封掉你 IP,讓你在一段時間內(nèi)無法正常該網(wǎng)站。突破反爬蟲機制的一個重要舉措就是代理 IP。擁有龐大穩(wěn)定的 IP 代理,在爬蟲工作中將起到重要的作用,但是從成本的角度來說,一般穩(wěn)定的 IP 池都很貴。因此,流冠代理尋找了為 Scrapy 爬蟲的免費 IP 代理池插件。
該插件適用的程序是基于 Scrapy 框架編寫的爬蟲程序。插件通過爬取免費代理地址,然后過濾掉無效 IP 代理后存放到 Mysql 數(shù)據(jù)庫。另外,它會每 10 分鐘輪詢數(shù)據(jù)庫中的 IP 代理數(shù)量。如果代理地址因為連接失敗次數(shù)超過 3 次被刪除,從而導致代理不夠,它會后臺重新爬取新的 IP 代理。
startrun.py
項目的主入口。它負責啟動 Scrapy 爬蟲和代理池。
your_scrapy_project
該目錄下主要存放兩個文件:config.py
和 settings.py
。config.py 是代理池的項目配置信息。而 settings.py 是你的 Scrapy 爬蟲項目的配置參考代碼。
ProxyPoolWorker.pyProxyPoolWorker.py
是 IP代理池模塊的管理類,負責啟動和維護 IP 代理池。
proxyDBManager.pyproxyDBManager.py
位于 dbManager 包下。它是數(shù)據(jù)庫操作類。主要工作是創(chuàng)建數(shù)據(jù)庫表、往數(shù)據(jù)庫中插入 IP 代理、查詢數(shù)據(jù)庫中剩余的 IP 代理總數(shù)、從數(shù)據(jù)庫中隨機查詢一個 IP 代理、對連接超時或失敗的 IP 代理做處理。
proxyModel.pyproxyModel.py
在 model
包下。它是 IP 代理對象類。
requestEnginer.pyrequestEnginer.py
位于 requester
目錄下。requestEnginer 是整個爬蟲代理池的網(wǎng)絡(luò)引擎。它采用 Session 的形式來發(fā)起 HTTP 請求。同時,它還負責驗證代理地址有效性, 達到過濾掉無用 IP 代理的目的。
scrapy
scrapy 目錄是一些 Scrapy 框架的自定義中間件。RandomUserAgentMiddleware.py
是為 HTTP 請求隨機設(shè)置個 User-agent。middlewares.py
有兩個職責。一是為 HTTP 請求隨機設(shè)置個 IP 代理。二是負責捕獲并處理 HTTP 異常請求。
spiders
該包主要是爬取各大代理網(wǎng)站的爬蟲。
使用本插件,你需要通過 pip 安裝以下依賴:
將 startrun.py
放到你的 Scrapy 項目的主目錄下。例如你項目名為 demo,那么你需要放到 demo 的目錄下。
修改 config.py
里面的 Mysql 相關(guān)配置信息。然后將其放到你的 Scrapy 項目的二級目錄下。假如你項目名為 demo,那么你需要放到 demo /demo 的目錄下。
參考 setting.py
,修改你的 Scrapy 項目中的 setting.py
文件。主要是在你項目中增加以下代碼:
# 默認使用 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,
}