本次篇文章内容较多,涉及知识较广,读完须要大约 20 分钟,请读者耐心阅读。html
大多数企业都离不开爬虫,爬虫是获取数据的一种有效方式。对搜索引擎来讲,爬虫不可或缺;对舆情公司来讲,爬虫是基础;对 NLP来讲,爬虫能够获取语料;对初创公司来讲,爬虫能够获取初始内容。可是爬虫技术纷繁复杂,不一样类型的抓取场景会运用到不一样的技术。例如,简单的静态页面能够用 HTTP 请求+HTML 解析器直接搞定;一个动态页面须要用 Puppeteer 或 Selenium等自动化测试工具;有反爬的网站须要用到代理、打码等技术;等等。所以,对爬虫有规模量级要求的企业或我的须要同时处理不一样类别的爬虫,这会凭空增添不少附加的管理成本。同时,爬虫管理者还须要应对网站内容变动、持续增量抓取、任务失败等问题。所以一个成熟的爬虫管理流程应该包含一个管理系统,可以有效处理上述问题。前端
爬虫管理平台是一个一站式管理系统,集爬虫部署、任务调度、任务监控、结果展现等模块于一体,一般配有可视化 UI 界面,能够在 Web 端经过与 UI 界面交互来有效管理爬虫。爬虫管理平台通常来讲是支持分布式的,能够在多台机器上协做运行。
固然,上述这个定义是狭义的,一般针对于技术人员或开发者或技术经理。企业内部通常都会开发本身的内部爬虫管理系统,以应对复杂的爬虫管理需求。这样的系统就是上述定义的狭义的爬虫管理平台。python
而什么是广义的爬虫管理平台呢?您可能据说过神箭手(后转型为后羿采集器)和八爪鱼吧。前者是基于云服务的,能够在线上编写、运行和监控爬虫,在广义爬虫平台中最接近狭义定义的爬虫管理平台;后者是一个大众的商业爬虫抓取工具,可让小白用户拖拉拽编写、运行爬虫,导出数据。您也可能见过各类 API 聚合服务商,例如聚合数据,这是一个能够直接调用网站接口获取数据的平台,这其实也算做爬虫平台的一个变种,只是它帮你完成了爬虫编写这一过程。而介于这二者之间的呢,国外有一家叫 Kimonolab 的公司,它开发了一个叫 Kimono 的 Chrome 插件,可让用户在页面上可视化的点击元素并生成抓取规则,并在其网站上生成爬虫程序,用户提交任务,后台就能够自动在网站上抓取数据了。Kimono 是一个伟大的爬虫应用,但惋惜的是,Kimonolab 已经被大数据公司 Plantir 收购,如今也就没法体验了。linux
在本文中,咱们主要关注狭义定义的爬虫管理平台,所以后面所讲到的爬虫管理平台都是指狭义的定义。git
如下是一个典型的爬虫管理平台所涉及的模块。github
典型爬虫管理平台的模块主要包含如下内容:web
固然,有些爬虫管理平台可能还不止这些模块,它可能包括其余比较实用的功能,例如可配置的抓取规则、可视化配置抓取规则、代理池、Cookie 池、异常监控等等。redis
有了爬虫管理平台,开发者特别是爬虫工程师就可以方便的添加爬虫、执行任务、查看结果,而不用在命令行之间来回切换,很是容易出错。一个常见的场景就是爬虫工程师最初技术选型用了 scrapy 和 crontab 来管理爬虫任务,他不得不当心翼翼的选择定时任务的时间区间,以致于不会将服务器 CPU 或内存占满;更棘手的问题是,他还须要将 scrapy 产生的日志存到文件里,一旦爬虫出错了,他不得不用 shell 命令一个一个来查看日志来定位错误缘由,严重时会花上一个成天;还有个严重的问题,爬虫工程师可能发现公司业务量在增长,他须要写上百个爬虫来知足公司的业务需求,而用 scrapy 和 crontab 来管理彻底就是个噩梦。可怜的爬虫工程师其实彻底能够选择一个合适爬虫管理平台来解决他的问题。docker
当您愿意解决前面提到的爬虫工程师遇到的困难问题,而转而想选择一个合适的爬虫管理平台时。shell
您首先应该回答的问题是:咱们是否须要从零开始开发一套系统(Start from scratch)?要回答这个问题,您应该先回答下面几个问题:
若是上述三个问题的答案任意一个为“否”,您应该好好考虑利用市面上已有的开源爬虫管理平台来知足您的需求。
如下为市面上已有的开源爬虫管理平台:
平台名称 | 技术 | 优势 | 缺点 | |
---|---|---|---|---|
SpiderKeeper | Python Flask | 基于 scrapyd,开源版 Scrapyhub,很是简洁的 UI 界面,支持定时任务 | 可能有些过于简洁了,不支持分页,不支持节点管理,不支持 scrapy 之外的爬虫 | |
Gerapy | Python Django + Vue | Gerapy 是崔庆才大神开发的爬虫管理平台,安装部署很是简单,一样基于 scrapyd,有精美的 UI 界面,支持节点管理、代码编辑、可配置规则等功能 | 一样不支持 scrapy 之外的爬虫,并且据使用者反馈,1.0 版本有不少 bug,期待 2.0 版本会有必定程度的改进 | |
Scrapydweb | Python Flask + Vue | 精美的 UI 界面,内置了 scrapy 日志解析器,有较多任务运行统计图表,支持节点管理、定时任务、邮件提醒、移动界面,算是 scrapy-based 中功能完善的爬虫管理平台 | 一样不支持 scrapy 之外的爬虫,Python Flask 为后端,性能上有必定局限性 | Python Flask + Vue |
Crawlab | Golang + Vue | 不局限于 scrapy,能够运行任何语言和框架的爬虫,精美的 UI 界面,自然支持分布式爬虫,支持节点管理、爬虫管理、任务管理、定时任务、结果导出、数据统计等功能 | 部署稍微有一些麻烦(不过利用 Docker 能够一键部署),最新版本暂时不支持可配置爬虫 |
总的来讲,SpiderKeeper 多是最先的爬虫管理平台,但功能相对来讲比较局限;Gerapy 虽然功能齐全,界面精美,但有很多 bug 须要处理,建议有需求的用户等待 2.0 版本;Scrapydweb是一个比较完善的爬虫管理平台,不过和前二者同样,都是基于 scrapyd 的,所以只能运行 scrapy 爬虫;而Crawlab是一个很是灵活的爬虫管理平台,能够运行 Python、Nodejs、Java、PHP、Go 写的爬虫,并且功能比较齐全,只是部署起来相对于前三者来讲要麻烦一些,不过对于 Docker 使用者来讲能够作到一件部署(后面咱们会讲)。
所以,对于重度 scrapy 爬虫依赖的、又不想折腾的开发者,能够考虑 Scrapydweb;而对于有各类类型的、复杂技术结构的爬虫开发者来讲,应该优先考虑更灵活的 Crawlab。固然,不是说 Crawlab 对 scrapy 支持不友好,Crawlab 一样能够很好的集成 scrapy,后面会介绍。
做为 Crawlab 的做者,不想王婆卖瓜,自卖自诩,做者仅仅但愿将最好的技术选型推荐给开发者,让开发者根据自身的需求来决定该使用哪一种爬虫管理平台。
Crawlab 是基于 Golang 的分布式爬虫管理平台,支持 Python、NodeJS、Java、Go、PHP 等多种编程语言以及多种爬虫框架。
Crawlab 自今年三月份上线以来受到爬虫爱好者们和开发者们的好评,很多使用者还表示会用 Crawlab 搭建公司的爬虫平台。通过近数月的迭代,Crawlab 陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将平台变得得更加实用,更加全面,可以真正帮助用户解决爬虫管理困难的问题。现在在 Github 上有近 1k 的 star,相关社区(微信群、微信公众号)也创建起来,四分之一的用户表示已经将 Crawlab 应用于企业爬虫管理。能够看出,Crawlab 是受开发者们关注和喜欢的。
Crawlab 主要解决的是大量爬虫管理困难的问题,例如须要监控上百个网站的参杂 scrapy 和 selenium 的项目不容易作到同时管理,并且命令行管理的成本很是高,还容易出错。Crawlab 支持任何语言和任何框架,配合任务调度、任务监控,很容易作到对成规模的爬虫项目进行有效监控管理。
下面是 Crawlab 爬虫列表页面的截图。
用户只须要将爬虫上传到 Crawlab,配置执行命令,点击“运行”按钮,就能够执行爬虫任务了。爬虫任务能够在任何节点上运行。从上图能够看到,Crawlab 有节点管理、爬虫管理、任务管理、定时任务、用户管理等模块。
如下是 Crawlab 的总体架构图,由五大部分组成:
关于 Crawlab 如何使用和详细原理超出了本篇文章的范围,感兴趣的能够去参考Github 主页或相关文档。
Docker 是部署 Crawlab 最方便和简洁的方式。其余部署方式包括直接部署,不过对于想快速搭建平台的开发者来讲不推荐。Crawlab 已在Dockerhub上注册了相关的镜像,开发者仅须要执行docker pull tikazyq/crawlab
命令就能够将 Crawlab 的镜像下载下来。
读者能够去 Dockerhub 上查看 Crawlab 的镜像,只有仅不到 300Mb。地址:https://hub.docker.com/r/tika...
要使用 Docker 来部署 Crawlab,您首先得保证 Docker 已经安装好。请参考如下文档来安装。
操做系统 | 文档 |
---|---|
Mac | https://docs.docker.com/docke... |
Windows | https://docs.docker.com/docke... |
Ubuntu | https://docs.docker.com/insta... |
Debian | https://docs.docker.com/insta... |
CentOS | https://docs.docker.com/insta... |
Fedora | https://docs.docker.com/insta... |
其余 Linux 发行版 | https://docs.docker.com/insta... |
Docker Compose 是简单的运行 Docker 集群的工具,很是轻量级,咱们将用到 Docker Compose 来一键部署 Crawlab。
Docker 的官方网站已经有如何安装 Docker Compose 的教程,点击连接查看。这里简单介绍一下。
操做系统 | 安装步骤 |
---|---|
Mac | Docker Desktop for Mac 或 Docker Toolbox 自带,不用单独安装 |
Windows | Docker Desktop for Windows 或 Docker Toolbox 自带,不用单独安装 |
Linux | 参考表格下面的命令 |
其余选择 | 经过pip 安装,pip install docker-compose ,若是没有virtualenv ,须要用sudo |
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 变成执行文件 sudo chmod +x /usr/local/bin/docker-compose
在拉取镜像以前,您须要配置一下镜像源。由于在国内,使用原有的镜像源速度不是很快,须要使用 DockerHub 在国内的加速器。请建立/etc/docker/daemon.json
文件,输入以下内容。
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
而后拉取镜像,就会快不少了。固然,您也能够用其余镜像源,能够网上去搜索一下。执行如下命令将 Crawlab 镜像拉取下来。
docker pull tikazyq/crawlab:latest
下图为拉取镜像时的命令行界面。
咱们将用 Docker Compose 启动 Crawlab 以及其依赖的数据库 MongoDB 和 Redis。首先咱们须要修改一下 Docker Compose 的 yaml 配置文件docker-compose.yml
。这个配置文件定义了须要启动的容器服务(Container Services)以及网络配置(Network Configuration)。这里咱们用 Crawlab 自带的docker-compose.yml
。
version: '3.3' # Docker Compose 的版本号(请看后续说明) services: # 服务 master: # 服务名称 image: tikazyq/crawlab:latest # 服务对应的镜像名称 container_name: master # 服务对应的容器名称 environment: # 这里定义传入的环境变量 CRAWLAB_API_ADDRESS: "localhost:8000" # 前端调用的 API 地址,默认为 localhost:8000 CRAWLAB_SERVER_MASTER: "Y" # 是否为主节点,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: # 工做节点,与主节点配置相似,不重复写了 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"
读者能够根据本身的要求来配置docker-compose.yml
。尤为须要注意CRAWLAB_API_ADDRESS
这个环境变量,不少初学使用者都是由于该变量配置不正确而致使没法登录。大多数状况,您不用作任何配置更改。请参考Q&A来处理常见问题,以及详细的环境变量配置文档来帮助根据自身环境配置 Crawlab。
而后,运行下列命令启动 Crawlab。能够加一个-d
参数让 Docker Compose 后台运行。
docker-compose up
运行上述命令后,Docker Compose 会去拉取 MongoDB 和 Redis 的镜像,这可能会花几分钟时间。拉取完毕后,四个服务会依次启动,您将会在命令行中看到以下内容。
正常状况下,您应该能够看到四个服务都启动成功,并可以顺利打印日志。若是启动不成功,请微信联系做者(tikazyq1)或在 Github 上提 Issue。
若是您是在本机上启动的 Docker Compose,能够在浏览器中输入http://localhost:8080
,而后就能看到登录界面了;若是您是在其余机器上启动的 Docker Compose,您须要在浏览器中输入http://<your_ip>:8080
来看到登录界面,<your_ip>
是其余机器的 IP 地址(请保证 8080 端口在该机器已对外开放)。
初始登录用户名密码是 admin/admin,您可使用这个用户名密码来登录。若是您的环境变量CRAWLAB_API_ADDRESS
设置得不正确,您可能会看到点击登录后登录按钮会一直转圈而没有任何提示。这时请从新在docker-compose.yml
中设置正确的CRAWLAB_API_ADDRESS
(将localhost
替换为<your_ip>
),从新启动docker-compose up
。而后在浏览器中输入http://<your_ip>:8080
。
登录以后您将看到 Crawlab 的主页。
本篇文章主要介绍如何搭建爬虫管理平台 Crawlab,所以不会详细介绍如何使用 Crawlab(可能会建立另外一篇文章来详细介绍,有兴趣者能够关注一下)。若是您有困惑,请查看相关文档来了解如何使用。同时,您也能够加做者微信(tikazyq1)并注明 Crawlab,做者将将您拉入讨论群,您能够在那里答疑解惑。
众所周知,Scrapy 是很是受欢迎的爬虫框架,其灵活的框架设计、高并发、易用性以及可扩展性让不少开发者和企业大量采用。市面上的爬虫管理平台几乎都支持 Scrapy 爬虫,Crawlab 也不例外,但 Crawlab 能够运行 puppeteer、selenium 等其余爬虫。下面将介绍一下在 Crawlab 中如何运行 scrapy 爬虫。
Crawlab 执行爬虫的原理很简单,其实就是一个 shell 命令。用户在爬虫中输入执行爬虫的 shell 命令,例如scrapy crawl some_spider
,Crawlab 执行器会读取这个命令,并在 shell 中直接执行。所以,每一次运行爬虫任务,就是执行了一次 shell 命令(固然,实际状况要比这个复杂不少,感兴趣的能够去参考官方文档)。Crawlab 是支持展现和导出爬虫结果的,不过这须要稍微多作一些工做。
要集成 scrapy 爬虫,无非就是将爬虫抓取的数据存到 Crawlab 的数据库里,而后用任务 ID 关联起来。每次执行爬虫任务,任务 ID 会经过环境变量传到爬虫程序中,所以咱们须要作的就是将任务 ID 加上结果存到数据库里(Crawlab 如今只支持 MongoDB,后期会开发 MySQL、SQL Server、Postgres 等关系型数据库,有需求的用户能够关注一下)。
在 Scrapy 中,咱们须要编写储存逻辑。示意代码以下:
# 引入相关的库,pymongo 是标准链接 MongoDB 的库 import os from pymongo import MongoClient # MongoDB 配置参数 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] # 数据库实例 col_name = os.environ.get('CRAWLAB_COLLECTION') # 集合名称,经过环境变量 CRAWLAB_COLLECTION 传过来 # 若是 CRAWLAB_COLLECTION 不存在,则默认集合名称为 test if not col_name: col_name = 'test' col = db[col_name] # 集合实例 # 每个传入 item 会调用的函数,参数分别为 item 和 spider def process_item(self, item, spider): item['task_id'] = os.environ.get('CRAWLAB_TASK_ID') # 将 task_id 设置为环境变量传过来的任务 ID self.col.save(item) # 保存 item 在数据库中 return item
同时,您也须要在items.py
中加入task_id
字段,已保证值可以被赋上(这很重要)。
在运行爬虫以前,您须要上传爬虫文件到主节点。步骤以下:
能够在爬虫详情中点击“文件”标签,选择一个文件,能够在文件中编辑代码。
接下来,您须要在“概览”标签中的“执行命令”一栏输入爬虫的 shell 执行命令。Crawlab 的 Docker 镜像里是内置了 scrapy 的,所以能够直接运行 scrapy 爬虫。命令就是scrapy crawl <some_spider>
。点击“保存”按钮保存爬虫配置。
而后就是运行爬虫任务了。其实很简单,在“概览”标签中点击“运行”按钮,爬虫任务就开始运行了。若是日志提示找不到 scrapy 命令,能够将scrapy
改成绝对路径/usr/local/bin/scrapy
,这样就会运行成功。
任务运行状况会在“任务”页面或者爬虫“概览”里展示,会每 5 秒钟更新一次,你们能够在这上面查看。并且在爬虫“结果”标签里,能够预览结果的详情,还能够导出数据成 CSV 文件。
对于企业来讲,软件开发通常是一个自动化过程。它会经历需求、开发、部署、测试、上线这几个步骤。而这个流程通常是不断迭代(Iterative)的,须要不断更新和发布。
以爬虫为例,您上线了一个爬虫,这个爬虫会按期抓取网站数据。但忽然有一天您发现数据抓不到了,您快速定位缘由,发现原来是网站改版了,您须要更改爬虫抓取规则来应对网站的改版。总之,您须要发布一个代码更新。最快的作法是直接在线上更改代码。但这样作很是危险:第一,您没法测试您更新后的代码,只能经过不断调整线上代码来测试是否抓取成功;第二,您没法记录此次更改,后期若是出了问题您极可能会忽略掉此次更改,从而致使 bug。您须要作的,无非是将您的爬虫代码用版本管理工具管理起来。咱们有不少版本管理工具,最经常使用的就是 git、subversion,版本管理平台包括 Gitlab、Bitbucket、自搭 Git 仓库等。
当咱们更新了代码,咱们须要将更新后的代码发布到线上服务器。这时您须要用本身写部署脚本,或者更方便的,用 Jenkins 做为持续集成(Continuous Integration)管理平台。Jenkins 是一个持续集成平台,能够经过获取版本库来更新部署代码,是很是实用的工具,在不少企业中都有用到。下图是如何将 Crawlab 爬虫应用到持续集成工做流程中的例子。
要在 Crawlab 中建立或更新爬虫有两种方式:
CRAWLAB_SPIDER_PATH
中的爬虫文件。咱们作持续集成,就是针对第二种方式。步骤以下:
CRAWLAB_SPIDER_PATH
,若是是 Docker 注意将该地址挂载到宿主机文件系统;本篇文章主要介绍了爬虫管理平台的定义、如何选择爬虫管理平台,着重介绍了如何搭建开源爬虫管理平台 Crawlab,另外还讲到了如何集成 scrapy 爬虫以及如何打造持续集成工做流。本篇文章没有涉及到的内容还有不少,包括如何 Crawlab 的原理和架构详情、如何使用 Crawlab、如何编写大规模爬虫、如何使用 Jenkins 等等。这些内容可能会在其余文章中发布,请感兴趣的读者多多关注。另外,Crawlab 还有一些须要提高的地方,例如异常监控(零值、空值)、可配置爬虫、可视化抓取、日志集中收集等等。这些功能都将在之后陆续开发和发布,请你们也多多关注。
但愿本篇文章对您的工做和学习有所帮助,有任何疑问,请加做者微信 tikazyq1,或者在底部留言提问,做者将尽力回答。谢谢!