對于爬蟲管理平臺而言,手寫的簡易爬蟲只是小打小鬧,系統(tǒng)化的可調(diào)參數(shù)的python爬蟲管理平臺才是真正的爬蟲。多線程、爬取過程監(jiān)控、ip代理、分布式等技術(shù)都在爬蟲管理平臺上實(shí)現(xiàn)。爬蟲管理平臺的種類有很多,今天我們就來介紹crawlab怎么部署吧。
爬蟲有多重要
對搜索引擎來說,爬蟲不可或缺;對輿情公司來說,爬蟲是基礎(chǔ);對 NLP來說,爬蟲可以獲取語料;對初創(chuàng)公司來說,爬蟲可以獲取初始內(nèi)容。但是爬蟲技術(shù)紛繁復(fù)雜,不同類型的抓取場景會運(yùn)用到不同的技術(shù)。例如,簡單的靜態(tài)頁面可以用 HTTP 請求+HTML 解析器直接搞定;一個(gè)動態(tài)頁面需要用 Puppeteer 或 Selenium等自動化測試工具;有反爬的網(wǎng)站需要用到代理、打碼等技術(shù);等等。那么此時(shí)就需要一個(gè)成熟的爬蟲管理平臺,幫助企業(yè)或個(gè)人處理大量的爬蟲類別。
理解什么是爬蟲管理平臺
定義
爬蟲管理平臺是一個(gè)一站式管理系統(tǒng),集爬蟲部署、任務(wù)調(diào)度、任務(wù)監(jiān)控、結(jié)果展示等模塊于一體,通常配有可視化 UI 界面,可以在 Web 端通過與 UI 界面交互來有效管理爬蟲。爬蟲管理平臺一般來說是支持分布式的,可以在多臺機(jī)器上協(xié)作運(yùn)行。
當(dāng)然,上述這個(gè)定義是狹義的,通常針對于技術(shù)人員或開發(fā)者或技術(shù)經(jīng)理。企業(yè)內(nèi)部一般都會開發(fā)自己的內(nèi)部爬蟲管理系統(tǒng),以應(yīng)對復(fù)雜的爬蟲管理需求。這樣的系統(tǒng)就是上述定義的狹義的爬蟲管理平臺。
廣義爬蟲管理平臺
而什么是廣義的爬蟲管理平臺呢?您可能聽說過神箭手(后轉(zhuǎn)型為后羿采集器)和八爪魚吧。前者是基于云服務(wù)的,可以在線上編寫、運(yùn)行和監(jiān)控爬蟲,在廣義爬蟲平臺中最接近狹義定義的爬蟲管理平臺;后者是一個(gè)大眾的商業(yè)爬蟲抓取工具,可以讓小白用戶拖拉拽編寫、運(yùn)行爬蟲,導(dǎo)出數(shù)據(jù)。您也可能見過各種 API 聚合服務(wù)商,例如聚合數(shù)據(jù),這是一個(gè)可以直接調(diào)用網(wǎng)站接口獲取數(shù)據(jù)的平臺,這其實(shí)也算作爬蟲平臺的一個(gè)變種,只是它幫你完成了爬蟲編寫這一過程。而介于這兩者之間的呢,國外有一家叫 Kimonolab 的公司,它開發(fā)了一個(gè)叫 Kimono 的 Chrome 插件,可以讓用戶在頁面上可視化的點(diǎn)擊元素并生成抓取規(guī)則,并在其網(wǎng)站上生成爬蟲程序,用戶提交任務(wù),后臺就可以自動在網(wǎng)站上抓取數(shù)據(jù)了。Kimono 是一個(gè)偉大的爬蟲應(yīng)用,但可惜的是,Kimonolab 已經(jīng)被大數(shù)據(jù)公司 Plantir 收購,現(xiàn)在也就無法體驗(yàn)了。
在本文中,我們主要關(guān)注狹義定義的爬蟲管理平臺,因此后面所講到的爬蟲管理平臺都是指狹義的定義。
爬蟲管理平臺模塊
以下是一個(gè)典型的爬蟲管理平臺所涉及的模塊。
爬蟲管理平臺架構(gòu)
典型爬蟲管理平臺的模塊主要包含以下內(nèi)容:
- 任務(wù)管理:如何執(zhí)行、調(diào)度爬蟲抓取任務(wù),以及如何監(jiān)控任務(wù),包括日志監(jiān)控等等;
- 爬蟲管理:包括爬蟲部署,即將開發(fā)好的爬蟲部署(打包或復(fù)制)到相應(yīng)的節(jié)點(diǎn)上,以及爬蟲配置和版本管理;
- 節(jié)點(diǎn)管理:包括節(jié)點(diǎn)(服務(wù)器/機(jī)器)的注冊和監(jiān)控,以及節(jié)點(diǎn)之間的通信,如何監(jiān)控節(jié)點(diǎn)性能狀況等;
- 前端應(yīng)用:包括一個(gè)可視化 UI 界面,讓用戶可通過與其交互,與后臺應(yīng)用進(jìn)行通信。
當(dāng)然,有些爬蟲管理平臺可能還不止這些模塊,它可能包括其他比較實(shí)用的功能,例如可配置的抓取規(guī)則、可視化配置抓取規(guī)則、代理池、Cookie 池、異常監(jiān)控等等。
為什么需要爬蟲管理平臺
有了爬蟲管理平臺,開發(fā)者特別是爬蟲工程師就能夠方便的添加爬蟲、執(zhí)行任務(wù)、查看結(jié)果,而不用在命令行之間來回切換,非常容易出錯(cuò)。一個(gè)常見的場景就是爬蟲工程師最初技術(shù)選型用了 scrapy 和 crontab 來管理爬蟲任務(wù),他不得不小心翼翼的選擇定時(shí)任務(wù)的時(shí)間區(qū)間,以至于不會將服務(wù)器 CPU 或內(nèi)存占滿;更棘手的問題是,他還需要將 scrapy 產(chǎn)生的日志存到文件里,一旦爬蟲出錯(cuò)了,他不得不用 shell 命令一個(gè)一個(gè)來查看日志來定位錯(cuò)誤原因,嚴(yán)重時(shí)會花上一個(gè)整天;還有個(gè)嚴(yán)重的問題,爬蟲工程師可能發(fā)現(xiàn)公司業(yè)務(wù)量在增加,他需要寫上百個(gè)爬蟲來滿足公司的業(yè)務(wù)需求,而用 scrapy 和 crontab 來管理完全就是個(gè)噩夢??蓱z的爬蟲工程師其實(shí)完全可以選擇一個(gè)合適爬蟲管理平臺來解決他的問題。
如何選擇一個(gè)合適的爬蟲管理平臺
當(dāng)您愿意解決前面提到的爬蟲工程師遇到的困難問題,而轉(zhuǎn)而想選擇一個(gè)合適的爬蟲管理平臺時(shí)。
您首先應(yīng)該回答的問題是:我們是否需要從零開始開發(fā)一套系統(tǒng)(Start from scratch)?要回答這個(gè)問題,您應(yīng)該先回答下面幾個(gè)問題:
1.我們的需求是否復(fù)雜到需要完全定制化開發(fā)一套新系統(tǒng)(例如要求復(fù)雜的權(quán)限管理)?
2.我們的團(tuán)隊(duì)是否有足夠的技術(shù)實(shí)力來開發(fā)這套系統(tǒng)(例如有經(jīng)驗(yàn)豐富的前后端開發(fā)工程師)?
3.我們的時(shí)間資源是否足夠我們開發(fā)這套系統(tǒng)(例如項(xiàng)目計(jì)劃周期為一年)?
如果上述三個(gè)問題的答案任意一個(gè)為“否”,您應(yīng)該好好考慮利用市面上已有的開源爬蟲管理平臺來滿足您的需求。
以下為市面上已有的開源爬蟲管理平臺:
總的來說,SpiderKeeper 可能是最早的爬蟲管理平臺,但功能相對來說比較局限;Gerapy 雖然功能齊全,界面精美,但有不少 bug 需要處理,建議有需求的用戶等待 2.0 版本;Scrapydweb是一個(gè)比較完善的爬蟲管理平臺,不過和前兩者一樣,都是基于 scrapyd 的,因此只能運(yùn)行 scrapy 爬蟲;而Crawlab是一個(gè)非常靈活的爬蟲管理平臺,可以運(yùn)行 Python、Nodejs、Java、PHP、Go 寫的爬蟲,而且功能比較齊全,只是部署起來相對于前三者來說要麻煩一些,不過對于 Docker 使用者來說可以做到一件部署(后面我們會講)。
因此,對于重度 scrapy 爬蟲依賴的、又不想折騰的開發(fā)者,可以考慮 Scrapydweb;而對于有各種類型的、復(fù)雜技術(shù)結(jié)構(gòu)的爬蟲開發(fā)者來說,應(yīng)該優(yōu)先考慮更靈活的 Crawlab。當(dāng)然,不是說 Crawlab 對 scrapy 支持不友好,Crawlab 同樣可以很好的集成 scrapy,后面會介紹。
作為 Crawlab 的作者,不想王婆賣瓜,自賣自夸,作者僅僅希望將最好的技術(shù)選型推薦給開發(fā)者,讓開發(fā)者根據(jù)自身的需求來決定該使用哪種爬蟲管理平臺。
爬蟲管理平臺 Crawlab 介紹簡介
Crawlab 是基于 Golang 的分布式爬蟲管理平臺,支持 Python、NodeJS、Java、Go、PHP 等多種編程語言以及多種爬蟲框架。
Crawlab 自今年三月份上線以來受到爬蟲愛好者們和開發(fā)者們的好評,不少使用者還表示會用 Crawlab 搭建公司的爬蟲平臺。經(jīng)過近數(shù)月的迭代,Crawlab 陸續(xù)上線了定時(shí)任務(wù)、數(shù)據(jù)分析、網(wǎng)站信息、可配置爬蟲、自動提取字段、下載結(jié)果、上傳爬蟲等功能,將平臺變得得更加實(shí)用,更加全面,能夠真正幫助用戶解決爬蟲管理困難的問題。如今在 Github 上有近 1k 的 star,相關(guān)社區(qū)也建立起來,四分之一的用戶表示已經(jīng)將 Crawlab 應(yīng)用于企業(yè)爬蟲管理??梢钥闯觯珻rawlab 是受開發(fā)者們關(guān)注和喜歡的。
解決問題
Crawlab 主要解決的是大量爬蟲管理困難的問題,例如需要監(jiān)控上百個(gè)網(wǎng)站的參雜 scrapy 和 selenium 的項(xiàng)目不容易做到同時(shí)管理,而且命令行管理的成本非常高,還容易出錯(cuò)。Crawlab 支持任何語言和任何框架,配合任務(wù)調(diào)度、任務(wù)監(jiān)控,很容易做到對成規(guī)模的爬蟲項(xiàng)目進(jìn)行有效監(jiān)控管理。
界面及使用
下面是 Crawlab 爬蟲列表頁面的截圖。
Crawlab 爬蟲列表
用戶只需要將爬蟲上傳到 Crawlab,配置執(zhí)行命令,點(diǎn)擊“運(yùn)行”按鈕,就可以執(zhí)行爬蟲任務(wù)了。爬蟲任務(wù)可以在任何節(jié)點(diǎn)上運(yùn)行。從上圖可以看到,Crawlab 有節(jié)點(diǎn)管理、爬蟲管理、任務(wù)管理、定時(shí)任務(wù)、用戶管理等模塊。
整體架構(gòu)
以下是 Crawlab 的整體架構(gòu)圖,由五大部分組成:
1.主節(jié)點(diǎn)(Master Node):負(fù)責(zé)任務(wù)派發(fā)、API、部署爬蟲等;
2.工作節(jié)點(diǎn)(Worker Node):負(fù)責(zé)執(zhí)行爬蟲任務(wù);
3.MongoDB 數(shù)據(jù)庫:存儲節(jié)點(diǎn)、爬蟲、任務(wù)等日常運(yùn)行數(shù)據(jù);
4.Redis 數(shù)據(jù)庫:儲存任務(wù)消息隊(duì)列、節(jié)點(diǎn)心跳等信息。
5.前端客戶端:Vue 應(yīng)用,負(fù)責(zé)前端交互和向后端請求數(shù)據(jù)。
Github地址及Demo
查看演示 DemoGithub: https://github.com/tikazyq/crawlab
使用 Docker 部署安裝 Crawlab
Docker 鏡像
Docker 是部署 Crawlab 最方便和簡潔的方式。其他部署方式包括直接部署,不過對于想快速搭建平臺的開發(fā)者來說不推薦。Crawlab 已在Dockerhub上注冊了相關(guān)的鏡像,開發(fā)者僅需要執(zhí)行docker pull tikazyq/crawlab命令就可以將 Crawlab 的鏡像下載下來。
讀者可以去 Dockerhub 上查看 Crawlab 的鏡像,只有僅不到 300Mb。地址:https://hub.docker.com/r/tikazyq/crawlab/tags
Dockerhub Page
安裝 Docker
要使用 Docker 來部署 Crawlab,您首先得保證 Docker 已經(jīng)安裝好。請參考以下文檔來安裝。
安裝 Docker Compose
Docker Compose 是簡單的運(yùn)行 Docker 集群的工具,非常輕量級,我們將用到 Docker Compose 來一鍵部署 Crawlab。
Docker 的官方網(wǎng)站已經(jīng)有如何安裝 Docker Compose 的教程,點(diǎn)擊鏈接查看。這里簡單介紹一下。
Linux 用戶請用以下命令安裝。
# 下載 docker-compose sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose` # 將 docker-compose 變成執(zhí)行文件 sudo chmod +x /usr/local/bin/docker-compose
拉取鏡像
在拉取鏡像之前,您需要配置一下鏡像源。因?yàn)樵趪鴥?nèi),使用原有的鏡像源速度不是很快,需要使用 DockerHub 在國內(nèi)的加速器。請創(chuàng)建/etc/docker/daemon.json文件,輸入如下內(nèi)容。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
然后拉取鏡像,就會快很多了。當(dāng)然,您也可以用其他鏡像源,可以網(wǎng)上去搜索一下。執(zhí)行以下命令將 Crawlab 鏡像拉取下來。
docker pull tikazyq/crawlab:latest
下圖為拉取鏡像時(shí)的命令行界面。
docker pull
啟動 Crawlab
我們將用 Docker Compose 啟動 Crawlab 以及其依賴的數(shù)據(jù)庫 MongoDB 和 Redis。首先我們需要修改一下 Docker Compose 的 yaml 配置文件docker-compose.yml。這個(gè)配置文件定義了需要啟動的容器服務(wù)(Container Services)以及網(wǎng)絡(luò)配置(Network Configuration)。這里我們用 Crawlab 自帶的docker-compose.yml。
version: '3.3' # Docker Compose 的版本號(請看后續(xù)說明) services: # 服務(wù) master: # 服務(wù)名稱 image: tikazyq/crawlab:latest # 服務(wù)對應(yīng)的鏡像名稱 container_name: master # 服務(wù)對應(yīng)的容器名稱 environment: # 這里定義傳入的環(huán)境變量 CRAWLAB_API_ADDRESS: "localhost:8000" # 前端調(diào)用的 API 地址,默認(rèn)為 localhost:8000 CRAWLAB_SERVER_MASTER: "Y" # 是否為主節(jié)點(diǎn),Y/N CRAWLAB_MONGO_HOST: "mongo" # MongoDB host,由于在 Docker Compose 里,可以引用服務(wù)名稱 CRAWLAB_REDIS_ADDRESS: "redis" # Redis host,由于在 Docker Compose 里,可以引用服務(wù)名稱 ports: # 映射的端口 - "8080:8080" # 前端端口 - "8000:8000" # 后端端口 depends_on: # 依賴的服務(wù) - mongo # MongoDB - redis # Redis worker: # 工作節(jié)點(diǎn),與主節(jié)點(diǎn)配置類似,不重復(fù)寫了 image: tikazyq/crawlab:latest container_name: worker environment: CRAWLAB_SERVER_MASTER: "N" CRAWLAB_MONGO_HOST: "mongo" CRAWLAB_REDIS_ADDRESS: "redis" depends_on: - mongo - redis mongo: # MongoDB 服務(wù)名稱 image: mongo:latest # MongoDB 鏡像名稱 restart: always # 重啟策略為“總是” ports: # 映射端口 - "27017:27017" redis: # Redis 服務(wù)名稱 image: redis:latest # Redis 鏡像名稱 restart: always # 重啟策略為“總是” ports: # 映射端口 - "6379:6379"
讀者可以根據(jù)自己的要求來配置docker-compose.yml。尤其需要注意CRAWLAB_API_ADDRESS這個(gè)環(huán)境變量,很多初學(xué)使用者都是因?yàn)樵撟兞颗渲貌徽_而導(dǎo)致無法登陸。大多數(shù)情況,您不用做任何配置更改。請參考Q&A來處理常見問題,以及詳細(xì)的環(huán)境變量配置文檔來幫助根據(jù)自身環(huán)境配置 Crawlab。
然后,運(yùn)行下列命令啟動 Crawlab??梢约右粋€(gè)-d參數(shù)讓 Docker Compose 后臺運(yùn)行。
docker-compose up
運(yùn)行上述命令后,Docker Compose 會去拉取 MongoDB 和 Redis 的鏡像,這可能會花幾分鐘時(shí)間。拉取完畢后,四個(gè)服務(wù)會依次啟動,您將會在命令行中看到如下內(nèi)容。
docker-compose
正常情況下,您應(yīng)該可以看到四個(gè)服務(wù)都啟動成功,并能夠順利打印日志。
如果您是在本機(jī)上啟動的 Docker Compose,可以在瀏覽器中輸入http://localhost:8080,然后就能看到登陸界面了;如果您是在其他機(jī)器上啟動的 Docker Compose,您需要在瀏覽器中輸入http://<your_ip>:8080來看到登陸界面,<your_ip>是其他機(jī)器的 IP 地址(請保證 8080 端口在該機(jī)器已對外開放)。
login
初始登陸用戶名密碼是 admin/admin,您可以使用這個(gè)用戶名密碼來登陸。如果您的環(huán)境變量CRAWLAB_API_ADDRESS設(shè)置得不正確,您可能會看到點(diǎn)擊登陸后登陸按鈕會一直轉(zhuǎn)圈而沒有任何提示。這時(shí)請重新在docker-compose.yml中設(shè)置正確的CRAWLAB_API_ADDRESS(將localhost替換為<your_ip>),重新啟動docker-compose up。然后在瀏覽器中輸入http://<your_ip>:8080。
登陸之后您將看到 Crawlab 的主頁。
home
本篇文章主要介紹如何搭建爬蟲管理平臺 Crawlab,因此不會詳細(xì)介紹如何使用 Crawlab(可能會創(chuàng)建另一篇文章來詳細(xì)介紹,有興趣者可以關(guān)注一下)。如果您有困惑,請查看相關(guān)文檔來了解如何使用。
如何將 Scrapy 等爬蟲集成到 Crawlab
眾所周知,Scrapy 是非常受歡迎的爬蟲框架,其靈活的框架設(shè)計(jì)、高并發(fā)、易用性以及可擴(kuò)展性讓很多開發(fā)者和企業(yè)大量采用。市面上的爬蟲管理平臺幾乎都支持 Scrapy 爬蟲,Crawlab 也不例外,但 Crawlab 可以運(yùn)行 puppeteer、selenium 等其他爬蟲。下面將介紹一下在 Crawlab 中如何運(yùn)行 scrapy 爬蟲。
Crawlab 是執(zhí)行爬蟲基本原理
Crawlab 執(zhí)行爬蟲的原理很簡單,其實(shí)就是一個(gè) shell 命令。用戶在爬蟲中輸入執(zhí)行爬蟲的 shell 命令,例如scrapy crawl some_spider,Crawlab 執(zhí)行器會讀取這個(gè)命令,并在 shell 中直接執(zhí)行。因此,每一次運(yùn)行爬蟲任務(wù),就是執(zhí)行了一次 shell 命令(當(dāng)然,實(shí)際情況要比這個(gè)復(fù)雜很多,感興趣的可以去參考官方文檔)。Crawlab 是支持展示和導(dǎo)出爬蟲結(jié)果的,不過這需要稍微多做一些工作。
編寫 Pipeline
要集成 scrapy 爬蟲,無非就是將爬蟲抓取的數(shù)據(jù)存到 Crawlab 的數(shù)據(jù)庫里,然后用任務(wù) ID 關(guān)聯(lián)起來。每次執(zhí)行爬蟲任務(wù),任務(wù) ID 會通過環(huán)境變量傳到爬蟲程序中,因此我們需要做的就是將任務(wù) ID 加上結(jié)果存到數(shù)據(jù)庫里(Crawlab 現(xiàn)在只支持 MongoDB,后期會開發(fā) MySQL、SQL Server、Postgres 等關(guān)系型數(shù)據(jù)庫,有需求的用戶可以關(guān)注一下)。
在 Scrapy 中,我們需要編寫儲存邏輯。示意代碼如下:
# 引入相關(guān)的庫,pymongo 是標(biāo)準(zhǔn)連接 MongoDB 的庫
import os
from pymongo import MongoClient
# MongoDB 配置參數(shù)
MONGO_HOST = '192.168.99.100'
MONGO_PORT = 27017
MONGO_DB = 'crawlab_test'
class JuejinPipeline(object):
mongo = MongoClient(host=MONGO_HOST, port=MONGO_PORT) # mongo 連接實(shí)例
db = mongo[MONGO_DB] # 數(shù)據(jù)庫實(shí)例
col_name = os.environ.get('CRAWLAB_COLLECTION') # 集合名稱,通過環(huán)境變量 CRAWLAB_COLLECTION 傳過來
# 如果 CRAWLAB_COLLECTION 不存在,則默認(rèn)集合名稱為 test
if not col_name:
col_name = 'test'
col = db[col_name] # 集合實(shí)例
# 每一個(gè)傳入 item 會調(diào)用的函數(shù),參數(shù)分別為 item 和 spider
def process_item(self, item, spider):
item['task_id'] = os.environ.get('CRAWLAB_TASK_ID') # 將 task_id 設(shè)置為環(huán)境變量傳過來的任務(wù) ID
self.col.save(item) # 保存 item 在數(shù)據(jù)庫中
return item
同時(shí),您也需要在items.py中加入task_id字段,已保證值能夠被賦上(這很重要)。
上傳并配置爬蟲
在運(yùn)行爬蟲之前,您需要上傳爬蟲文件到主節(jié)點(diǎn)。步驟如下:
1.將爬蟲文件打包成 zip(注意,要保證在根目錄下直接打包);
2.在側(cè)邊欄點(diǎn)擊“爬蟲”導(dǎo)航至爬蟲列表,點(diǎn)擊“添加爬蟲”按鈕,選擇“自定義爬蟲”;
3.點(diǎn)擊“上傳”按鈕,選擇剛剛打包好的 zip 文件
4.上傳成功后,爬蟲列表中會出現(xiàn)新添加的自定義爬蟲,這樣就算上傳成功了。
可以在爬蟲詳情中點(diǎn)擊“文件”標(biāo)簽,選擇一個(gè)文件,可以在文件中編輯代碼。
接下來,您需要在“概覽”標(biāo)簽中的“執(zhí)行命令”一欄輸入爬蟲的 shell 執(zhí)行命令。Crawlab 的 Docker 鏡像里是內(nèi)置了 scrapy 的,因此可以直接運(yùn)行 scrapy 爬蟲。命令就是scrapy crawl <some_spider>。點(diǎn)擊“保存”按鈕保存爬蟲配置。
運(yùn)行爬蟲任務(wù)
然后就是運(yùn)行爬蟲任務(wù)了。其實(shí)很簡單,在“概覽”標(biāo)簽中點(diǎn)擊“運(yùn)行”按鈕,爬蟲任務(wù)就開始運(yùn)行了。如果日志提示找不到 scrapy 命令,可以將scrapy改為絕對路徑/usr/local/bin/scrapy,這樣就會運(yùn)行成功。
任務(wù)運(yùn)行情況會在“任務(wù)”頁面或者爬蟲“概覽”里展現(xiàn),會每 5 秒鐘更新一次,大家可以在這上面查看。而且在爬蟲“結(jié)果”標(biāo)簽里,可以預(yù)覽結(jié)果的詳情,還可以導(dǎo)出數(shù)據(jù)成 CSV 文件。
構(gòu)建持續(xù)集成(CI)工作流
對于企業(yè)來說,軟件開發(fā)一般是一個(gè)自動化過程。它會經(jīng)歷需求、開發(fā)、部署、測試、上線這幾個(gè)步驟。而這個(gè)流程一般是不斷迭代(Iterative)的,需要不斷更新和發(fā)布。
以爬蟲為例,您上線了一個(gè)爬蟲,這個(gè)爬蟲會定期抓取網(wǎng)站數(shù)據(jù)。但突然有一天您發(fā)現(xiàn)數(shù)據(jù)抓不到了,您快速定位原因,發(fā)現(xiàn)原來是網(wǎng)站改版了,您需要更改爬蟲抓取規(guī)則來應(yīng)對網(wǎng)站的改版??傊?,您需要發(fā)布一個(gè)代碼更新。最快的做法是直接在線上更改代碼。但這樣做非常危險(xiǎn):第一,您無法測試您更新后的代碼,只能通過不斷調(diào)整線上代碼來測試是否抓取成功;第二,您無法記錄這次更改,后期如果出了問題您很可能會忽略掉這次更改,從而導(dǎo)致 bug。您需要做的,無非是將您的爬蟲代碼用版本管理工具管理起來。我們有很多版本管理工具,最常用的就是 git、subversion,版本管理平臺包括 Gitlab、Bitbucket、自搭 Git 倉庫等。
當(dāng)我們更新了代碼,我們需要將更新后的代碼發(fā)布到線上服務(wù)器。這時(shí)您需要用自己寫部署腳本,或者更方便的,用 Jenkins 作為持續(xù)集成(Continuous Integration)管理平臺。Jenkins 是一個(gè)持續(xù)集成平臺,可以通過獲取版本庫來更新部署代碼,是非常實(shí)用的工具,在很多企業(yè)中都有用到。下圖是如何將 Crawlab 爬蟲應(yīng)用到持續(xù)集成工作流程中的例子。
ci
要在 Crawlab 中創(chuàng)建或更新爬蟲有兩種方式:
1.上傳打包成后的 zip 文件;
2.通過更改主節(jié)點(diǎn)中目錄CRAWLAB_SPIDER_PATH中的爬蟲文件。
我們做持續(xù)集成,就是針對第二種方式。步驟如下:
1.用 Gitlab 或其他平臺搭建好代碼倉庫;
2.在 Jenkins 中創(chuàng)建一個(gè)項(xiàng)目,在項(xiàng)目中將代碼源指向之前創(chuàng)建的倉庫;
3.在 Jenkins 項(xiàng)目中編寫工作流,將發(fā)布地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,如果是 Docker 注意將該地址掛載到宿主機(jī)文件系統(tǒng);
4.Jenkins 項(xiàng)目的工作可以直接編寫,也可以用 Jenkinsfile,具體可以查相關(guān)資料;
5.這樣,每一次代碼更新提交到代碼倉庫后,Jenkins 就會將更新后的代碼發(fā)布到 Crawlab 里,Crawlab 主節(jié)點(diǎn)會將爬蟲代碼同步到工作節(jié)點(diǎn),以待抓取。
總結(jié)
本篇文章主要介紹了爬蟲管理平臺的定義、如何選擇爬蟲管理平臺,著重介紹了如何搭建開源爬蟲管理平臺 Crawlab,另外還講到了如何集成 scrapy 爬蟲以及如何打造持續(xù)集成工作流。本篇文章沒有涉及到的內(nèi)容還有很多,包括如何 Crawlab 的原理和架構(gòu)詳情、如何使用 Crawlab、如何編寫大規(guī)模爬蟲、如何使用 Jenkins 等等。這些內(nèi)容可能會在其他文章中發(fā)布,請感興趣的讀者多多關(guān)注。另外,Crawlab 還有一些需要提升的地方,例如異常監(jiān)控(零值、空值)、可配置爬蟲、可視化抓取、日志集中收集等等。這些功能都將在以后陸續(xù)開發(fā)和發(fā)布,請大家也多多關(guān)注。
以上就是Crawlab怎么部署的詳細(xì)內(nèi)容,更多python的學(xué)習(xí)資料請關(guān)注W3Cschool其它相關(guān)文章!