跟繁瑣的命令行說拜拜!Gerapy分佈式爬蟲管理框架來襲!

背景

用 Python 作過爬蟲的小夥伴可能接觸過 Scrapy,GitHub:https://github.com/scrapy/scrapy。Scrapy 的確是一個很是強大的爬蟲框架,爬取效率高,擴展性好,基本上是使用 Python 開發爬蟲的必備利器。若是使用 Scrapy 作爬蟲,那麼在爬取時,咱們固然徹底可使用本身的主機來完成爬取,但當爬取量很是大的時候,咱們確定不能在本身的機器上來運行爬蟲了,一個好的方法就是將 Scrapy 部署到遠程服務器上來執行。html

因此,這時候就出現了另外一個庫 Scrapyd,GitHub:https://github.com/scrapy/scrapyd,有了它咱們只須要在遠程服務器上安裝一個 Scrapyd,啓動這個服務,就能夠將咱們寫的 Scrapy 項目部署到遠程主機上了,Scrapyd 還提供了各類操做 API,能夠自由地控制 Scrapy 項目的運行,API 文檔:http://scrapyd.readthedocs.io/en/stable/api.html,例如咱們將 Scrapyd 安裝在 IP 爲 88.88.88.88 的服務器上,而後將 Scrapy 項目部署上去,這時候咱們經過請求 API 就能夠來控制 Scrapy 項目的運行了,命令以下:python

curl http://88.88.88.88:6800/schedule.json -d project=myproject -d spider=somespidergit

這樣就至關於啓動了 myproject 項目的 somespider 爬蟲,而不用咱們再用命令行方式去啓動爬蟲,同時 Scrapyd 還提供了查看爬蟲狀態、取消爬蟲任務、添加爬蟲版本、刪除爬蟲版本等等的一系列 API,因此說,有了 Scrapyd,咱們能夠經過 API 來控制爬蟲的運行,擺脫了命令行的依賴。github

另外爬蟲部署仍是個麻煩事,由於咱們須要將爬蟲代碼上傳到遠程服務器上,這個過程涉及到打包和上傳兩個過程,在 Scrapyd 中其實提供了這個部署的 API,叫作 addversion,可是它接受的內容是 egg 包文件,因此說要用這個接口,咱們必需要把咱們的 Scrapy 項目打包成 egg 文件,而後再利用文件上傳的方式請求這個 addversion 接口才能夠完成上傳,這個過程又比較繁瑣了,因此又出現了一個工具叫作 Scrapyd-Client,GitHub:https://github.com/scrapy/scrapyd-client,利用它的 scrapyd-deploy 命令咱們即可以完成打包和上傳的兩個功能,可謂是又方便了一步。正則表達式

這樣咱們就已經解決了部署的問題,回過頭來,若是咱們要想實時查看服務器上 Scrapy 的運行狀態,那該怎麼辦呢?像剛纔說的,固然是請求 Scrapyd 的 API 了,若是咱們想用 Python 程序來控制一下呢?咱們還要用 requests 庫一次次地請求這些 API ?這就太麻煩了吧,因此爲了解決這個需求,Scrapyd-API 又出現了,GitHub:https://github.com/djm/python-scrapyd-api,有了它咱們能夠只用簡單的 Python 代碼就能夠實現 Scrapy 項目的監控和運行:數據庫

from scrapyd_api import ScrapydAPIjson

scrapyd = ScrapydAPI('http://88.888.88.88:6800')api

scrapyd.list_jobs('project_name')瀏覽器

這樣它的返回結果就是各個 Scrapy 項目的運行狀況。服務器

例如:

{

    'pending': [

    ],

    'running': [

        {

            'id': u'14a65...b27ce',

            'spider': u'spider_name',

            'start_time': u'2018-01-17 22:45:31.975358'

        },

    ],

    'finished': [

        {

            'id': '34c23...b21ba',

            'spider': 'spider_name',

            'start_time': '2018-01-11 22:45:31.975358',

            'end_time': '2018-01-17 14:01:18.209680'

        }

    ]

}

這樣咱們就能夠看到 Scrapy 爬蟲的運行狀態了。

