溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何快速搭建python爬蟲管理平臺

發(fā)布時間:2022-02-19 16:20:35 來源:億速云 閱讀:154 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下如何快速搭建python爬蟲管理平臺的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

爬蟲有多重要

對搜索引擎來說,爬蟲不可或缺;對輿情公司來說,爬蟲是基礎;對 NLP來說,爬蟲可以獲取語料;對初創(chuàng)公司來說,爬蟲可以獲取初始內(nèi)容。但是爬蟲技術紛繁復雜,不同類型的抓取場景會運用到不同的技術。例如,簡單的靜態(tài)頁面可以用 HTTP 請求+HTML 解析器直接搞定;一個動態(tài)頁面需要用 Puppeteer 或 Selenium等自動化測試工具;有反爬的網(wǎng)站需要用到代理、打碼等技術;等等。那么此時就需要一個成熟的爬蟲管理平臺,幫助企業(yè)或個人處理大量的爬蟲類別。

理解什么是爬蟲管理平臺

定義

爬蟲管理平臺是一個一站式管理系統(tǒng),集爬蟲部署、任務調(diào)度、任務監(jiān)控、結(jié)果展示等模塊于一體,通常配有可視化 UI 界面,可以在 Web 端通過與 UI 界面交互來有效管理爬蟲。爬蟲管理平臺一般來說是支持分布式的,可以在多臺機器上協(xié)作運行。

當然,上述這個定義是狹義的,通常針對于技術人員或開發(fā)者或技術經(jīng)理。企業(yè)內(nèi)部一般都會開發(fā)自己的內(nèi)部爬蟲管理系統(tǒng),以應對復雜的爬蟲管理需求。這樣的系統(tǒng)就是上述定義的狹義的爬蟲管理平臺。

廣義爬蟲管理平臺

而什么是廣義的爬蟲管理平臺呢?您可能聽說過神箭手(后轉(zhuǎn)型為后羿采集器)和八爪魚吧。前者是基于云服務的,可以在線上編寫、運行和監(jiān)控爬蟲,在廣義爬蟲平臺中最接近狹義定義的爬蟲管理平臺;后者是一個大眾的商業(yè)爬蟲抓取工具,可以讓小白用戶拖拉拽編寫、運行爬蟲,導出數(shù)據(jù)。您也可能見過各種 API 聚合服務商,例如聚合數(shù)據(jù),這是一個可以直接調(diào)用網(wǎng)站接口獲取數(shù)據(jù)的平臺,這其實也算作爬蟲平臺的一個變種,只是它幫你完成了爬蟲編寫這一過程。而介于這兩者之間的呢,國外有一家叫 Kimonolab 的公司,它開發(fā)了一個叫    Kimono 的 Chrome 插件,可以讓用戶在頁面上可視化的點擊元素并生成抓取規(guī)則,并在其網(wǎng)站上生成爬蟲程序,用戶提交任務,后臺就可以自動在網(wǎng)站上抓取數(shù)據(jù)了。Kimono 是一個偉大的爬蟲應用,但可惜的是,Kimonolab 已經(jīng)被大數(shù)據(jù)公司 Plantir 收購,現(xiàn)在也就無法體驗了。

在本文中,我們主要關注狹義定義的爬蟲管理平臺,因此后面所講到的爬蟲管理平臺都是指狹義的定義。

爬蟲管理平臺架構

典型爬蟲管理平臺的模塊主要包含以下內(nèi)容:

  • 任務管理:如何執(zhí)行、調(diào)度爬蟲抓取任務,以及如何監(jiān)控任務,包括日志監(jiān)控等等;

  • 爬蟲管理:包括爬蟲部署,即將開發(fā)好的爬蟲部署(打包或復制)到相應的節(jié)點上,以及爬蟲配置和版本管理;

  • 節(jié)點管理:包括節(jié)點(服務器/機器)的注冊和監(jiān)控,以及節(jié)點之間的通信,如何監(jiān)控節(jié)點性能狀況等;

  • 前端應用:包括一個可視化 UI 界面,讓用戶可通過與其交互,與后臺應用進行通信。

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

為什么需要爬蟲管理平臺

有了爬蟲管理平臺,開發(fā)者特別是爬蟲工程師就能夠方便的添加爬蟲、執(zhí)行任務、查看結(jié)果,而不用在命令行之間來回切換,非常容易出錯。一個常見的場景就是爬蟲工程師最初技術選型用了 scrapy 和 crontab 來管理爬蟲任務,他不得不小心翼翼的選擇定時任務的時間區(qū)間,以至于不會將服務器 CPU 或內(nèi)存占滿;更棘手的問題是,他還需要將 scrapy 產(chǎn)生的日志存到文件里,一旦爬蟲出錯了,他不得不用 shell 命令一個一個來查看日志來定位錯誤原因,嚴重時會花上一個整天;還有個嚴重的問題,爬蟲工程師可能發(fā)現(xiàn)公司業(yè)務量在增加,他需要寫上百個爬蟲來滿足公司的業(yè)務需求,而用    scrapy 和 crontab 來管理完全就是個噩夢??蓱z的爬蟲工程師其實完全可以選擇一個合適爬蟲管理平臺來解決他的問題。

