Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

基於Golang的分佈式爬蟲管理平臺,支持Python、NodeJS、Go、Java、PHP等多種編程語言以及多種爬蟲框架。

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

安裝

三種方式:

  1. Docker(推薦)
  2. 直接部署(瞭解內核)

要求(Docker)

  • Docker 18.03+
  • Redis
  • MongoDB 3.6+

要求(直接部署)

  • Go 1.12+
  • Node 8.12+
  • Redis
  • MongoDB 3.6+

運行

Docker

運行主節點示例。192.168.99.1是在Docker Machine網絡中的宿主機IP地址。192.168.99.100是Docker主節點的IP地址。

docker run -d --rm --name crawlab \\
-e CRAWLAB_REDIS_ADDRESS=192.168.99.1 \\
-e CRAWLAB_MONGO_HOST=192.168.99.1 \\
-e CRAWLAB_SERVER_MASTER=Y \\

-e CRAWLAB_API_ADDRESS=192.168.99.100:8000 \\
-e CRAWLAB_SPIDER_PATH=/app/spiders \\
-p 8080:8080 \\
-p 8000:8000 \\
-v /var/logs/crawlab:/var/logs/crawlab \\
tikazyq/crawlab:0.3.0

當然也可以用docker-compose來一鍵啟動,甚至不用配置MongoDB和Redis數據庫,當然我們推薦這樣做。在當前目錄中創建docker-compose.yml文件,輸入以下內容。

version: '3.3'
services:
master:
image: tikazyq/crawlab:latest
container_name: master
environment:
CRAWLAB_API_ADDRESS: "localhost:8000"
CRAWLAB_SERVER_MASTER: "Y"
CRAWLAB_MONGO_HOST: "mongo"
CRAWLAB_REDIS_ADDRESS: "redis"
ports:
- "8080:8080" # frontend
- "8000:8000" # backend
depends_on:
- mongo
- redis
mongo:
image: mongo:latest
restart: always
ports:
- "27017:27017"
redis:
image: redis:latest
restart: always
ports:
- "6379:6379"

然後執行以下命令,Crawlab主節點+MongoDB+Redis就啟動了。打開http://localhost:8080就能看到界面。

docker-compose up

Docker部署的詳情,請見相關文檔。

直接部署

請參考相關文檔。

截圖

登錄

首頁

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

節點列表

節點拓撲圖

爬蟲列表

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

爬蟲概覽

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

爬蟲分析

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

爬蟲文件

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

任務詳情 - 抓取結果

定時任務

架構

Crawlab的架構包括了一個主節點(Master Node)和多個工作節點(Worker Node),以及負責通信和數據儲存的Redis和MongoDB數據庫。

Crawlab 使用 Golang 開發的分佈式爬蟲管理平臺

前端應用向主節點請求數據,主節點通過MongoDB和Redis來執行任務派發調度以及部署,工作節點收到任務之後,開始執行爬蟲任務,並將任務結果儲存到MongoDB。架構相對於v0.3.0之前的Celery版本有所精簡,去除了不必要的節點監控模塊Flower,節點監控主要由Redis完成。

主節點

主節點是整個Crawlab架構的核心,屬於Crawlab的中控系統。

主節點主要負責以下功能:

  1. 爬蟲任務調度
  2. 工作節點管理和通信
  3. 爬蟲部署
  4. 前端以及API服務
  5. 執行任務(可以將主節點當成工作節點)

主節點負責與前端應用進行通信,並通過Redis將爬蟲任務派發給工作節點。同時,主節點會同步(部署)爬蟲給工作節點,通過Redis和MongoDB的GridFS。

工作節點

工作節點的主要功能是執行爬蟲任務和儲存抓取數據與日誌,並且通過Redis的PubSub跟主節點通信。通過增加工作節點數量,Crawlab可以做到橫向擴展,不同的爬蟲任務可以分配到不同的節點上執行。

MongoDB

MongoDB是Crawlab的運行數據庫,儲存有節點、爬蟲、任務、定時任務等數據,另外GridFS文件儲存方式是主節點儲存爬蟲文件並同步到工作節點的中間媒介。

Redis

Redis是非常受歡迎的Key-Value數據庫,在Crawlab中主要實現節點間數據通信的功能。例如,節點會將自己信息通過HSET儲存在Redis的nodes哈希列表中,主節點根據哈希列表來判斷在線節點。

前端

前端是一個基於Vue-Element-Admin的單頁應用。其中重用了很多Element-UI的控件來支持相應的展示。

與其他框架的集成

爬蟲任務本質上是由一個shell命令來實現的。任務ID將以環境變量CRAWLAB_TASK_ID的形式存在於爬蟲任務運行的進程中,並以此來關聯抓取數據。另外,CRAWLAB_COLLECTION是Crawlab傳過來的所存放collection的名稱。

在爬蟲程序中,需要將CRAWLAB_TASK_ID的值以task_id作為可以存入數據庫中CRAWLAB_COLLECTION的collection中。這樣Crawlab就知道如何將爬蟲任務與抓取數據關聯起來了。當前,Crawlab只支持MongoDB。

集成Scrapy

以下是Crawlab跟Scrapy集成的例子,利用了Crawlab傳過來的task_id和collection_name。

import os
from pymongo import MongoClient
MONGO_HOST = '192.168.99.100'
MONGO_PORT = 27017
MONGO_DB = 'crawlab_test'
# scrapy example in the pipeline

class JuejinPipeline(object):
mongo = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
db = mongo[MONGO_DB]
col_name = os.environ.get('CRAWLAB_COLLECTION')
if not col_name:
col_name = 'test'
col = db[col_name]
def process_item(self, item, spider):
item['task_id'] = os.environ.get('CRAWLAB_TASK_ID')
self.col.save(item)
return item

與其他框架比較

現在已經有一些爬蟲管理框架了,因此為啥還要用Crawlab?

因為很多現有當平臺都依賴於Scrapyd,限制了爬蟲的編程語言以及框架,爬蟲工程師只能用scrapy和python。當然,scrapy是非常優秀的爬蟲框架,但是它不能做一切事情。

Crawlab使用起來很方便,也很通用,可以適用於幾乎任何主流語言和框架。它還有一個精美的前端界面,讓用戶可以方便的管理和運行爬蟲。

框架類型分佈式前端依賴於ScrapydCrawlab管理平臺YYNScrapydWeb管理平臺YYYSpiderKeeper管理平臺YYYGerapy管理平臺YYYScrapyd網絡服務YNN/A

私信回覆"Crawlab"獲取鏈接地址,喜歡的點個關注,一起學習探討新技術。


分享到:


相關文章: