基於Golang的分佈式爬蟲管理平臺,支持Python、NodeJS、Go、Java、PHP等多種編程語言以及多種爬蟲框架。
安裝
三種方式:
- Docker(推薦)
- 直接部署(瞭解內核)
要求(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的架構包括了一個主節點(Master Node)和多個工作節點(Worker Node),以及負責通信和數據儲存的Redis和MongoDB數據庫。
前端應用向主節點請求數據,主節點通過MongoDB和Redis來執行任務派發調度以及部署,工作節點收到任務之後,開始執行爬蟲任務,並將任務結果儲存到MongoDB。架構相對於v0.3.0之前的Celery版本有所精簡,去除了不必要的節點監控模塊Flower,節點監控主要由Redis完成。
主節點
主節點是整個Crawlab架構的核心,屬於Crawlab的中控系統。
主節點主要負責以下功能:
- 爬蟲任務調度
- 工作節點管理和通信
- 爬蟲部署
- 前端以及API服務
- 執行任務(可以將主節點當成工作節點)
主節點負責與前端應用進行通信,並通過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"獲取鏈接地址,喜歡的點個關注,一起學習探討新技術。
閱讀更多 儒雅程序員 的文章