小白也能看懂!教你如何快速搭建实用的爬虫管理平台

写在前面:本篇文章内容较多,涉及知识较广,读完须要大约 20 分钟,请读者耐心阅读。

现在大多数企业都离不开爬虫,它是获取数据的一种有效方式。可是对爬虫有着规模量级要求的企业或我的须要同时处理不一样类别的爬虫,这会凭空增添不少附加的管理成本。同时,爬虫管理者还须要应对网站内容变动、持续增量抓取、任务失败等问题。所以一个成熟的爬虫管理流程应该包含一个管理系统,可以有效处理上述问题。前端

爬虫有多重要

对搜索引擎来讲,爬虫不可或缺;对舆情公司来讲,爬虫是基础;对 NLP来讲,爬虫能够获取语料;对初创公司来讲,爬虫能够获取初始内容。可是爬虫技术纷繁复杂,不一样类型的抓取场景会运用到不一样的技术。例如,简单的静态页面能够用 HTTP 请求+HTML 解析器直接搞定;一个动态页面须要用 Puppeteer 或 Selenium等自动化测试工具;有反爬的网站须要用到代理、打码等技术;等等。那么此时就须要一个成熟的爬虫管理平台,帮助企业或我的处理大量的爬虫类别。git

理解什么是爬虫管理平台

定义

爬虫管理平台是一个一站式管理系统,集爬虫部署、任务调度、任务监控、结果展现等模块于一体,一般配有可视化 UI 界面,能够在 Web 端经过与 UI 界面交互来有效管理爬虫。爬虫管理平台通常来讲是支持分布式的,能够在多台机器上协做运行。github

固然,上述这个定义是狭义的,一般针对于技术人员或开发者或技术经理。企业内部通常都会开发本身的内部爬虫管理系统,以应对复杂的爬虫管理需求。这样的系统就是上述定义的狭义的爬虫管理平台。web

广义爬虫管理平台

而什么是广义的爬虫管理平台呢?您可能据说过神箭手(后转型为后羿采集器)和八爪鱼吧。前者是基于云服务的,能够在线上编写、运行和监控爬虫,在广义爬虫平台中最接近狭义定义的爬虫管理平台;后者是一个大众的商业爬虫抓取工具,可让小白用户拖拉拽编写、运行爬虫,导出数据。您也可能见过各类 API 聚合服务商,例如聚合数据,这是一个能够直接调用网站接口获取数据的平台,这其实也算做爬虫平台的一个变种,只是它帮你完成了爬虫编写这一过程。而介于这二者之间的呢,国外有一家叫 Kimonolab 的公司,它开发了一个叫 Kimono 的 Chrome 插件,可让用户在页面上可视化的点击元素并生成抓取规则,并在其网站上生成爬虫程序,用户提交任务,后台就能够自动在网站上抓取数据了。Kimono 是一个伟大的爬虫应用,但惋惜的是,Kimonolab 已经被大数据公司 Plantir 收购,如今也就没法体验了。redis

在本文中,咱们主要关注狭义定义的爬虫管理平台,所以后面所讲到的爬虫管理平台都是指狭义的定义。docker

爬虫管理平台模块

如下是一个典型的爬虫管理平台所涉及的模块。shell

爬虫管理平台架构数据库

典型爬虫管理平台的模块主要包含如下内容:编程

  • 任务管理:如何执行、调度爬虫抓取任务,以及如何监控任务,包括日志监控等等;
  • 爬虫管理:包括爬虫部署,即将开发好的爬虫部署(打包或复制)到相应的节点上,以及爬虫配置和版本管理;
  • 节点管理:包括节点(服务器/机器)的注册和监控,以及节点之间的通讯,如何监控节点性能情况等;
  • 前端应用:包括一个可视化 UI 界面,让用户可经过与其交互,与后台应用进行通讯。

固然,有些爬虫管理平台可能还不止这些模块,它可能包括其余比较实用的功能,例如可配置的抓取规则、可视化配置抓取规则、代理池、Cookie 池、异常监控等等。json

