小白也能看懂!教你如何快速搭建實用的爬蟲管理平臺

寫在前面:本篇文章內容較多,涉及知識較廣,讀完須要大約 20 分鐘,請讀者耐心閱讀。

現在大多數企業都離不開爬蟲,它是獲取數據的一種有效方式。可是對爬蟲有着規模量級要求的企業或我的須要同時處理不一樣類別的爬蟲,這會憑空增添不少附加的管理成本。同時,爬蟲管理者還須要應對網站內容變動、持續增量抓取、任務失敗等問題。所以一個成熟的爬蟲管理流程應該包含一個管理系統,可以有效處理上述問題。前端

爬蟲有多重要

對搜索引擎來講,爬蟲不可或缺;對輿情公司來講,爬蟲是基礎;對 NLP來講,爬蟲能夠獲取語料;對初創公司來講,爬蟲能夠獲取初始內容。可是爬蟲技術紛繁複雜,不一樣類型的抓取場景會運用到不一樣的技術。例如,簡單的靜態頁面能夠用 HTTP 請求+HTML 解析器直接搞定;一個動態頁面須要用 Puppeteer 或 Selenium等自動化測試工具;有反爬的網站須要用到代理、打碼等技術;等等。那麼此時就須要一個成熟的爬蟲管理平臺,幫助企業或我的處理大量的爬蟲類別。git

理解什麼是爬蟲管理平臺

定義

爬蟲管理平臺是一個一站式管理系統,集爬蟲部署、任務調度、任務監控、結果展現等模塊於一體,一般配有可視化 UI 界面,能夠在 Web 端經過與 UI 界面交互來有效管理爬蟲。爬蟲管理平臺通常來講是支持分佈式的,能夠在多臺機器上協做運行。github

固然,上述這個定義是狹義的,一般針對於技術人員或開發者或技術經理。企業內部通常都會開發本身的內部爬蟲管理系統,以應對複雜的爬蟲管理需求。這樣的系統就是上述定義的狹義的爬蟲管理平臺。web

廣義爬蟲管理平臺

而什麼是廣義的爬蟲管理平臺呢?您可能據說過神箭手(後轉型爲后羿採集器)和八爪魚吧。前者是基於雲服務的,能夠在線上編寫、運行和監控爬蟲,在廣義爬蟲平臺中最接近狹義定義的爬蟲管理平臺;後者是一個大衆的商業爬蟲抓取工具,可讓小白用戶拖拉拽編寫、運行爬蟲,導出數據。您也可能見過各類 API 聚合服務商,例如聚合數據,這是一個能夠直接調用網站接口獲取數據的平臺,這其實也算做爬蟲平臺的一個變種,只是它幫你完成了爬蟲編寫這一過程。而介於這二者之間的呢,國外有一家叫 Kimonolab 的公司,它開發了一個叫 Kimono 的 Chrome 插件,可讓用戶在頁面上可視化的點擊元素並生成抓取規則,並在其網站上生成爬蟲程序,用戶提交任務,後臺就能夠自動在網站上抓取數據了。Kimono 是一個偉大的爬蟲應用,但惋惜的是,Kimonolab 已經被大數據公司 Plantir 收購,如今也就沒法體驗了。redis

在本文中,咱們主要關注狹義定義的爬蟲管理平臺,所以後面所講到的爬蟲管理平臺都是指狹義的定義。docker

爬蟲管理平臺模塊

如下是一個典型的爬蟲管理平臺所涉及的模塊。shell

爬蟲管理平臺架構數據庫

典型爬蟲管理平臺的模塊主要包含如下內容:編程

  • 任務管理:如何執行、調度爬蟲抓取任務,以及如何監控任務,包括日誌監控等等;
  • 爬蟲管理:包括爬蟲部署,即將開發好的爬蟲部署(打包或複製)到相應的節點上,以及爬蟲配置和版本管理;
  • 節點管理:包括節點(服務器/機器)的註冊和監控,以及節點之間的通訊,如何監控節點性能情況等;
  • 前端應用:包括一個可視化 UI 界面,讓用戶可經過與其交互,與後臺應用進行通訊。

