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