爬蟲管理平臺 Crawlab 介紹簡介

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

Crawlab 自今年三月份上線以來受到爬蟲愛好者們和開發(fā)者們的好評,不少使用者還表示會用 Crawlab 搭建公司的爬蟲平臺。經(jīng)過近數(shù)月的迭代,Crawlab 陸續(xù)上線了定時任務、數(shù)據(jù)分析、網(wǎng)站信息、可配置爬蟲、自動提取字段、下載結(jié)果、上傳爬蟲等功能,將平臺變得得更加實用,更加全面,能夠真正幫助用戶解決爬蟲管理困難的問題。如今在 Github 上有近 1k 的 star,相關社區(qū)也建立起來,四分之一的用戶表示已經(jīng)將 Crawlab 應用于企業(yè)爬蟲管理??梢钥闯觯珻rawlab 是受開發(fā)者們關注和喜歡的。

解決問題

Crawlab 主要解決的是大量爬蟲管理困難的問題,例如需要監(jiān)控上百個網(wǎng)站的參雜 scrapy 和 selenium 的項目不容易做到同時管理,而且命令行管理的成本非常高,還容易出錯。Crawlab 支持任何語言和任何框架,配合任務調(diào)度、任務監(jiān)控,很容易做到對成規(guī)模的爬蟲項目進行有效監(jiān)控管理。

界面及使用

用戶只需要將爬蟲上傳到 Crawlab,配置執(zhí)行命令,點擊“運行”按鈕,就可以執(zhí)行爬蟲任務了。爬蟲任務可以在任何節(jié)點上運行。從上圖可以看到,Crawlab 有節(jié)點管理、爬蟲管理、任務管理、定時任務、用戶管理等模塊。

整體架構

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

1.主節(jié)點(Master Node):負責任務派發(fā)、API、部署爬蟲等;

2.工作節(jié)點(Worker Node):負責執(zhí)行爬蟲任務;

3.MongoDB 數(shù)據(jù)庫:存儲節(jié)點、爬蟲、任務等日常運行數(shù)據(jù);

4.Redis 數(shù)據(jù)庫:儲存任務消息隊列、節(jié)點心跳等信息。

5.前端客戶端:Vue 應用,負責前端交互和向后端請求數(shù)據(jù)。

使用 Docker 部署安裝 Crawlab

Docker 鏡像

Docker 是部署 Crawlab 最方便和簡潔的方式。其他部署方式包括直接部署,不過對于想快速搭建平臺的開發(fā)者來說不推薦。Crawlab 已在Dockerhub上注冊了相關的鏡像,開發(fā)者僅需要執(zhí)行docker pull tikazyq/crawlab命令就可以將 Crawlab 的鏡像下載下來。

讀者可以去 Dockerhub 上查看 Crawlab 的鏡像,只有僅不到 300Mb。

安裝 Docker

要使用 Docker 來部署 Crawlab,您首先得保證 Docker 已經(jīng)安裝好。

安裝 Docker Compose

Docker Compose 是簡單的運行 Docker 集群的工具,非常輕量級,我們將用到 Docker Compose 來一鍵部署 Crawlab。

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

拉取鏡像

在拉取鏡像之前,您需要配置一下鏡像源。因為在國內(nèi),使用原有的鏡像源速度不是很快,需要使用 DockerHub 在國內(nèi)的加速器。請創(chuàng)建/etc/docker/daemon.json文件,輸入如下內(nèi)容。

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

然后拉取鏡像,就會快很多了。當然,您也可以用其他鏡像源,可以網(wǎng)上去搜索一下。執(zhí)行以下命令將 Crawlab 鏡像拉取下來。

docker pull tikazyq/crawlab:latest

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

如何快速搭建python爬蟲管理平臺

docker pull

啟動 Crawlab

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

version: '3.3'  # Docker Compose 的版本號(請看后續(xù)說明)
services:  # 服務
  master:  # 服務名稱
    image: tikazyq/crawlab:latest  # 服務對應的鏡像名稱
    container_name: master  # 服務對應的容器名稱
    environment:  # 這里定義傳入的環(huán)境變量
      CRAWLAB_API_ADDRESS: "localhost:8000"  # 前端調(diào)用的 API 地址,默認為 localhost:8000
      CRAWLAB_SERVER_MASTER: "Y"  # 是否為主節(jié)點,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:  # 工作節(jié)點,與主節(jié)點配置類似,不重復寫了
    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"