固然,有些爬蟲管理平臺可能還不止這些模塊,它可能包括其餘比較實用的功能,例如可配置的抓取規則、可視化配置抓取規則、代理池、Cookie 池、異常監控等等。json

爲何須要爬蟲管理平臺

有了爬蟲管理平臺,開發者特別是爬蟲工程師就可以方便的添加爬蟲、執行任務、查看結果,而不用在命令行之間來回切換,很是容易出錯。一個常見的場景就是爬蟲工程師最初技術選型用了 scrapy 和 crontab 來管理爬蟲任務,他不得不當心翼翼的選擇定時任務的時間區間,以致於不會將服務器 CPU 或內存佔滿;更棘手的問題是,他還須要將 scrapy 產生的日誌存到文件裏,一旦爬蟲出錯了,他不得不用 shell 命令一個一個來查看日誌來定位錯誤緣由,嚴重時會花上一個成天;還有個嚴重的問題,爬蟲工程師可能發現公司業務量在增長,他須要寫上百個爬蟲來知足公司的業務需求,而用 scrapy 和 crontab 來管理徹底就是個噩夢。可憐的爬蟲工程師其實徹底能夠選擇一個合適爬蟲管理平臺來解決他的問題。

如何選擇一個合適的爬蟲管理平臺

當您願意解決前面提到的爬蟲工程師遇到的困難問題,而轉而想選擇一個合適的爬蟲管理平臺時。

您首先應該回答的問題是:咱們是否須要從零開始開發一套系統(Start from scratch)?要回答這個問題,您應該先回答下面幾個問題:

  1. 咱們的需求是否複雜到須要徹底定製化開發一套新系統(例如要求複雜的權限管理)?
  2. 咱們的團隊是否有足夠的技術實力來開發這套系統(例若有經驗豐富的先後端開發工程師)?
  3. 咱們的時間資源是否足夠咱們開發這套系統(例如項目計劃週期爲一年)?

若是上述三個問題的答案任意一個爲「否」,您應該好好考慮利用市面上已有的開源爬蟲管理平臺來知足您的需求。

如下爲市面上已有的開源爬蟲管理平臺:

總的來講,SpiderKeeper 多是最先的爬蟲管理平臺,但功能相對來講比較侷限;Gerapy 雖然功能齊全,界面精美,但有很多 bug 須要處理,建議有需求的用戶等待 2.0 版本;Scrapydweb是一個比較完善的爬蟲管理平臺,不過和前二者同樣,都是基於 scrapyd 的,所以只能運行 scrapy 爬蟲;而Crawlab是一個很是靈活的爬蟲管理平臺,能夠運行 Python、Nodejs、Java、PHP、Go 寫的爬蟲,並且功能比較齊全,只是部署起來相對於前三者來講要麻煩一些,不過對於 Docker 使用者來講能夠作到一件部署(後面咱們會講)。

所以,對於重度 scrapy 爬蟲依賴的、又不想折騰的開發者,能夠考慮 Scrapydweb;而對於有各類類型的、複雜技術結構的爬蟲開發者來講,應該優先考慮更靈活的 Crawlab。固然,不是說 Crawlab 對 scrapy 支持不友好,Crawlab 一樣能夠很好的集成 scrapy,後面會介紹。

做爲 Crawlab 的做者,不想王婆賣瓜,自賣自詡,做者僅僅但願將最好的技術選型推薦給開發者,讓開發者根據自身的需求來決定該使用哪一種爬蟲管理平臺。

爬蟲管理平臺 Crawlab 介紹

簡介

Crawlab 是基於 Golang 的分佈式爬蟲管理平臺,支持 Python、NodeJS、Java、Go、PHP 等多種編程語言以及多種爬蟲框架。