为何须要爬虫管理平台

有了爬虫管理平台,开发者特别是爬虫工程师就可以方便的添加爬虫、执行任务、查看结果,而不用在命令行之间来回切换,很是容易出错。一个常见的场景就是爬虫工程师最初技术选型用了 scrapy 和 crontab 来管理爬虫任务,他不得不当心翼翼的选择定时任务的时间区间,以致于不会将服务器 CPU 或内存占满;更棘手的问题是,他还须要将 scrapy 产生的日志存到文件里,一旦爬虫出错了,他不得不用 shell 命令一个一个来查看日志来定位错误缘由,严重时会花上一个成天;还有个严重的问题,爬虫工程师可能发现公司业务量在增长,他须要写上百个爬虫来知足公司的业务需求,而用 scrapy 和 crontab 来管理彻底就是个噩梦。可怜的爬虫工程师其实彻底能够选择一个合适爬虫管理平台来解决他的问题。

如何选择一个合适的爬虫管理平台

当您愿意解决前面提到的爬虫工程师遇到的困难问题,而转而想选择一个合适的爬虫管理平台时。

您首先应该回答的问题是:咱们是否须要从零开始开发一套系统(Start from scratch)?要回答这个问题,您应该先回答下面几个问题:

  1. 咱们的需求是否复杂到须要彻底定制化开发一套新系统(例如要求复杂的权限管理)?
  2. 咱们的团队是否有足够的技术实力来开发这套系统(例若有经验丰富的先后端开发工程师)?
  3. 咱们的时间资源是否足够咱们开发这套系统(例如项目计划周期为一年)?

若是上述三个问题的答案任意一个为“否”,您应该好好考虑利用市面上已有的开源爬虫管理平台来知足您的需求。

如下为市面上已有的开源爬虫管理平台:

总的来讲,SpiderKeeper 多是最先的爬虫管理平台,但功能相对来讲比较局限;Gerapy 虽然功能齐全,界面精美,但有很多 bug 须要处理,建议有需求的用户等待 2.0 版本;Scrapydweb是一个比较完善的爬虫管理平台,不过和前二者同样,都是基于 scrapyd 的,所以只能运行 scrapy 爬虫;而Crawlab是一个很是灵活的爬虫管理平台,能够运行 Python、Nodejs、Java、PHP、Go 写的爬虫,并且功能比较齐全,只是部署起来相对于前三者来讲要麻烦一些,不过对于 Docker 使用者来讲能够作到一件部署(后面咱们会讲)。

所以,对于重度 scrapy 爬虫依赖的、又不想折腾的开发者,能够考虑 Scrapydweb;而对于有各类类型的、复杂技术结构的爬虫开发者来讲,应该优先考虑更灵活的 Crawlab。固然,不是说 Crawlab 对 scrapy 支持不友好,Crawlab 一样能够很好的集成 scrapy,后面会介绍。

做为 Crawlab 的做者,不想王婆卖瓜,自卖自诩,做者仅仅但愿将最好的技术选型推荐给开发者,让开发者根据自身的需求来决定该使用哪一种爬虫管理平台。

爬虫管理平台 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 的总体架构图,由五大部分组成:

  1. 主节点(Master Node):负责任务派发、API、部署爬虫等;
  2. 工做节点(Worker Node):负责执行爬虫任务;
  3. MongoDB 数据库:存储节点、爬虫、任务等平常运行数据;
  4. Redis 数据库:储存任务消息队列、节点心跳等信息。
  5. 前端客户端:Vue 应用,负责前端交互和向后端请求数据。

Crawlab 架构

关于 Crawlab 如何使用和详细原理超出了本篇文章的范围,感兴趣的能够去参考Github 主页相关文档

Github地址及Demo

使用 Docker 部署安装 Crawlab

Docker 镜像

Docker 是部署 Crawlab 最方便和简洁的方式。其余部署方式包括直接部署,不过对于想快速搭建平台的开发者来讲不推荐。Crawlab 已在Dockerhub上注册了相关的镜像,开发者仅须要执行docker pull tikazyq/crawlab命令就能够将 Crawlab 的镜像下载下来。