讀者可以根據(jù)自己的要求來配置docker-compose.yml。尤其需要注意CRAWLAB_API_ADDRESS這個環(huán)境變量,很多初學使用者都是因為該變量配置不正確而導致無法登陸。大多數(shù)情況,您不用做任何配置更改。請參考Q&A來處理常見問題,以及詳細的環(huán)境變量配置文檔來幫助根據(jù)自身環(huán)境配置 Crawlab。

然后,運行下列命令啟動 Crawlab??梢约右粋€-d參數(shù)讓 Docker Compose 后臺運行。

docker-compose up

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

docker-compose

正常情況下,您應該可以看到四個服務都啟動成功,并能夠順利打印日志。

如果您是在本機上啟動的 Docker Compose,可以在瀏覽器中輸入http://localhost:8080,然后就能看到登陸界面了;如果您是在其他機器上啟動的 Docker Compose,您需要在瀏覽器中輸入http://<your_ip>:8080來看到登陸界面,<your_ip>是其他機器的 IP 地址(請保證 8080 端口在該機器已對外開放)。

初始登陸用戶名密碼是 admin/admin,您可以使用這個用戶名密碼來登陸。如果您的環(huán)境變量CRAWLAB_API_ADDRESS設置得不正確,您可能會看到點擊登陸后登陸按鈕會一直轉(zhuǎn)圈而沒有任何提示。這時請重新在docker-compose.yml中設置正確的CRAWLAB_API_ADDRESS(將localhost替換為<your_ip>),重新啟動docker-compose up。然后在瀏覽器中輸入http://<your_ip>:8080。

登陸之后您將看到 Crawlab 的主頁。

如何將 Scrapy 等爬蟲集成到 Crawlab

眾所周知,Scrapy 是非常受歡迎的爬蟲框架,其靈活的框架設計、高并發(fā)、易用性以及可擴展性讓很多開發(fā)者和企業(yè)大量采用。市面上的爬蟲管理平臺幾乎都支持 Scrapy 爬蟲,Crawlab 也不例外,但 Crawlab 可以運行 puppeteer、selenium 等其他爬蟲。下面將介紹一下在 Crawlab 中如何運行 scrapy 爬蟲。

Crawlab 是執(zhí)行爬蟲基本原理

Crawlab 執(zhí)行爬蟲的原理很簡單,其實就是一個 shell 命令。用戶在爬蟲中輸入執(zhí)行爬蟲的 shell 命令,例如scrapy crawl some_spider,Crawlab 執(zhí)行器會讀取這個命令,并在 shell 中直接執(zhí)行。因此,每一次運行爬蟲任務,就是執(zhí)行了一次 shell 命令(當然,實際情況要比這個復雜很多,感興趣的可以去參考官方文檔)。Crawlab 是支持展示和導出爬蟲結(jié)果的,不過這需要稍微多做一些工作。

編寫 Pipeline

要集成 scrapy 爬蟲,無非就是將爬蟲抓取的數(shù)據(jù)存到 Crawlab 的數(shù)據(jù)庫里,然后用任務 ID 關聯(lián)起來。每次執(zhí)行爬蟲任務,任務 ID 會通過環(huán)境變量傳到爬蟲程序中,因此我們需要做的就是將任務 ID 加上結(jié)果存到數(shù)據(jù)庫里(Crawlab 現(xiàn)在只支持 MongoDB,后期會開發(fā) MySQL、SQL Server、Postgres 等關系型數(shù)據(jù)庫,有需求的用戶可以關注一下)。

在 Scrapy 中,我們需要編寫儲存邏輯。示意代碼如下:

# 引入相關的庫,pymongo 是標準連接 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 連接實例
    db = mongo[MONGO_DB]  # 數(shù)據(jù)庫實例
    col_name = os.environ.get('CRAWLAB_COLLECTION')  # 集合名稱,通過環(huán)境變量 CRAWLAB_COLLECTION 傳過來

 # 如果 CRAWLAB_COLLECTION 不存在,則默認集合名稱為 test
    if not col_name:
        col_name = 'test'
 
    col = db[col_name]  # 集合實例

 # 每一個傳入 item 會調(diào)用的函數(shù),參數(shù)分別為 item 和 spider
    def process_item(self, item, spider):
        item['task_id'] = os.environ.get('CRAWLAB_TASK_ID')  # 將 task_id 設置為環(huán)境變量傳過來的任務 ID
        self.col.save(item)  # 保存 item 在數(shù)據(jù)庫中
        return item

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

