本文主要讲解“如何快速搭建一个实用的爬虫管理平台”。本文的讲解内容简单明了,易学易懂。请跟随边肖的思路,学习学习“如何快速搭建实用的爬虫管理平台”。
00-1010对于搜索引擎来说,爬虫是不可或缺的;对于歌词公司来说,爬虫是基础;对于NLP,爬虫可以获取语料库;对于初创公司,爬虫可以获取初始内容。但是爬虫技术比较复杂,不同技术会应用不同类型的爬行场景。比如一个简单的静态页面可以直接用HTTP请求+HTML解析器处理;动态页面需要自动测试工具,如木偶师硒。有防爬功能的网站需要使用代理、编码等技术;等等。此时需要一个成熟的爬虫管理平台来帮助企业或个人处理大量的爬虫类别。
爬虫有多重要
-
理解什么是爬虫管理平台
爬虫管理平台是一个一站式管理系统,集成了爬虫部署、任务调度、任务监控、结果显示等模块,通常配备可视化UI界面,通过与Web端UI界面交互,可以有效管理爬虫。一般来说,爬虫管理平台支持分布式,可以在多台机器上协同运行。
当然,上面的定义比较狭隘,通常针对的是技术人员或者开发人员或者技术经理。企业通常开发自己的内部爬虫管理系统,以满足复杂的爬虫管理需求。这个系统就是上面定义的狭义的爬虫管理平台。
00-1010什么是广义的爬虫管理平台?你可能听说过剑客(后来转型为后羿收藏家)和章鱼。前者基于云服务,可以在线编写、运行和监控爬虫,最接近广义爬虫平台中狭义的爬虫管理平台。后者是一种流行的商业爬虫爬行工具,可以让小白用户拖动编写和运行爬虫并导出数据。你可能也见过各种各样的API聚合服务提供者,比如聚合数据,这是一个可以直接调用网站接口获取数据的平台,实际上被看作是爬虫平台的变种,但它帮助你完成了编译爬虫的过程。在这两者之间,有一家叫Kimonolab的国外公司,开发了一个叫和服的Chrome插件,可以让用户直观的点击页面上的元素并生成抓取规则,在自己的网站上生成爬虫程序。当用户提交任务时,后台可以自动抓取网站上的数据。和服是一个很棒的爬虫应用,但可惜的是Kimonolab已经被大数据公司Plantir收购了,现在还不能体验。
本文主要关注爬虫管理平台的狭义定义,所以后面提到的爬虫管理平台是指狭义定义。
00-1010以下是典型爬虫管理平台中涉及的模块。
爬虫管理平台架构
典型爬虫管理平台的模块主要包括以下内容:
任务管理:如何执行和调度爬虫爬行任务,如何监控任务,包括日志监控等。
爬虫管理:包括爬虫部署,即将开发的爬虫部署(打包或复制)到相应的节点,以及爬虫配置和版本管理;
节点管理:包括节点(服务器/机器)的注册和监控,节点之间的通信,以及如何监控节点的性能。
前端应用程序:它包括一个可视化的UI界面,允许用户通过与后台应用程序交互来与后台应用程序进行通信。
当然,有些爬虫管理平台可能不仅仅包括这些模块,还包括其他实用功能,比如可配置的抓取规则、可视化配置的抓取规则、代理池、Cookie池、异常监控等等。
10-10,有了爬虫管理平台,开发者,尤其是爬虫工程师,不用在命令行之间来回切换,就可以轻松添加爬虫、执行任务、查看结果,非常容易出错。常见的场景是,爬虫工程师在最初的技术选择中使用scrapy和crontab来管理爬虫任务,他必须仔细选择定时任务的时间间隔,这样就不会占用服务器CPU或内存;更困难的问题是,他仍然需要将scrapy生成的日志保存到文件中。一旦爬虫犯了错误,他必须使用shell命令逐个检查日志来定位错误的原因,严重的情况下需要一整天。还有一个严重的问题。爬虫工程师可能会发现公司的业务量在增加。他需要编写数百个爬虫来满足公司的业务需求,而使用scrapy和crontab来管理它是一场噩梦。可怜的爬虫工程师其实可以选择一个合适的爬虫管理平台来解决他的问题。
定义
当你愿意解决前面提到的爬虫工程师遇到的难题,想选择合适的爬虫管理平台代替时。
你应该回答的第一个问题是:我们需要从头开始开发一个系统吗?要回答这个问题,您应该首先回答以下问题:
我
们的需求是否复杂到需要完全定制化开发一套新系统(例如要求复杂的权限管理)?
我们的团队是否有足够的技术实力来开发这套系统(例如有经验丰富的前后端开发工程师)?
我们的时间资源是否足够我们开发这套系统(例如项目计划周期为一年)?
如果上述三个问题的答案任意一个为“否”,您应该好好考虑利用市面上已有的开源爬虫管理平台来满足您的需求。
以下为市面上已有的开源爬虫管理平台:
总的来说,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/crawlab
使用 Docker 部署安装 Crawlab
Docker 镜像
Docker 是部署 Crawlab 最方便和简洁的方式。其他部署方式包括直接部署,不过对于想快速搭建平台的开发者来说不推荐。Crawlab 已在Dockerhub上注册了相关的镜像,开发者仅需要执行docker pull tikazyq/crawlab命令就可以将 Crawlab 的镜像下载下来。
读者可以去 Dockerhub 上查看 Crawlab 的镜像,只有仅不到 300Mb。 地址:https://hub.docker.com/r/tikazyq/crawlab/tags
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 主节点会将爬虫代码同步到工作节点,以待抓取。
感谢各位的阅读,以上就是“如何快速搭建实用的爬虫管理平台”的内容了,经过本文的学习后,相信大家对如何快速搭建实用的爬虫管理平台这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/43719.html