读者能够去 Dockerhub 上查看 Crawlab 的镜像,只有仅不到 300Mb。地址:https://hub.docker.com/r/tika...

Dockerhub Page

安装 Docker

要使用 Docker 来部署 Crawlab,您首先得保证 Docker 已经安装好。请参考如下文档来安装。

安装 Docker Compose

Docker Compose 是简单的运行 Docker 集群的工具,很是轻量级,咱们将用到 Docker Compose 来一键部署 Crawlab。

Docker 的官方网站已经有如何安装 Docker Compose 的教程,点击连接查看。这里简单介绍一下。

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 pull

启动 Crawlab

咱们将用 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 的镜像,这可能会花几分钟时间。拉取完毕后,四个服务会依次启动,您将会在命令行中看到以下内容。

docker-compose

正常状况下,您应该能够看到四个服务都启动成功,并可以顺利打印日志。

若是您是在本机上启动的 Docker Compose,能够在浏览器中输入http://localhost:8080,而后就能看到登录界面了;若是您是在其余机器上启动的 Docker Compose,您须要在浏览器中输入http://&lt;your_ip>:8080来看到登录界面,<your_ip>是其余机器的 IP 地址(请保证 8080 端口在该机器已对外开放)。

login

初始登录用户名密码是 admin/admin,您可使用这个用户名密码来登录。若是您的环境变量CRAWLAB_API_ADDRESS设置得不正确,您可能会看到点击登录后登录按钮会一直转圈而没有任何提示。这时请从新在docker-compose.yml中设置正确的CRAWLAB_API_ADDRESS(将localhost替换为<your_ip>),从新启动docker-compose up。而后在浏览器中输入http://&lt;your_ip>:8080。

登录以后您将看到 Crawlab 的主页。

home

本篇文章主要介绍如何搭建爬虫管理平台 Crawlab,所以不会详细介绍如何使用 Crawlab(可能会建立另外一篇文章来详细介绍,有兴趣者能够关注一下)。若是您有困惑,请查看相关文档来了解如何使用。

如何将 Scrapy 等爬虫集成到 Crawlab

众所周知,Scrapy 是很是受欢迎的爬虫框架,其灵活的框架设计、高并发、易用性以及可扩展性让不少开发者和企业大量采用。市面上的爬虫管理平台几乎都支持 Scrapy 爬虫,Crawlab 也不例外,但 Crawlab 能够运行 puppeteer、selenium 等其余爬虫。下面将介绍一下在 Crawlab 中如何运行 scrapy 爬虫。

Crawlab 是执行爬虫基本原理

Crawlab 执行爬虫的原理很简单,其实就是一个 shell 命令。用户在爬虫中输入执行爬虫的 shell 命令,例如scrapy crawl some_spider,Crawlab 执行器会读取这个命令,并在 shell 中直接执行。所以,每一次运行爬虫任务,就是执行了一次 shell 命令(固然,实际状况要比这个复杂不少,感兴趣的能够去参考官方文档)。Crawlab 是支持展现和导出爬虫结果的,不过这须要稍微多作一些工做。

编写 Pipeline

要集成 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字段,已保证值可以被赋上(这很重要)。

上传并配置爬虫

在运行爬虫以前,您须要上传爬虫文件到主节点。步骤以下:

  1. 将爬虫文件打包成 zip(注意,要保证在根目录下直接打包);
  2. 在侧边栏点击“爬虫”导航至爬虫列表,点击“添加爬虫”按钮,选择“自定义爬虫”;
  3. 点击“上传”按钮,选择刚刚打包好的 zip 文件
  4. 上传成功后,爬虫列表中会出现新添加的自定义爬虫,这样就算上传成功了。

能够在爬虫详情中点击“文件”标签,选择一个文件,能够在文件中编辑代码。

