共计 9352 个字符,预计需要花费 24 分钟才能阅读完成。
写在后面: 本篇文章内容较多,波及常识较广,读完须要大概 20 分钟,请读者急躁浏览。
现在大多数企业都离不开爬虫,它是获取数据的一种无效形式。然而对爬虫有着规模量级要求的企业或集体须要同时解决不同类别的爬虫,这会凭空削减很多附加的治理老本。同时,爬虫管理者还须要应答网站内容变更、继续增量抓取、工作失败等问题。因而一个成熟的爬虫治理流程应该蕴含一个管理系统,可能无效解决上述问题。
爬虫有多重要
对搜索引擎来说,爬虫不可或缺;对舆情公司来说,爬虫是根底;对 NLP 来说,爬虫能够获取语料;对初创公司来说,爬虫能够获取初始内容。然而爬虫技术纷繁复杂,不同类型的抓取场景会使用到不同的技术。例如,简略的动态页面能够用 HTTP 申请+HTML 解析器间接搞定;一个动静页面须要用 Puppeteer 或 Selenium 等自动化测试工具;有反爬的网站须要用到代理、打码等技术;等等。那么此时就须要一个成熟的爬虫治理平台,帮忙企业或集体解决大量的爬虫类别。
了解什么是爬虫治理平台
定义
爬虫治理平台是一个一站式管理系统,集爬虫部署、任务调度、工作监控、后果展现等模块于一体,通常配有可视化 UI 界面,能够在 Web 端通过与 UI 界面交互来无效治理爬虫。爬虫治理平台一般来说是反对分布式的,能够在多台机器上合作运行。
当然,上述这个定义是广义的,通常针对于技术人员或开发者或技术经理。企业外部个别都会开发本人的外部爬虫管理系统,以应答简单的爬虫治理需要。这样的零碎就是上述定义的广义的爬虫治理平台。
狭义爬虫治理平台
而什么是狭义的爬虫治理平台呢?您可能据说过神箭手(后转型为后羿采集器)和八爪鱼吧。前者是基于云服务的,能够在线上编写、运行和监控爬虫,在狭义爬虫平台中最靠近广义定义的爬虫治理平台;后者是一个公众的商业爬虫抓取工具,能够让小白用户利落拽编写、运行爬虫,导出数据。您也可能见过各种 API 聚合服务商,例如聚合数据,这是一个能够间接调用网站接口获取数据的平台,这其实也算作爬虫平台的一个变种,只是它帮你实现了爬虫编写这一过程。而介于这两者之间的呢,国外有一家叫 Kimonolab 的公司,它开发了一个叫 Kimono 的 Chrome 插件,能够让用户在页面上可视化的点击元素并生成抓取规定,并在其网站上生成爬虫程序,用户提交工作,后盾就能够主动在网站上抓取数据了。Kimono 是一个平凡的爬虫利用,但惋惜的是,Kimonolab 曾经被大数据公司 Plantir 收买,当初也就无奈体验了。
在本文中,咱们次要关注广义定义的爬虫治理平台,因而前面所讲到的爬虫治理平台都是指广义的定义。
爬虫治理平台模块
以下是一个典型的爬虫治理平台所波及的模块。
爬虫治理平台架构
典型爬虫治理平台的模块次要蕴含以下内容:
- 工作治理:如何执行、调度爬虫抓取工作,以及如何监控工作,包含日志监控等等;
- 爬虫治理:包含爬虫部署,行将开发好的爬虫部署(打包或复制)到相应的节点上,以及爬虫配置和版本治理;
- 节点治理:包含节点(服务器 / 机器)的注册和监控,以及节点之间的通信,如何监控节点性能情况等;
- 前端利用:包含一个可视化 UI 界面,让用户可通过与其交互,与后盾利用进行通信。
当然,有些爬虫治理平台可能还不止这些模块,它可能包含其余比拟实用的性能,例如可配置的抓取规定、可视化配置抓取规定、代理池、Cookie 池、异样监控等等。
为什么须要爬虫治理平台
有了爬虫治理平台,开发者特地是爬虫工程师就可能不便的增加爬虫、执行工作、查看后果,而不必在命令行之间来回切换,非常容易出错。一个常见的场景就是爬虫工程师最后技术选型用了 scrapy 和 crontab 来治理爬虫工作,他不得不小心翼翼的抉择定时工作的工夫区间,以至于不会将服务器 CPU 或内存占满;更辣手的问题是,他还须要将 scrapy 产生的日志存到文件里,一旦爬虫出错了,他不得不用 shell 命令一个一个来查看日志来定位谬误起因,重大时会花上一个终日;还有个重大的问题,爬虫工程师可能发现公司业务量在减少,他须要写上百个爬虫来满足公司的业务需要,而用 scrapy 和 crontab 来治理齐全就是个噩梦。可怜的爬虫工程师其实齐全能够抉择一个适合爬虫治理平台来解决他的问题。
如何抉择一个适合的爬虫治理平台
当您违心解决后面提到的爬虫工程师遇到的艰难问题,而转而想抉择一个适合的爬虫治理平台时。
您首先应该答复的问题是:咱们是否须要从零开始开发一套零碎(Start from scratch)?要答复这个问题,您应该先答复上面几个问题:
- 咱们的需要是否简单到须要齐全定制化开发一套新零碎(例如要求简单的权限治理)?
- 咱们的团队是否有足够的技术实力来开发这套零碎(例如有经验丰富的前后端开发工程师)?
- 咱们的工夫资源是否足够咱们开发这套零碎(例如我的项目打算周期为一年)?
如果上述三个问题的答案任意一个为“否”,您应该好好思考利用市面上已有的开源爬虫治理平台来满足您的需要。
以下为市面上已有的开源爬虫治理平台:
总的来说,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 的整体架构图,由五大部分组成:
- 主节点(Master Node):负责工作派发、API、部署爬虫等;
- 工作节点(Worker Node):负责执行爬虫工作;
- MongoDB 数据库:存储节点、爬虫、工作等日常运行数据;
- Redis 数据库:贮存工作音讯队列、节点心跳等信息。
- 前端客户端:Vue 利用,负责前端交互和向后端申请数据。
Crawlab 架构
对于 Crawlab 如何应用和具体原理超出了本篇文章的范畴,感兴趣的能够去参考 Github 主页或相干文档。
Github 地址及 Demo
- 查看演示 Demo
- Github: https://github.com/tikazyq/cr…
应用 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://<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://<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 字段,已保障值可能被赋上(这很重要)。
上传并配置爬虫
在运行爬虫之前,您须要上传爬虫文件到主节点。步骤如下:
- 将爬虫文件打包成 zip(留神,要保障在根目录下间接打包);
- 在侧边栏点击“爬虫”导航至爬虫列表,点击“增加爬虫”按钮,抉择“自定义爬虫”;
- 点击“上传”按钮,抉择刚刚打包好的 zip 文件
- 上传胜利后,爬虫列表中会呈现新增加的自定义爬虫,这样就算上传胜利了。
能够在爬虫详情中点击“文件”标签,抉择一个文件,能够在文件中编辑代码。
接下来,您须要在“概览”标签中的“执行命令”一栏输出爬虫的 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 中创立或更新爬虫有两种形式:
- 上传打包成后的 zip 文件;
- 通过更改主节点中目录 CRAWLAB_SPIDER_PATH 中的爬虫文件。
咱们做继续集成,就是针对第二种形式。步骤如下:
- 用 Gitlab 或其余平台搭建好代码仓库;
- 在 Jenkins 中创立一个我的项目,在我的项目中将代码源指向之前创立的仓库;
- 在 Jenkins 我的项目中编写工作流,将公布地址指向 Crawlab 的 CRAWLAB_SPIDER_PATH,如果是 Docker 留神将该地址挂载到宿主机文件系统;
- Jenkins 我的项目的工作能够间接编写,也能够用 Jenkinsfile,具体能够查相干材料;
- 这样,每一次代码更新提交到代码仓库后,Jenkins 就会将更新后的代码公布到 Crawlab 里,Crawlab 主节点会将爬虫代码同步到工作节点,以待抓取。
总结
本篇文章次要介绍了爬虫治理平台的定义、如何抉择爬虫治理平台,着重介绍了如何搭建开源爬虫治理平台 Crawlab,另外还讲到了如何集成 scrapy 爬虫以及如何打造继续集成工作流。本篇文章没有波及到的内容还有很多,包含如何 Crawlab 的原理和架构详情、如何应用 Crawlab、如何编写大规模爬虫、如何应用 Jenkins 等等。这些内容可能会在其余文章中公布,请感兴趣的读者多多关注。另外,Crawlab 还有一些须要晋升的中央,例如异样监控(零值、空值)、可配置爬虫、可视化抓取、日志集中收集等等。这些性能都将在当前陆续开发和公布,请大家也多多关注。
本文分享自华为云社区《如何疾速搭建实用的爬虫治理平台》,原文作者:Marvin Zhang。
点击关注,第一工夫理解华为云陈腐技术~