Crawlab 是一款受人欢迎的分布式通用爬虫管理平台,由 Crawlab 开发组 开发和维护。自去年 3 月份上线以来,Crawlab 因为极其强大的灵活性、简单精美的操作界面以及健壮而稳定稳定的功能表现,不断受到爬虫工程师和开发者的喜爱和好评,如今已经有了近 4k Github 标星和超过 8k Docker 下载。在最近的一次调研中,超过三分之一的参与调查者都表示已经将 Crawlab 应用于了生产环境。
对 Crawlab 还不了解的同学,可以参考以下相关文章或文档:
经过 8 个月的迭代和优化,Crawlab 已经变得更加稳定和易用,不过随之而来的也是用户的建议和反馈,其中一个比较大的痛点是爬虫的依赖安装。简单来说,由于 Crawlab 主要是由 Docker 来安装,基础镜像只有 Python 的一些与爬虫和 Crawlab 相关的库,如果需要安装一些爬虫必要的依赖,例如数据库操作库 pymysql
等等,就必须做一些 hack,例如上传一个安装依赖的特殊爬虫,或者以 Crawlab 镜像为基础,构建出包含需要的依赖的镜像。这两种方式,既不安全,也不方便和直观。
因此,在最新的版本 v0.4.3 中,我们发布了更方便的在界面上安装依赖的功能。下面我们介绍一下这个功能。
依赖安装是经常使用 Crawlab 经常需要的需求,目前的临时解决方案都是通过 hacking 的方式。而现在,我们的最新版本已经有比较成熟的解决方案,也就是在界面上操作安装依赖。在进入细节之前,我们先了解下一般爬虫工程师的主选编程语言。
在开发依赖安装功能以前,我们首先需要确定哪(几)种语言是爬虫界中比较受欢迎的。我们猜测 Python 是主要的爬虫工程师用的语言,这是因为大红大紫的成熟的 Scrapy 爬虫框架以及 Python 的简单语法和丰富的生态。于是,我们做了一个小小的调查,调查问题为“您主要用什么语言编写爬虫?(多选)”。以下是调查结果。
语言 | 占比 --- | --- 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 更方便。这样的结果可能是因为,爬虫工程师有不少由后端工程师兼职,因此采用了比较熟悉的后端静态语言。
因此,Python 是我们这次更新绝对会支持的语言(这里的“支持”不代表其他语言不能运行,只是需要另外安装依赖)。其次,我们选择了 Node.js 作为第二个支持安装依赖的语言,因为它的灵活性同样很高。对其他语言例如 Golang 和 Java 这样的静态语言的依赖安装支持,我们将放到后面的版本再开发。
下面我们将介绍如何在 Crawlab 界面上使用依赖安装。
首先我们需要导航到节点列表页,点击一个节点的蓝色查看按钮(如下图),进入节点详情页。
进入节点详情页之后,点击“安装”标签,进入依赖安装页面。如果在搜索栏中搜索相关的依赖库,将得到相近的依赖列表。例如,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 做开发贡献。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.