如何簡單高效地部署和監控分散式爬蟲專案

my8100發表於2019-03-02

需求分析

初級使用者:

  • 只有一臺開發主機,希望能夠直接通過瀏覽器部署和執行 Scrapy 爬蟲專案

進階使用者:

  • 有一臺雲主機,希望整合身份認證
  • 希望能夠定時自動啟動爬蟲任務,實現網頁資訊監控

專業使用者:

  • 有 N 臺雲主機,通過 Scrapy-Redis 構建分散式爬蟲
  • 希望在頁面上直觀地檢視所有云主機的執行狀態
  • 希望能夠自由選擇部分雲主機,批量部署和執行專案,實現叢集管理
  • 希望自動執行日誌分析,掌握爬蟲進度
  • 希望在出現特定型別的異常日誌時能夠及時獲得通知,包括自動停止當前爬蟲任務

安裝和配置

  1. 請先確保所有主機都已經安裝和啟動 Scrapyd,如果需要遠端訪問 Scrapyd,則需將 Scrapyd 配置檔案中的 bind_address 修改為 bind_address = 0.0.0.0,然後重啟 Scrapyd service。
  2. 開發主機或任一臺主機安裝 ScrapydWebpip install scrapydweb
  3. 通過執行命令 scrapydweb 啟動 ScrapydWeb(首次啟動將自動在當前工作目錄生成配置檔案)。
  4. 啟用 HTTP 基本認證(可選):
ENABLE_AUTH = True
USERNAME = 'username'
PASSWORD = 'password'
複製程式碼
  1. 新增 Scrapyd server,支援字串和元組兩種配置格式,支援新增認證資訊和分組/標籤:
SCRAPYD_SERVERS = [
    '127.0.0.1',
    # 'username:password@localhost:6801#group',
    ('username', 'password', 'localhost', '6801', 'group'),
]
複製程式碼
  1. 執行命令 scrapydweb 重啟 ScrapydWeb

訪問 Web UI

通過瀏覽器訪問並登入 http://127.0.0.1:5000

  • Servers 頁面自動輸出所有 Scrapyd server 的執行狀態。
  • 通過分組和過濾可以自由選擇若干臺 Scrapyd server,然後在上方 Tabs 標籤頁中選擇 Scrapyd 提供的任一 HTTP JSON API,實現一次操作,批量執行

Servers

  • 通過整合 LogParser,Jobs 頁面自動輸出爬蟲任務的 pages 和 items 資料。
  • ScrapydWeb 預設通過定時建立快照將爬蟲任務列表資訊儲存到資料庫,即使重啟 Scrapyd server 也不會丟失任務資訊。(issue 12)

Jobs

部署專案

  • 支援一鍵部署專案到 Scrapyd server 叢集
  • 通過配置 SCRAPY_PROJECTS_DIR 指定 Scrapy 專案開發目錄,ScrapydWeb 將自動列出該路徑下的所有專案,預設選定最新編輯的專案,選擇專案後即可自動打包和部署指定專案。
  • 如果 ScrapydWeb 執行在遠端伺服器上,除了通過當前開發主機上傳常規的 egg 檔案,也可以將整個專案資料夾新增到 zip/tar/tar.gz 壓縮檔案後直接上傳即可,無需手動打包為 egg 檔案。

Deploy

執行爬蟲

  • 通過下拉框直接選擇 project,version 和 spider。
  • 支援傳入 Scrapy settings 和 spider arguments。
  • 支援建立基於 APScheduler 的定時爬蟲任務。(如需同時啟動大量爬蟲任務,則需調整 Scrapyd 配置檔案的 max-proc 引數)
  • 支援在 Scrapyd server 叢集上一鍵啟動分散式爬蟲

Run

日誌分析和視覺化

  • 如果在同一臺主機執行 Scrapyd 和 ScrapydWeb,建議設定 SCRAPYD_LOGS_DIRENABLE_LOGPARSER,則啟動 ScrapydWeb 時將自動執行 LogParser該子程式通過定時增量式解析指定目錄下的 Scrapy 日誌檔案以加快 Stats 頁面的生成,避免因請求原始日誌檔案而佔用大量記憶體和網路資源。
  • 如果需要管理 Scrapyd server 叢集,建議在其餘主機單獨安裝和啟動 LogParser ,原因如上。
  • 如果安裝的 Scrapy 版本不大於 1.5.1,LogParser 將能夠自動通過 Scrapy 內建的 Telnet Console 讀取 Crawler.stats 和 Crawler.engine 資料,以便掌握 Scrapy 內部執行狀態。

Stats

定時爬蟲任務

  • 支援檢視爬蟲任務的引數資訊,追溯歷史記錄
  • 支援暫停,恢復,觸發,停止,編輯和刪除任務等操作

Tasks

郵件通知

通過輪詢子程式在後臺定時模擬訪問 Stats 頁面,ScrapydWeb 將在滿足特定觸發器時根據設定自動停止爬蟲任務併傳送通知郵件,郵件正文包含當前爬蟲任務的統計資訊。

  1. 新增郵箱帳號:
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 465
SMTP_OVER_SSL = True
SMTP_CONNECTION_TIMEOUT = 10

EMAIL_USERNAME = ''  # defaults to FROM_ADDR
EMAIL_PASSWORD = 'password'
FROM_ADDR = 'username@qq.com'
TO_ADDRS = [FROM_ADDR]
複製程式碼
  1. 設定郵件工作時間和基本觸發器,以下示例代表:每隔1小時或當某一任務完成時,並且當前時間是工作日的9點,12點和17點,ScrapydWeb 將會傳送通知郵件。
EMAIL_WORKING_DAYS = [1, 2, 3, 4, 5]
EMAIL_WORKING_HOURS = [9, 12, 17]
ON_JOB_RUNNING_INTERVAL = 3600
ON_JOB_FINISHED = True
複製程式碼
  1. 除了基本觸發器,ScrapydWeb 還提供了多種觸發器用於處理不同型別的 log,包括 'CRITICAL', 'ERROR', 'WARNING', 'REDIRECT', 'RETRY' 和 'IGNORE'等。
LOG_CRITICAL_THRESHOLD = 3
LOG_CRITICAL_TRIGGER_STOP = True
LOG_CRITICAL_TRIGGER_FORCESTOP = False
# ...
LOG_IGNORE_TRIGGER_FORCESTOP = False
複製程式碼

以上示例代表:當日志中出現3條或以上的 critical 級別的 log 時,ScrapydWeb 將自動停止當前任務,如果當前時間在郵件工作時間內,則同時傳送通知郵件。

GitHub 開源

活捉幾隻官方大佬,趕緊前去圍觀吧。點個 Star 不迷路,歡迎提交 feature request!

my8100 / scrapydweb

star

相關文章