跟繁瑣的命令行說拜拜!Gerapy分散式爬蟲管理框架來襲!
背景
用 Python 做過爬蟲的小夥伴可能接觸過 Scrapy,GitHub:https://github.com/scrapy/scrapy。Scrapy 的確是一個非常強大的爬蟲框架,爬取效率高,擴展性好,基本上是使用 Python 開發爬蟲的必備利器。如果使用 Scrapy 做爬蟲,那麼在爬取時,我們當然完全可以使用自己的主機來完成爬取,但當爬取量非常大的時候,我們肯定不能在自己的機器上來運行爬蟲了,一個好的方法就是將 Scrapy 部署到遠程伺服器上來執行。
所以,這時候就出現了另一個庫 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 項目的運行了,命令如下:
curl http://88.88.88.88:6800/schedule.json -d project=myproject -d spider=somespider
這樣就相當於啟動了 myproject 項目的 somespider 爬蟲,而不用我們再用命令行方式去啟動爬蟲,同時 Scrapyd 還提供了查看爬蟲狀態、取消爬蟲任務、添加爬蟲版本、刪除爬蟲版本等等的一系列 API,所以說,有了 Scrapyd,我們可以通過 API 來控制爬蟲的運行,擺脫了命令行的依賴。
另外爬虫部署還是個麻煩事,因為我們需要將爬蟲代碼上傳到遠程伺服器上,這個過程涉及到打包和上傳兩個過程,在 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 ScrapydAPI
scrapyd = ScrapydAPI(http://88.888.88.88:6800)scrapyd.list_jobs(project_name)
這樣它的返回結果就是各個 Scrapy 項目的運行情況。
例如:
{
pending: [ ], running: [ { id: u14a65...b27ce,spider: uspider_name,
start_time: u2018-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、Jinjia2、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!非常感謝!
課程推薦:自己動手,豐衣足食!Python3網路爬蟲實戰案例
講師:崔慶才 ,靜覓博客博主,Python技術控,爬蟲博文訪問量已過百萬。喜歡鑽研,熱愛生活,樂於分享。
- 萌新小白:我連爬蟲也不知道是什麼
- 入門菜鳥:我對一些爬蟲的用法還不是很熟練
- 老司機:我想學習更高級的框架及分散式
從環境基礎到進階分散式,由淺入深,逐篇遞進。
課程特色:
- 循序漸進。環境篇、基礎篇、進階篇、框架篇、分散式篇,由淺入深,娓娓道來,進階無憂;
- 案例為王。貓眼電影、今日頭條街拍、淘寶商品美食、微信文章、知乎用戶信息等案例,結合反爬策略,例例實戰,夠生活、有質量、有趣味,寓課於樂;
- 詮釋全面。理論介紹之上的代碼級剖析,學員與講師之間、學員之間,高效高頻答疑與溝通,亦師亦友,互動共進;
- 思路制勝。通過課程,培養爬蟲開發過程中洞察問題、分析問題,提出解決方案能力,一課所獲,長久收益;
作者:崔慶才 Python愛好者社區專欄作者,請勿轉載,謝謝。
博客專欄:崔慶才配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享 公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。
推薦閱讀:
※156個Python網路爬蟲資源,媽媽再也不用擔心你找不到資源!
※Python3爬蟲(3)單網頁簡單爬取文字信息
※福布斯系列之數據採集 | Python數據分析項目實戰