Crawlab 自今年三月份上線以來受到爬蟲愛好者們和開發者們的好評,很多使用者還表示會用 Crawlab 搭建公司的爬蟲平臺。通過近數月的迭代,Crawlab 陸續上線了定時任務、數據分析、網站信息、可配置爬蟲、自動提取字段、下載結果、上傳爬蟲等功能,將平臺變得得更加實用,更加全面,可以真正幫助用戶解決爬蟲管理困難的問題。現在在 Github 上有近 1k 的 star,相關社區也創建起來,四分之一的用戶表示已經將 Crawlab 應用於企業爬蟲管理。能夠看出,Crawlab 是受開發者們關注和喜歡的。

解決問題

Crawlab 主要解決的是大量爬蟲管理困難的問題,例如須要監控上百個網站的參雜 scrapy 和 selenium 的項目不容易作到同時管理,並且命令行管理的成本很是高,還容易出錯。Crawlab 支持任何語言和任何框架,配合任務調度、任務監控,很容易作到對成規模的爬蟲項目進行有效監控管理。

界面及使用

下面是 Crawlab 爬蟲列表頁面的截圖。

Crawlab 爬蟲列表

用戶只須要將爬蟲上傳到 Crawlab,配置執行命令,點擊「運行」按鈕,就能夠執行爬蟲任務了。爬蟲任務能夠在任何節點上運行。從上圖能夠看到,Crawlab 有節點管理、爬蟲管理、任務管理、定時任務、用戶管理等模塊。

總體架構

如下是 Crawlab 的總體架構圖,由五大部分組成:

  1. 主節點(Master Node):負責任務派發、API、部署爬蟲等;
  2. 工做節點(Worker Node):負責執行爬蟲任務;
  3. MongoDB 數據庫:存儲節點、爬蟲、任務等平常運行數據;
  4. Redis 數據庫:儲存任務消息隊列、節點心跳等信息。
  5. 前端客戶端:Vue 應用,負責前端交互和向後端請求數據。

Crawlab 架構

關於 Crawlab 如何使用和詳細原理超出了本篇文章的範圍,感興趣的能夠去參考Github 主頁相關文檔

Github地址及Demo

使用 Docker 部署安裝 Crawlab

Docker 鏡像

Docker 是部署 Crawlab 最方便和簡潔的方式。其餘部署方式包括直接部署,不過對於想快速搭建平臺的開發者來講不推薦。Crawlab 已在Dockerhub上註冊了相關的鏡像,開發者僅須要執行docker pull tikazyq/crawlab命令就能夠將 Crawlab 的鏡像下載下來。

讀者能夠去 Dockerhub 上查看 Crawlab 的鏡像,只有僅不到 300Mb。地址:https://hub.docker.com/r/tika...

Dockerhub Page

安裝 Docker

要使用 Docker 來部署 Crawlab,您首先得保證 Docker 已經安裝好。請參考如下文檔來安裝。

安裝 Docker Compose

Docker Compose 是簡單的運行 Docker 集羣的工具,很是輕量級,咱們將用到 Docker Compose 來一鍵部署 Crawlab。

Docker 的官方網站已經有如何安裝 Docker Compose 的教程,點擊連接查看。這裏簡單介紹一下。

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 變成執行文件

sudo chmod +x /usr/local/bin/docker-compose

拉取鏡像

在拉取鏡像以前,您須要配置一下鏡像源。由於在國內,使用原有的鏡像源速度不是很快,須要使用 DockerHub 在國內的加速器。請建立/etc/docker/daemon.json文件,輸入以下內容。

{ "registry-mirrors": ["https://registry.docker-cn.com"]
}

而後拉取鏡像,就會快不少了。固然,您也能夠用其餘鏡像源,能夠網上去搜索一下。執行如下命令將 Crawlab 鏡像拉取下來。

docker pull tikazyq/crawlab:latest

下圖爲拉取鏡像時的命令行界面。

