scrapy_redis 和 docker 實現簡單分散式爬蟲

發表於2016-08-15

簡介

在使用 scrapy 爬取 IT桔子公司資訊,用來進行分析,瞭解 IT 創業公司的一切情況,之前使用 scrapy 寫了一個預設執行緒是10的單個例項,為了防止被 ban IP 設定了下載的速度,3萬多個公司資訊爬了1天多才完成,現在想到使用分散式爬蟲來提高效率。

原始碼githup

技術工具:Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemy

準備工作

  1. 安裝 Docker 點這裡去了解、安裝;
  2. pip install scrapy scrapy_redis;

程式碼編寫

  1. 分析頁面資訊:
    我需要獲取的是每一個「公司」的詳情頁面連結 和 分頁按鈕連結;
  2. 統一儲存獲取到的連結,提供給多個 spider 爬取;
  3. 多個 spider 共享一個 redis list 中的連結;

目錄結構圖

scrapy_redis 和 docker 實現簡單分散式爬蟲

juzi_spider.py

說明:

  1. class 繼承了RedisCrawlSpider 而不是CrawlSpider
  2. start_urls 改為一個自定義的 itjuziCrawler:start_urls,這裡的itjuziCrawler:start_urls 就是作為所有連結儲存到 redis 中的 key,scrapy_redis 裡也是通過redislpop方法彈出並刪除連結的;

db_util.py

使用 SQLAlchemy 作為 ORM 工具,當表結構不存在時,自動建立表結構

middlewares.py

增加了很多 User-Agent,每一個請求隨機使用一個,防止防止網站通過 User-Agent 遮蔽爬蟲

settings.py

配置middlewares.py scrapy_redis redis 連結相關資訊

部署

在上面的「目錄結構圖」中有,Dockerfiledocker-compose.yml

Dockerfile

說明:

  • 使用 python3.5作為基礎映象
  • /usr/local/bin設定環境變數
  • 對映 hostcontainer 的目錄
  • 安裝 requirements.txt
  • 特別要說明的是COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis,將 host 中的 spiders.py 拷貝到container 中的 scrapy_redis 安裝目錄中,因為 lpop 獲取redis 的值在 python2中是 str 型別,而在 python3中是 bytes 型別,這個問題在 scrapy_reids 中需要修復,spiders.py 第84行需要修改;
  • 啟動後立即執行爬行命令 scrapy crawl itjuzi_dis

docker-compose.yml

說明:

  • 使用第2版本的 compose 描述語言
  • 定義了 spiderredis 兩個 service
  • spider預設使用當前目錄的 Dockerfile 來建立,redis使用 redis:latest 映象建立,並都對映6379埠

開始部署

啟動 container

可以在 Kitematic GUI 工具中觀察建立和執行情況;

scrapy_redis 和 docker 實現簡單分散式爬蟲

在沒有設定 start_urls 時,4個 container 中的爬蟲都處於飢渴的等待狀態

scrapy_redis 和 docker 實現簡單分散式爬蟲

現在給 redis 中放入 start_urls:

4個爬蟲都動起來了,一直爬到start_urls為空
scrapy_redis 和 docker 實現簡單分散式爬蟲

以上!

相關文章