Crawlab 是一款受人歡迎的分佈式通用爬蟲管理平臺,由 Crawlab 開發組 開發和維護。自去年 3 月份上線以來,Crawlab 由於極其強大的靈活性、簡單精美的操做界面以及健壯而穩定穩定的功能表現,不斷受到爬蟲工程師和開發者的喜好和好評,現在已經有了近 4k Github 標星和超過 8k Docker 下載。在最近的一次調研中,超過三分之一的參與調查者都表示已經將 Crawlab 應用於了生產環境。前端
對 Crawlab 還不瞭解的同窗,能夠參考如下相關文章或文檔:node
通過 8 個月的迭代和優化,Crawlab 已經變得更加穩定和易用,不過隨之而來的也是用戶的建議和反饋,其中一個比較大的痛點是爬蟲的依賴安裝。簡單來講,因爲 Crawlab 主要是由 Docker 來安裝,基礎鏡像只有 Python 的一些與爬蟲和 Crawlab 相關的庫,若是須要安裝一些爬蟲必要的依賴,例如數據庫操做庫 pymysql
等等,就必須作一些 hack,例如上傳一個安裝依賴的特殊爬蟲,或者以 Crawlab 鏡像爲基礎,構建出包含須要的依賴的鏡像。這兩種方式,既不安全,也不方便和直觀。mysql
所以,在最新的版本 v0.4.3 中,咱們發佈了更方便的在界面上安裝依賴的功能。下面咱們介紹一下這個功能。git
依賴安裝是常用 Crawlab 常常須要的需求,目前的臨時解決方案都是經過 hacking 的方式。而如今,咱們的最新版本已經有比較成熟的解決方案,也就是在界面上操做安裝依賴。在進入細節以前,咱們先了解下通常爬蟲工程師的主選編程語言。github
在開發依賴安裝功能之前,咱們首先須要肯定哪(幾)種語言是爬蟲界中比較受歡迎的。咱們猜想 Python 是主要的爬蟲工程師用的語言,這是由於大紅大紫的成熟的 Scrapy 爬蟲框架以及 Python 的簡單語法和豐富的生態。因而,咱們作了一個小小的調查,調查問題爲「您主要用什麼語言編寫爬蟲?(多選)」。如下是調查結果。redis
語言 | 佔比 |
---|---|
Python | 55.8% |
Golang | 12.9% |
Node.js | 11.7% |
Java | 11.0% |
PHP | 3.1% |
C/C++ | 1.8% |
C# | 1.2% |
Shell | 1.2% |
其餘 | 1.2% |
能夠看到,Python 是爬蟲界的絕對霸主,超過一半的人選擇用 Python 做爲主要的爬蟲編程語言。動態語言 Node.js 和靜態語言 Golang、Java 各自勢均力敵。這讓我有些詫異,由於 Node.js 有爬蟲神器 Puppeteer 來抓取動態內容,並且也編寫也比靜態語言 Golang 和 Java 更方便。這樣的結果多是由於,爬蟲工程師有很多由後端工程師兼職,所以採用了比較熟悉的後端靜態語言。sql
所以,Python 是咱們此次更新絕對會支持的語言(這裏的「支持」不表明其餘語言不能運行,只是須要另外安裝依賴)。其次,咱們選擇了 Node.js 做爲第二個支持安裝依賴的語言,由於它的靈活性一樣很高。對其餘語言例如 Golang 和 Java 這樣的靜態語言的依賴安裝支持,咱們將放到後面的版本再開發。docker
下面咱們將介紹如何在 Crawlab 界面上使用依賴安裝。數據庫
首先咱們須要導航到節點列表頁,點擊一個節點的藍色查看按鈕(以下圖),進入節點詳情頁。npm
進入節點詳情頁以後,點擊「安裝」標籤,進入依賴安裝頁面。若是在搜索欄中搜索相關的依賴庫,將獲得相近的依賴列表。例如,Python 中能夠獲得 pip 的相關依賴。點擊「安裝」開始 pip install <package_name>
,並稍等片刻,就會收到安裝成功(或失敗)的提示信息;若是該依賴已經在該節點上存在,則會顯示「卸載」按鈕,點擊則能夠開始卸載該依賴,至關於 pip uninstall <package_name>
。固然,其餘語言對應其所對應的包管理操做,例如 Node.js 對應 npm。
點擊「查看已安裝」,能夠看到該節點上已安裝的依賴以及其對應的版本,以下圖。一樣,點擊「卸載」能夠卸載該依賴。
因爲 Python 是 Docker 鏡像上預裝的(待會兒會介紹如何在 Docker 上預裝 Node.js)。點擊 「Node.js」 標籤,會看到提示說「Node.js 尚未安裝,您是否打算安裝它?」。點擊「安裝」按鈕,後臺會開始安裝 nvm 和 Node.js 8.12 版本。而後就會看到跟 Python 同樣的界面了。
爲了方便爬蟲開發者在 Docker 中的 Node.js 爬蟲應用,咱們開發了在 Docker 中配置預裝 Node.js 的功能。只須要在啓動的時候設置環境變量 CRAWLAB_SERVER_LANG_NODE
爲 Y
,而後啓動鏡像就能夠了。例如以下 docker-compose.yml
。
version: '3.3' services: master: image: tikazyq/crawlab:latest container_name: master environment: CRAWLAB_API_ADDRESS: "http://localhost:8000" # backend API address 後端 API 地址,設置爲 http://<宿主機IP>:<端口>,端口爲映射出來的端口 CRAWLAB_SERVER_MASTER: "Y" # whether to be master node 是否爲主節點,主節點爲 Y,工做節點爲 N CRAWLAB_MONGO_HOST: "mongo" # MongoDB host address MongoDB 的地址,在 docker compose 網絡中,直接引用服務名稱 CRAWLAB_REDIS_ADDRESS: "redis" # Redis host address Redis 的地址,在 docker compose 網絡中,直接引用服務名稱 CRAWLAB_SERVER_LANG_NODE: "Y" # 預安裝 Node.js 語言環境 ports: - "8080:8080" # frontend port mapping 前端端口映射 - "8000:8000" # backend port mapping 後端端口映射 depends_on: - mongo - redis worker: image: tikazyq/crawlab:latest container_name: worker environment: CRAWLAB_SERVER_MASTER: "N" CRAWLAB_MONGO_HOST: "mongo" CRAWLAB_REDIS_ADDRESS: "redis" CRAWLAB_SERVER_LANG_NODE: "Y" # 預安裝 Node.js 語言環境 depends_on: - mongo - redis mongo: image: mongo:latest restart: always # volumes: # - "/opt/crawlab/mongo/data/db:/data/db" # make data persistent 持久化 # ports: # - "27017:27017" # expose port to host machine 暴露接口到宿主機 redis: image: redis:latest restart: always # volumes: # - "/opt/crawlab/redis/data:/data" # make data persistent 持久化 # ports: # - "6379:6379" # expose port to host machine 暴露接口到宿主機
我知道開發者們會吐槽:爲什麼不作上傳 requirements.txt
或 package.json
批量安裝的功能啊;爲什麼不支持環境持久化,每次都要從新安裝啊;爲什麼不支持 Java 啊... 我知道這些都是很實用的功能,但 Crawlab 的開發向來都是聽從敏捷開發和精益打磨的原則,不會過分開發一個功能,優先保證可行性、可用性、健壯性和穩定性。所以,在驗證了你們的使用狀況後,咱們會逐步完善這個功能,讓其變得更加實用。
如下是本次版本 v0.4.3 的更新詳情。
CRAWLAB_SERVER_LANG_NODE
爲 Y
來預裝 Node.js
環境.CHANGELOG
.Crawlab 能發展到如今,離不開合理的產品規劃。所以,在收集用戶反饋的同時,咱們也整理了比較重要的(至少咱們認爲比較重要的)功能,將它們安排在各個發版上。具體發版日期咱們沒法肯定,但能夠確定的是,Crawlab 開發組 會逐步迭代產品,將產品打造得更加實用和便捷。
若是您以爲 Crawlab 對您的平常開發或公司有幫助,請加做者微信 tikazyq1 並註明 "Crawlab",做者會將你拉入羣。歡迎在 Github 上進行 star,以及,若是遇到任何問題,請隨時在 Github 上提 issue。另外,歡迎您對 Crawlab 作開發貢獻。