docker pull

啓動 Crawlab

咱們將用 Docker Compose 啓動 Crawlab 以及其依賴的數據庫 MongoDB 和 Redis。首先咱們須要修改一下 Docker Compose 的 yaml 配置文件docker-compose.yml。這個配置文件定義了須要啓動的容器服務(Container Services)以及網絡配置(Network Configuration)。這裏咱們用 Crawlab 自帶的docker-compose.yml。

version: '3.3' # Docker Compose 的版本號(請看後續說明)
services: # 服務
master: # 服務名稱

image: tikazyq/crawlab:latest  # 服務對應的鏡像名稱
container_name: master  # 服務對應的容器名稱
environment:  # 這裏定義傳入的環境變量
  CRAWLAB_API_ADDRESS: "localhost:8000"  # 前端調用的 API 地址,默認爲 localhost:8000 CRAWLAB_SERVER_MASTER: "Y"  # 是否爲主節點,Y/N
  CRAWLAB_MONGO_HOST: "mongo" # MongoDB host,因爲在 Docker Compose 裏,能夠引用服務名稱
  CRAWLAB_REDIS_ADDRESS: "redis" # Redis host,因爲在 Docker Compose 裏,能夠引用服務名稱
ports:  # 映射的端口 - "8080:8080" # 前端端口 - "8000:8000" # 後端端口
depends_on: # 依賴的服務 - mongo  # MongoDB - redis  # Redis

worker: # 工做節點,與主節點配置相似,不重複寫了

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 服務名稱

image: mongo:latest  # MongoDB 鏡像名稱
restart: always  # 重啓策略爲「老是」
ports:  # 映射端口 - "27017:27017" redis:  # Redis 服務名稱
image: redis:latest  # Redis 鏡像名稱
restart: always  # 重啓策略爲「老是」
ports:  # 映射端口 - "6379:6379"

讀者能夠根據本身的要求來配置docker-compose.yml。尤爲須要注意CRAWLAB_API_ADDRESS這個環境變量,不少初學使用者都是由於該變量配置不正確而致使沒法登錄。大多數狀況,您不用作任何配置更改。請參考Q&A來處理常見問題,以及詳細的環境變量配置文檔來幫助根據自身環境配置 Crawlab。

而後,運行下列命令啓動 Crawlab。能夠加一個-d參數讓 Docker Compose 後臺運行。

docker-compose up

運行上述命令後,Docker Compose 會去拉取 MongoDB 和 Redis 的鏡像,這可能會花幾分鐘時間。拉取完畢後,四個服務會依次啓動,您將會在命令行中看到以下內容。

docker-compose

正常狀況下,您應該能夠看到四個服務都啓動成功,並可以順利打印日誌。

若是您是在本機上啓動的 Docker Compose,能夠在瀏覽器中輸入http://localhost:8080,而後就能看到登錄界面了;若是您是在其餘機器上啓動的 Docker Compose,您須要在瀏覽器中輸入http://&lt;your_ip>:8080來看到登錄界面,<your_ip>是其餘機器的 IP 地址(請保證 8080 端口在該機器已對外開放)。

login

初始登錄用戶名密碼是 admin/admin,您可使用這個用戶名密碼來登錄。若是您的環境變量CRAWLAB_API_ADDRESS設置得不正確,您可能會看到點擊登錄後登錄按鈕會一直轉圈而沒有任何提示。這時請從新在docker-compose.yml中設置正確的CRAWLAB_API_ADDRESS(將localhost替換爲<your_ip>),從新啓動docker-compose up。而後在瀏覽器中輸入http://&lt;your_ip>:8080。

登錄以後您將看到 Crawlab 的主頁。

home

本篇文章主要介紹如何搭建爬蟲管理平臺 Crawlab,所以不會詳細介紹如何使用 Crawlab(可能會建立另外一篇文章來詳細介紹,有興趣者能夠關注一下)。若是您有困惑,請查看相關文檔來了解如何使用。

