第49讲:实战上手,Scrapy-Redis 分布式实现
在前面一節(jié)課我們了解了 Scrapy-Redis 的基本原理,本節(jié)課我們就結(jié)合之前的案例實現(xiàn)基于 Scrapy-Redis 的分布式爬蟲吧。
1.環(huán)境準備
本節(jié)案例我們基于第 46 講 —— Scrapy 和 Pyppeteer 的動態(tài)渲染頁面的抓取案例來進行學(xué)習(xí),我們需要把它改寫成基于 Redis 的分布式爬蟲。
首先我們需要把代碼下載下來,其 GitHub 地址為 https://github.com/Python3WebSpider/ScrapyPyppeteer,進入項目,試著運行代碼確保可以順利執(zhí)行,運行效果如圖所示:
其次,我們需要有一個 Redis 數(shù)據(jù)庫,可以直接下載安裝包并安裝,也可以使用 Docker 啟動,保證能正常連接和使用即可,比如我這里就在本地 localhost 啟動了一個 Redis 數(shù)據(jù)庫,運行在 6379 端口,密碼為空。
另外我們還需要安裝 Scrapy-Redis 包,安裝命令如下:
pip3 install scrapy-redis安裝完畢之后確保其可以正常導(dǎo)入使用即可。
2.實現(xiàn)
接下來我們只需要簡單的幾步操作就可以實現(xiàn)分布式爬蟲的配置了。
2.1修改 Scheduler
在前面的課時中我們講解了 Scheduler 的概念,它是用來處理 Request、Item 等對象的調(diào)度邏輯的,默認情況下,Request 的隊列是在內(nèi)存中的,為了實現(xiàn)分布式,我們需要將隊列遷移到 Redis 中,這時候我們就需要修改 Scheduler,修改非常簡單,只需要在 settings.py 里面添加如下代碼即可:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"這里我們將 Scheduler 的類修改為 Scrapy-Redis 提供的 Scheduler 類,這樣在我們運行爬蟲時,Request 隊列就會出現(xiàn)在 Redis 中了。
2.2修改 Redis 連接信息
另外我們還需要修改下 Redis 的連接信息,這樣 Scrapy 才能成功連接到 Redis 數(shù)據(jù)庫,修改格式如下:
REDIS_URL = 'redis://[user:pass]@hostname:9001'在這里我們需要根據(jù)如上的格式來修改,由于我的 Redis 是在本地運行的,所以在這里就不需要填寫用戶名密碼了,直接設(shè)置為如下內(nèi)容即可:
REDIS_URL = 'redis://localhost:6379'2.3修改去重類
既然 Request 隊列遷移到了 Redis,那么相應(yīng)的去重操作我們也需要遷移到 Redis 里面,前一節(jié)課我們講解了 Dupefilter 的原理,這里我們就修改下去重類來實現(xiàn)基于 Redis 的去重:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"2.4配置持久化
一般來說開啟了 Redis 分布式隊列之后,我們不希望爬蟲在關(guān)閉時將整個隊列和去重信息全部刪除,因為很有可能在某個情況下我們會手動關(guān)閉爬蟲或者爬蟲遭遇意外終止,為了解決這個問題,我們可以配置 Redis 隊列的持久化,修改如下:
SCHEDULER_PERSIST = True好了,到此為止我們就完成分布式爬蟲的配置了。
3.運行
上面我們完成的實際上并不是真正意義的分布式爬蟲,因為 Redis 隊列我們使用的是本地的 Redis,所以多個爬蟲需要運行在本地才可以,如果想實現(xiàn)真正意義的分布式爬蟲,可以使用遠程 Redis,這樣我們就能在多臺主機運行爬蟲連接此 Redis 從而實現(xiàn)真正意義上的分布式爬蟲了。
不過沒關(guān)系,我們可以在本地啟動多個爬蟲驗證下爬取效果。我們在多個命令行窗口運行如下命令:
scrapy crawl book第一個爬蟲出現(xiàn)了如下運行效果:
這時候不要關(guān)閉此窗口,再打開另外一個窗口,運行同樣的爬取命令:
運行效果如下:
這時候我們可以觀察到它從第 24 頁開始爬取了,因為當前爬取隊列存在第一個爬蟲生成的爬取 Request,第二個爬蟲啟動時檢測到有 Request 存在就直接讀取已經(jīng)存在的 Request,然后接著爬取了。
同樣,我們可以啟動第三個、第四個爬蟲實現(xiàn)同樣的爬取功能。這樣,我們就基于 Scrapy-Redis 成功實現(xiàn)了基本的分布式爬蟲功能。
好了,本課時的內(nèi)容就講完了,我們下節(jié)課見。
總結(jié)
以上是生活随笔為你收集整理的第49讲:实战上手,Scrapy-Redis 分布式实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第09讲:爬虫解析利器 PyQuery
- 下一篇: linux cmake编译源码,linu