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