接下来,您须要在“概览”标签中的“执行命令”一栏输入爬虫的 shell 执行命令。Crawlab 的 Docker 镜像里是内置了 scrapy 的,所以能够直接运行 scrapy 爬虫。命令就是scrapy crawl <some_spider>。点击“保存”按钮保存爬虫配置。

运行爬虫任务

而后就是运行爬虫任务了。其实很简单,在“概览”标签中点击“运行”按钮,爬虫任务就开始运行了。若是日志提示找不到 scrapy 命令,能够将scrapy改成绝对路径/usr/local/bin/scrapy,这样就会运行成功。

任务运行状况会在“任务”页面或者爬虫“概览”里展示,会每 5 秒钟更新一次,你们能够在这上面查看。并且在爬虫“结果”标签里,能够预览结果的详情,还能够导出数据成 CSV 文件。

构建持续集成(CI)工做流

对于企业来讲,软件开发通常是一个自动化过程。它会经历需求、开发、部署、测试、上线这几个步骤。而这个流程通常是不断迭代(Iterative)的,须要不断更新和发布。

以爬虫为例,您上线了一个爬虫,这个爬虫会按期抓取网站数据。但忽然有一天您发现数据抓不到了,您快速定位缘由,发现原来是网站改版了,您须要更改爬虫抓取规则来应对网站的改版。总之,您须要发布一个代码更新。最快的作法是直接在线上更改代码。但这样作很是危险:第一,您没法测试您更新后的代码,只能经过不断调整线上代码来测试是否抓取成功;第二,您没法记录此次更改,后期若是出了问题您极可能会忽略掉此次更改,从而致使 bug。您须要作的,无非是将您的爬虫代码用版本管理工具管理起来。咱们有不少版本管理工具,最经常使用的就是 git、subversion,版本管理平台包括 Gitlab、Bitbucket、自搭 Git 仓库等。

当咱们更新了代码,咱们须要将更新后的代码发布到线上服务器。这时您须要用本身写部署脚本,或者更方便的,用 Jenkins 做为持续集成(Continuous Integration)管理平台。Jenkins 是一个持续集成平台,能够经过获取版本库来更新部署代码,是很是实用的工具,在不少企业中都有用到。下图是如何将 Crawlab 爬虫应用到持续集成工做流程中的例子。

ci

要在 Crawlab 中建立或更新爬虫有两种方式:

  1. 上传打包成后的 zip 文件;
  2. 经过更改主节点中目录CRAWLAB_SPIDER_PATH中的爬虫文件。

咱们作持续集成,就是针对第二种方式。步骤以下:

  1. 用 Gitlab 或其余平台搭建好代码仓库;
  2. 在 Jenkins 中建立一个项目,在项目中将代码源指向以前建立的仓库;
  3. 在 Jenkins 项目中编写工做流,将发布地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,若是是 Docker 注意将该地址挂载到宿主机文件系统;
  4. Jenkins 项目的工做能够直接编写,也能够用 Jenkinsfile,具体能够查相关资料;
  5. 这样,每一次代码更新提交到代码仓库后,Jenkins 就会将更新后的代码发布到 Crawlab 里,Crawlab 主节点会将爬虫代码同步到工做节点,以待抓取。

总结

本篇文章主要介绍了爬虫管理平台的定义、如何选择爬虫管理平台,着重介绍了如何搭建开源爬虫管理平台 Crawlab,另外还讲到了如何集成 scrapy 爬虫以及如何打造持续集成工做流。本篇文章没有涉及到的内容还有不少,包括如何 Crawlab 的原理和架构详情、如何使用 Crawlab、如何编写大规模爬虫、如何使用 Jenkins 等等。这些内容可能会在其余文章中发布,请感兴趣的读者多多关注。另外,Crawlab 还有一些须要提高的地方,例如异常监控(零值、空值)、可配置爬虫、可视化抓取、日志集中收集等等。这些功能都将在之后陆续开发和发布,请你们也多多关注。

本文分享自华为云社区《如何快速搭建实用的爬虫管理平台》,原文做者:Marvin Zhang。

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索