Crawlab分布式爬蟲管理平臺
Crawlab 是一個(gè)使用 Golang 開發(fā)的分布式爬蟲管理平臺,支持Python、NodeJS、Go、Java、PHP等多種編程語言以及多種爬蟲框架。
安裝
三種方式:
要求(Docker)
- Docker 18.03+
- Redis
- MongoDB 3.6+
要求(直接部署)
- Go 1.12+
- Node 8.12+
- Redis
- MongoDB 3.6+
運(yùn)行
Docker
運(yùn)行主節(jié)點(diǎn)示例。192.168.99.1是在Docker Machine網(wǎng)絡(luò)中的宿主機(jī)IP地址。192.168.99.100是Docker主節(jié)點(diǎn)的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
當(dāng)然也可以用docker-compose來一鍵啟動(dòng),甚至不用配置MongoDB和Redis數(shù)據(jù)庫,當(dāng)然我們推薦這樣做。在當(dāng)前目錄中創(chuàng)建docker-compose.yml文件,輸入以下內(nèi)容。
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"
然后執(zhí)行以下命令,Crawlab主節(jié)點(diǎn)+MongoDB+Redis就啟動(dòng)了。打開http://localhost:8080就能看到界面。
docker-compose up
Docker部署的詳情,請見相關(guān)文檔。
直接部署
請參考相關(guān)文檔。
截圖
登錄
首頁
節(jié)點(diǎn)列表
節(jié)點(diǎn)拓?fù)鋱D
爬蟲列表
爬蟲概覽
爬蟲分析
爬蟲文件
任務(wù)詳情 - 抓取結(jié)果
定時(shí)任務(wù)
架構(gòu)
Crawlab的架構(gòu)包括了一個(gè)主節(jié)點(diǎn)(Master Node)和多個(gè)工作節(jié)點(diǎn)(Worker Node),以及負(fù)責(zé)通信和數(shù)據(jù)儲(chǔ)存的Redis和MongoDB數(shù)據(jù)庫。
前端應(yīng)用向主節(jié)點(diǎn)請求數(shù)據(jù),主節(jié)點(diǎn)通過MongoDB和Redis來執(zhí)行任務(wù)派發(fā)調(diào)度以及部署,工作節(jié)點(diǎn)收到任務(wù)之后,開始執(zhí)行爬蟲任務(wù),并將任務(wù)結(jié)果儲(chǔ)存到MongoDB。架構(gòu)相對于v0.3.0之前的Celery版本有所精簡,去除了不必要的節(jié)點(diǎn)監(jiān)控模塊Flower,節(jié)點(diǎn)監(jiān)控主要由Redis完成。
主節(jié)點(diǎn)
主節(jié)點(diǎn)是整個(gè)Crawlab架構(gòu)的核心,屬于Crawlab的中控系統(tǒng)。
主節(jié)點(diǎn)主要負(fù)責(zé)以下功能:
- 爬蟲任務(wù)調(diào)度
- 工作節(jié)點(diǎn)管理和通信
- 爬蟲部署
- 前端以及API服務(wù)
- 執(zhí)行任務(wù)(可以將主節(jié)點(diǎn)當(dāng)成工作節(jié)點(diǎn))
主節(jié)點(diǎn)負(fù)責(zé)與前端應(yīng)用進(jìn)行通信,并通過Redis將爬蟲任務(wù)派發(fā)給工作節(jié)點(diǎn)。同時(shí),主節(jié)點(diǎn)會(huì)同步(部署)爬蟲給工作節(jié)點(diǎn),通過Redis和MongoDB的GridFS。
工作節(jié)點(diǎn)
工作節(jié)點(diǎn)的主要功能是執(zhí)行爬蟲任務(wù)和儲(chǔ)存抓取數(shù)據(jù)與日志,并且通過Redis的PubSub跟主節(jié)點(diǎn)通信。通過增加工作節(jié)點(diǎn)數(shù)量,Crawlab可以做到橫向擴(kuò)展,不同的爬蟲任務(wù)可以分配到不同的節(jié)點(diǎn)上執(zhí)行。
MongoDB
MongoDB是Crawlab的運(yùn)行數(shù)據(jù)庫,儲(chǔ)存有節(jié)點(diǎn)、爬蟲、任務(wù)、定時(shí)任務(wù)等數(shù)據(jù),另外GridFS文件儲(chǔ)存方式是主節(jié)點(diǎn)儲(chǔ)存爬蟲文件并同步到工作節(jié)點(diǎn)的中間媒介。
Redis
Redis是非常受歡迎的Key-Value數(shù)據(jù)庫,在Crawlab中主要實(shí)現(xiàn)節(jié)點(diǎn)間數(shù)據(jù)通信的功能。例如,節(jié)點(diǎn)會(huì)將自己信息通過HSET儲(chǔ)存在Redis的nodes哈希列表中,主節(jié)點(diǎn)根據(jù)哈希列表來判斷在線節(jié)點(diǎn)。
前端
前端是一個(gè)基于Vue-Element-Admin的單頁應(yīng)用。其中重用了很多Element-UI的控件來支持相應(yīng)的展示。
與其他框架的集成
爬蟲任務(wù)本質(zhì)上是由一個(gè)shell命令來實(shí)現(xiàn)的。任務(wù)ID將以環(huán)境變量CRAWLAB_TASK_ID的形式存在于爬蟲任務(wù)運(yùn)行的進(jìn)程中,并以此來關(guān)聯(lián)抓取數(shù)據(jù)。另外,CRAWLAB_COLLECTION是Crawlab傳過來的所存放collection的名稱。
在爬蟲程序中,需要將CRAWLAB_TASK_ID的值以task_id作為可以存入數(shù)據(jù)庫中CRAWLAB_COLLECTION的collection中。這樣Crawlab就知道如何將爬蟲任務(wù)與抓取數(shù)據(jù)關(guān)聯(lián)起來了。當(dāng)前,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
與其他框架比較
現(xiàn)在已經(jīng)有一些爬蟲管理框架了,因此為啥還要用Crawlab?
因?yàn)楹芏喱F(xiàn)有當(dāng)平臺都依賴于Scrapyd,限制了爬蟲的編程語言以及框架,爬蟲工程師只能用scrapy和python。當(dāng)然,scrapy是非常優(yōu)秀的爬蟲框架,但是它不能做一切事情。
Crawlab使用起來很方便,也很通用,可以適用于幾乎任何主流語言和框架。它還有一個(gè)精美的前端界面,讓用戶可以方便的管理和運(yùn)行爬蟲。
| 框架 | 類型 | 分布式 | 前端 | 依賴于Scrapyd |
|---|---|---|---|---|
| Crawlab | 管理平臺 | Y | Y | N |
| ScrapydWeb | 管理平臺 | Y | Y | Y |
| SpiderKeeper | 管理平臺 | Y | Y | Y |
| Gerapy | 管理平臺 | Y | Y | Y |
| Scrapyd | 網(wǎng)絡(luò)服務(wù) | Y | N | N/A |
Q&A
1. 為何我訪問 http://localhost:8080 提示訪問不了?
假如您是Docker部署的,請檢查一下您是否用了Docker Machine,這樣的話您需要輸入地址 http://192.168.99.100:8080才行。
另外,請確保您用了-p 8080:8080來映射端口,并檢查宿主機(jī)是否開放了8080端口。
2. 我可以看到登錄頁面了,但為何我點(diǎn)擊登陸的時(shí)候按鈕一直轉(zhuǎn)圈圈?
絕大多數(shù)情況下,您可能是沒有正確配置CRAWLAB_API_ADDRESS這個(gè)環(huán)境變量。這個(gè)變量是告訴前端應(yīng)該通過哪個(gè)地址來請求API數(shù)據(jù)的,因此需要將它設(shè)置為宿主機(jī)的IP地址+端口,例如 192.168.0.1:8000。接著,重啟容器,在瀏覽器中輸入宿主機(jī)IP+端口,就可以順利登陸了。
請注意,8080是前端端口,8000是后端端口,您在瀏覽器中只需要輸入前端的地址就可以了,要注意區(qū)分。
3. 在爬蟲頁面有一些不認(rèn)識的爬蟲列表,這些是什么呢?
這些是demo爬蟲,如果需要添加您自己的爬蟲,請將您的爬蟲文件打包成zip文件,再在爬蟲頁面中點(diǎn)擊添加爬蟲上傳就可以了。
注意,Crawlab將取文件名作為爬蟲名稱,這個(gè)您可以后期更改。另外,請不要將zip文件名設(shè)置為中文,可能會(huì)導(dǎo)致上傳不成功。