上傳并配置爬蟲

在運行爬蟲之前,您需要上傳爬蟲文件到主節(jié)點。步驟如下:

1.將爬蟲文件打包成 zip(注意,要保證在根目錄下直接打包);

2.在側(cè)邊欄點擊“爬蟲”導航至爬蟲列表,點擊“添加爬蟲”按鈕,選擇“自定義爬蟲”;

3.點擊“上傳”按鈕,選擇剛剛打包好的 zip 文件

4.上傳成功后,爬蟲列表中會出現(xiàn)新添加的自定義爬蟲,這樣就算上傳成功了。

可以在爬蟲詳情中點擊“文件”標簽,選擇一個文件,可以在文件中編輯代碼。

接下來,您需要在“概覽”標簽中的“執(zhí)行命令”一欄輸入爬蟲的 shell 執(zhí)行命令。Crawlab 的 Docker 鏡像里是內(nèi)置了 scrapy 的,因此可以直接運行 scrapy 爬蟲。命令就是scrapy crawl <some_spider>。點擊“保存”按鈕保存爬蟲配置。

運行爬蟲任務

然后就是運行爬蟲任務了。其實很簡單,在“概覽”標簽中點擊“運行”按鈕,爬蟲任務就開始運行了。如果日志提示找不到 scrapy 命令,可以將scrapy改為絕對路徑/usr/local/bin/scrapy,這樣就會運行成功。

任務運行情況會在“任務”頁面或者爬蟲“概覽”里展現(xiàn),會每 5 秒鐘更新一次,大家可以在這上面查看。而且在爬蟲“結(jié)果”標簽里,可以預覽結(jié)果的詳情,還可以導出數(shù)據(jù)成 CSV 文件。

構建持續(xù)集成(CI)工作流

對于企業(yè)來說,軟件開發(fā)一般是一個自動化過程。它會經(jīng)歷需求、開發(fā)、部署、測試、上線這幾個步驟。而這個流程一般是不斷迭代(Iterative)的,需要不斷更新和發(fā)布。

以爬蟲為例,您上線了一個爬蟲,這個爬蟲會定期抓取網(wǎng)站數(shù)據(jù)。但突然有一天您發(fā)現(xiàn)數(shù)據(jù)抓不到了,您快速定位原因,發(fā)現(xiàn)原來是網(wǎng)站改版了,您需要更改爬蟲抓取規(guī)則來應對網(wǎng)站的改版??傊?,您需要發(fā)布一個代碼更新。最快的做法是直接在線上更改代碼。但這樣做非常危險:第一,您無法測試您更新后的代碼,只能通過不斷調(diào)整線上代碼來測試是否抓取成功;第二,您無法記錄這次更改,后期如果出了問題您很可能會忽略掉這次更改,從而導致 bug。您需要做的,無非是將您的爬蟲代碼用版本管理工具管理起來。我們有很多版本管理工具,最常用的就是        git、subversion,版本管理平臺包括 Gitlab、Bitbucket、自搭 Git 倉庫等。

當我們更新了代碼,我們需要將更新后的代碼發(fā)布到線上服務器。這時您需要用自己寫部署腳本,或者更方便的,用 Jenkins 作為持續(xù)集成(Continuous Integration)管理平臺。Jenkins 是一個持續(xù)集成平臺,可以通過獲取版本庫來更新部署代碼,是非常實用的工具,在很多企業(yè)中都有用到。下圖是如何將 Crawlab 爬蟲應用到持續(xù)集成工作流程中的例子。

要在 Crawlab 中創(chuàng)建或更新爬蟲有兩種方式:

1.上傳打包成后的 zip 文件;

2.通過更改主節(jié)點中目錄CRAWLAB_SPIDER_PATH中的爬蟲文件。

我們做持續(xù)集成,就是針對第二種方式。步驟如下:

1.用 Gitlab 或其他平臺搭建好代碼倉庫;

2.在 Jenkins 中創(chuàng)建一個項目,在項目中將代碼源指向之前創(chuàng)建的倉庫;

3.在 Jenkins 項目中編寫工作流,將發(fā)布地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,如果是 Docker 注意將該地址掛載到宿主機文件系統(tǒng);

4.Jenkins 項目的工作可以直接編寫,也可以用 Jenkinsfile,具體可以查相關資料;

5.這樣,每一次代碼更新提交到代碼倉庫后,Jenkins 就會將更新后的代碼發(fā)布到 Crawlab 里,Crawlab 主節(jié)點會將爬蟲代碼同步到工作節(jié)點,以待抓取。

以上就是“如何快速搭建python爬蟲管理平臺”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI