Scrapy 框架插件之 IP 代理池

圖片來(lái)自 unsplash

現(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.pysettings.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.pymodel 包下。它是 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 修改配置

  1. startrun.py 放到你的 Scrapy 項(xiàng)目的主目錄下。例如你項(xiàng)目名為 demo,那么你需要放到 demo 的目錄下。

  2. 修改 config.py 里面的 Mysql 相關(guān)配置信息。然后將其放到你的 Scrapy 項(xiàng)目的二級(jí)目錄下。假如你項(xiàng)目名為 demo,那么你需要放到 demo /demo 的目錄下。

  3. 參考 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ù)(下)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬蟲(chóng)入門(mén)教程一 安裝和基本使用Scr...
    inke閱讀 63,643評(píng)論 6 99
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • “一千字”第七天 今天確實(shí)很累,一直把頭埋在枕頭和書(shū)本的空隙間。但還是忍不住寫(xiě)點(diǎn)什么。 我決定這個(gè)禮拜天就開(kāi)始我最...
    深居石頭里的野豬閱讀 230評(píng)論 0 1
  • 日期 8月2日 早 “?!?叮~” 他猛然睜開(kāi)眼睛,下意識(shí)看了墻上的鐘表,時(shí)針準(zhǔn)時(shí)停在7點(diǎn)整,似乎他剛起...
    文山已幾閱讀 260評(píng)論 0 1
  • 其實(shí)自己已經(jīng)很久沒(méi)有靜下心來(lái)去看完一本書(shū),現(xiàn)在就連看一些文章都沒(méi)有耐心了,看到哪個(gè)標(biāo)題比較吸引就點(diǎn)進(jìn)去,看不到幾行...
    紅藍(lán)本閱讀 282評(píng)論 2 2

友情鏈接更多精彩內(nèi)容