因此,有了它們,咱們能夠完成的是:

  • 經過 Scrapyd 完成 Scrapy 項目的部署

  • 經過 Scrapyd 提供的 API 來控制 Scrapy 項目的啓動及狀態監控

  • 經過 Scrapyd-Client 來簡化 Scrapy 項目的部署

  • 經過 Scrapyd-API 來經過 Python 控制 Scrapy 項目

是否是方便多了?

但是?真的達到最方便了嗎?確定沒有!若是這一切的一切,從 Scrapy 的部署、啓動到監控、日誌查看,咱們只須要鼠標鍵盤點幾下就能夠完成,那豈不是美滋滋?更或者說,連 Scrapy 代碼均可以幫你自動生成,那豈不是爽爆了?

有需求就有動力,沒錯,Gerapy 就是爲此而生的,GitHub:https://github.com/Gerapy/Gerapy。

本節咱們就來簡單瞭解一下 Gerapy 分佈式爬蟲管理框架的使用方法。

安裝

Gerapy 是一款分佈式爬蟲管理框架,支持 Python 3,基於 Scrapy、Scrapyd、Scrapyd-Client、Scrapy-Redis、Scrapyd-API、Scrapy-Splash、Jinjia二、Django、Vue.js 開發,Gerapy 能夠幫助咱們:

  • 更方便地控制爬蟲運行

  • 更直觀地查看爬蟲狀態

  • 更實時地查看爬取結果

  • 更簡單地實現項目部署

  • 更統一地實現主機管理

  • 更輕鬆地編寫爬蟲代碼

安裝很是簡單,只須要運行 pip3 命令便可:

pip3 install gerapy

安裝完成以後咱們就可使用 gerapy 命令了,輸入 gerapy 即可以獲取它的基本使用方法:

gerapy

Usage:

  gerapy init [--folder=<folder>]

  gerapy migrate

  gerapy createsuperuser

  gerapy runserver [<host:port>]

  gerapy makemigrations

若是出現上述結果,就證實 Gerapy 安裝成功了。

初始化

接下來咱們來開始使用 Gerapy,首先利用以下命令進行一下初始化,在任意路徑下都可執行以下命令:

gerapy init

執行完畢以後,本地便會生成一個名字爲 gerapy 的文件夾,接着進入該文件夾,能夠看到有一個 projects 文件夾,咱們後面會用到。

緊接着執行數據庫初始化命令:

cd gerapy

gerapy migrate

這樣它就會在 gerapy 目錄下生成一個 SQLite 數據庫,同時創建數據庫表。

接着咱們只須要再運行命令啓動服務就行了:

gerapy runserver

這樣咱們就能夠看到 Gerapy 已經在 8000 端口上運行了。

所有的操做流程截圖以下:

接下來咱們在瀏覽器中打開 http://localhost:8000/,就能夠看到 Gerapy 的主界面了:

這裏顯示了主機、項目的狀態,固然因爲咱們沒有添加主機,因此全部的數目都是 0。

若是咱們能夠正常訪問這個頁面,那就證實 Gerapy 初始化都成功了。

主機管理

接下來咱們能夠點擊左側 Clients 選項卡,即主機管理頁面,添加咱們的 Scrapyd 遠程服務,點擊右上角的建立按鈕便可添加咱們須要管理的 Scrapyd 服務:

須要添加 IP、端口,以及名稱,點擊建立便可完成添加,點擊返回便可看到當前添加的 Scrapyd 服務列表,樣例以下所示:

這樣咱們能夠在狀態一欄看到各個 Scrapyd 服務是否可用,同時能夠一目瞭然當前全部 Scrapyd 服務列表,另外咱們還能夠自由地進行編輯和刪除。

項目管理

Gerapy 的核心功能固然是項目管理,在這裏咱們能夠自由地配置、編輯、部署咱們的 Scrapy 項目,點擊左側的 Projects ,即項目管理選項,咱們能夠看到以下空白的頁面:

圖片

假設如今咱們有一個 Scrapy 項目,若是咱們想要進行管理和部署,還記得初始化過程當中提到的 projects 文件夾嗎?這時咱們只須要將項目拖動到剛纔 gerapy 運行目錄的 projects 文件夾下,例如我這裏寫好了一個 Scrapy 項目,名字叫作 zhihusite,這時把它拖動到 projects 文件夾下:

圖片

這時刷新頁面,咱們即可以看到 Gerapy 檢測到了這個項目,同時它是不可配置、沒有打包的:

圖片

這時咱們能夠點擊部署按鈕進行打包和部署,在右下角咱們能夠輸入打包時的描述信息,相似於 Git 的 commit 信息,而後點擊打包按鈕,便可發現 Gerapy 會提示打包成功,同時在左側顯示打包的結果和打包名稱:

圖片

打包成功以後,咱們即可以進行部署了,咱們能夠選擇須要部署的主機,點擊後方的部署按鈕進行部署,同時也能夠批量選擇主機進行部署,示例以下:

圖片

能夠發現此方法相比 Scrapyd-Client 的命令行式部署,簡直不能方便更多。

監控任務

部署完畢以後就能夠回到主機管理頁面進行任務調度了,任選一臺主機,點擊調度按鈕便可進入任務管理頁面,此頁面能夠查看當前 Scrapyd 服務的全部項目、全部爬蟲及運行狀態:

圖片

咱們能夠經過點擊新任務、中止等按鈕來實現任務的啓動和中止等操做,同時也能夠經過展開任務條目查看日誌詳情:

圖片

另外咱們還能夠隨時點擊中止按鈕來取消 Scrapy 任務的運行。

這樣咱們就能夠在此頁面方便地管理每一個 Scrapyd 服務上的 每一個 Scrapy 項目的運行了。

項目編輯

同時 Gerapy 還支持項目編輯功能,有了它咱們再也不須要 IDE 便可完成項目的編寫,咱們點擊項目的編輯按鈕便可進入到編輯頁面,如圖所示:

這樣即便 Gerapy 部署在遠程的服務器上,咱們不方便用 IDE 打開,也不喜歡用 Vim 等編輯軟件,咱們能夠藉助於本功能方便地完成代碼的編寫。

代碼生成

上述的項目主要針對的是咱們已經寫好的 Scrapy 項目,咱們能夠藉助於 Gerapy 方便地完成編輯、部署、控制、監測等功能,並且這些項目的一些邏輯、配置都是已經寫死在代碼裏面的,若是要修改的話,須要直接修改代碼,即這些項目都是不可配置的。

在 Scrapy 中,其實提供了一個可配置化的爬蟲 CrawlSpider,它能夠利用一些規則來完成爬取規則和解析規則的配置,這樣可配置化程度就很是高,這樣咱們只須要維護爬取規則、提取邏輯就能夠了。若是要新增一個爬蟲,咱們只須要寫好對應的規則便可,這類爬蟲就叫作可配置化爬蟲。

Gerapy 能夠作到:咱們寫好爬蟲規則,它幫咱們自動生成 Scrapy 項目代碼。

咱們能夠點擊項目頁面的右上角的建立按鈕,增長一個可配置化爬蟲,接着咱們即可以在此處添加提取實體、爬取規則、抽取規則了,例如這裏的解析器,咱們能夠配置解析成爲哪一個實體,每一個字段使用怎樣的解析方式,如 XPath 或 CSS 解析器、直接獲取屬性、直接添加值等多重方式,另外還能夠指定處理器進行數據清洗,或直接指定正則表達式進行解析等等,經過這些流程咱們能夠作到任何字段的解析。

再好比爬取規則,咱們能夠指定從哪一個連接開始爬取,容許爬取的域名是什麼,該連接提取哪些跟進的連接,用什麼解析方法來處理等等配置。經過這些配置,咱們能夠完成爬取規則的設置。

圖片

最後點擊生成按鈕便可完成代碼的生成。

圖片

生成的代碼示例結果如圖所示,可見其結構和 Scrapy 代碼是徹底一致的。

圖片

生成代碼以後,咱們只須要像上述流程同樣,把項目進行部署、啓動就行了,不須要咱們寫任何一行代碼,便可完成爬蟲的編寫、部署、控制、監測。

結語

以上即是 Gerapy 分佈式爬蟲管理框架的基本用法,如需瞭解更多,能夠訪問其 GitHub:https://github.com/Gerapy/Gerapy。

若是以爲此框架有不足的地方,歡迎提 Issue,也歡迎發 Pull Request 來貢獻代碼,若是以爲 Gerapy 有所幫助,還望賜予一個 Star!很是感謝!

如想了解更多爬蟲資訊,歡迎閱讀原文訪問靜覓博客。

相關文章
相關標籤/搜索