App下載

怎么快速搭建python爬蟲(chóng)管理平臺(tái)?

猿友 2021-08-05 14:42:37 瀏覽數(shù) (2861)
反饋

對(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)模塊

爬蟲(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)。可憐的爬蟲(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):

已有開(kāi)源平臺(tái)對(duì)比

總的來(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è)面的截圖。

爬蟲(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ù)。

整體架構(gòu)

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

crawlab鏡像

Dockerhub Page

安裝 Docker

要使用 Docker 來(lái)部署 Crawlab,您首先得保證 Docker 已經(jīng)安裝好。請(qǐng)參考以下文檔來(lái)安裝。

安裝docker

安裝 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)單介紹一下。

安裝docker compose

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)容。

運(yùn)行結(jié)果

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)放)。

登錄頁(yè)面

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è)。

主頁(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è)文件,可以在文件中編輯代碼。

爬蟲(chóng)文件上傳

接下來(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ù)集成工作流程中的例子。

持續(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)文章!


0 人點(diǎn)贊