如何將 Scrapy 等爬蟲集成到 Crawlab

衆所周知,Scrapy 是很是受歡迎的爬蟲框架,其靈活的框架設計、高併發、易用性以及可擴展性讓不少開發者和企業大量採用。市面上的爬蟲管理平臺幾乎都支持 Scrapy 爬蟲,Crawlab 也不例外,但 Crawlab 能夠運行 puppeteer、selenium 等其餘爬蟲。下面將介紹一下在 Crawlab 中如何運行 scrapy 爬蟲。

Crawlab 是執行爬蟲基本原理

Crawlab 執行爬蟲的原理很簡單,其實就是一個 shell 命令。用戶在爬蟲中輸入執行爬蟲的 shell 命令,例如scrapy crawl some_spider,Crawlab 執行器會讀取這個命令,並在 shell 中直接執行。所以,每一次運行爬蟲任務,就是執行了一次 shell 命令(固然,實際狀況要比這個複雜不少,感興趣的能夠去參考官方文檔)。Crawlab 是支持展現和導出爬蟲結果的,不過這須要稍微多作一些工做。

編寫 Pipeline

要集成 scrapy 爬蟲,無非就是將爬蟲抓取的數據存到 Crawlab 的數據庫裏,而後用任務 ID 關聯起來。每次執行爬蟲任務,任務 ID 會經過環境變量傳到爬蟲程序中,所以咱們須要作的就是將任務 ID 加上結果存到數據庫裏(Crawlab 如今只支持 MongoDB,後期會開發 MySQL、SQL Server、Postgres 等關係型數據庫,有需求的用戶能夠關注一下)。

在 Scrapy 中,咱們須要編寫儲存邏輯。示意代碼以下:

引入相關的庫,pymongo 是標準鏈接 MongoDB 的庫

import os from pymongo import MongoClient

MongoDB 配置參數

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 鏈接實例
db = mongo[MONGO_DB]  # 數據庫實例
col_name = os.environ.get('CRAWLAB_COLLECTION')  # 集合名稱,經過環境變量 CRAWLAB_COLLECTION 傳過來

# 若是 CRAWLAB_COLLECTION 不存在,則默認集合名稱爲 test if not col_name:

col_name = 'test' col = db[col_name]  # 集合實例

# 每個傳入 item 會調用的函數,參數分別爲 item 和 spider

def process_item(self, item, spider):
    item['task_id'] = os.environ.get('CRAWLAB_TASK_ID')  # 將 task_id 設置爲環境變量傳過來的任務 ID
    self.col.save(item)  # 保存 item 在數據庫中 return item

同時,您也須要在items.py中加入task_id字段,已保證值可以被賦上(這很重要)。

上傳並配置爬蟲

在運行爬蟲以前,您須要上傳爬蟲文件到主節點。步驟以下:

  1. 將爬蟲文件打包成 zip(注意,要保證在根目錄下直接打包);
  2. 在側邊欄點擊「爬蟲」導航至爬蟲列表,點擊「添加爬蟲」按鈕,選擇「自定義爬蟲」;
  3. 點擊「上傳」按鈕,選擇剛剛打包好的 zip 文件
  4. 上傳成功後,爬蟲列表中會出現新添加的自定義爬蟲,這樣就算上傳成功了。

能夠在爬蟲詳情中點擊「文件」標籤,選擇一個文件,能夠在文件中編輯代碼。

接下來,您須要在「概覽」標籤中的「執行命令」一欄輸入爬蟲的 shell 執行命令。Crawlab 的 Docker 鏡像裏是內置了 scrapy 的,所以能夠直接運行 scrapy 爬蟲。命令就是scrapy crawl <some_spider>。點擊「保存」按鈕保存爬蟲配置。

運行爬蟲任務

而後就是運行爬蟲任務了。其實很簡單,在「概覽」標籤中點擊「運行」按鈕,爬蟲任務就開始運行了。若是日誌提示找不到 scrapy 命令,能夠將scrapy改成絕對路徑/usr/local/bin/scrapy,這樣就會運行成功。

任務運行狀況會在「任務」頁面或者爬蟲「概覽」裏展示,會每 5 秒鐘更新一次,你們能夠在這上面查看。並且在爬蟲「結果」標籤裏,能夠預覽結果的詳情,還能夠導出數據成 CSV 文件。

構建持續集成(CI)工做流

對於企業來講,軟件開發通常是一個自動化過程。它會經歷需求、開發、部署、測試、上線這幾個步驟。而這個流程通常是不斷迭代(Iterative)的,須要不斷更新和發佈。

以爬蟲爲例,您上線了一個爬蟲,這個爬蟲會按期抓取網站數據。但忽然有一天您發現數據抓不到了,您快速定位緣由,發現原來是網站改版了,您須要更改爬蟲抓取規則來應對網站的改版。總之,您須要發佈一個代碼更新。最快的作法是直接在線上更改代碼。但這樣作很是危險:第一,您沒法測試您更新後的代碼,只能經過不斷調整線上代碼來測試是否抓取成功;第二,您沒法記錄此次更改,後期若是出了問題您極可能會忽略掉此次更改,從而致使 bug。您須要作的,無非是將您的爬蟲代碼用版本管理工具管理起來。咱們有不少版本管理工具,最經常使用的就是 git、subversion,版本管理平臺包括 Gitlab、Bitbucket、自搭 Git 倉庫等。

當咱們更新了代碼,咱們須要將更新後的代碼發佈到線上服務器。這時您須要用本身寫部署腳本,或者更方便的,用 Jenkins 做爲持續集成(Continuous Integration)管理平臺。Jenkins 是一個持續集成平臺,能夠經過獲取版本庫來更新部署代碼,是很是實用的工具,在不少企業中都有用到。下圖是如何將 Crawlab 爬蟲應用到持續集成工做流程中的例子。

ci

要在 Crawlab 中建立或更新爬蟲有兩種方式:

  1. 上傳打包成後的 zip 文件;
  2. 經過更改主節點中目錄CRAWLAB_SPIDER_PATH中的爬蟲文件。

咱們作持續集成,就是針對第二種方式。步驟以下:

  1. 用 Gitlab 或其餘平臺搭建好代碼倉庫;
  2. 在 Jenkins 中建立一個項目,在項目中將代碼源指向以前建立的倉庫;
  3. 在 Jenkins 項目中編寫工做流,將發佈地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,若是是 Docker 注意將該地址掛載到宿主機文件系統;
  4. Jenkins 項目的工做能夠直接編寫,也能夠用 Jenkinsfile,具體能夠查相關資料;
  5. 這樣,每一次代碼更新提交到代碼倉庫後,Jenkins 就會將更新後的代碼發佈到 Crawlab 裏,Crawlab 主節點會將爬蟲代碼同步到工做節點,以待抓取。

總結

本篇文章主要介紹了爬蟲管理平臺的定義、如何選擇爬蟲管理平臺,着重介紹瞭如何搭建開源爬蟲管理平臺 Crawlab,另外還講到了如何集成 scrapy 爬蟲以及如何打造持續集成工做流。本篇文章沒有涉及到的內容還有不少,包括如何 Crawlab 的原理和架構詳情、如何使用 Crawlab、如何編寫大規模爬蟲、如何使用 Jenkins 等等。這些內容可能會在其餘文章中發佈,請感興趣的讀者多多關注。另外,Crawlab 還有一些須要提高的地方,例如異常監控(零值、空值)、可配置爬蟲、可視化抓取、日誌集中收集等等。這些功能都將在之後陸續開發和發佈,請你們也多多關注。

本文分享自華爲雲社區《如何快速搭建實用的爬蟲管理平臺》,原文做者:Marvin Zhang。

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索