解决方案:如何快速搭建实用的爬虫管理平台
优采云 发布时间: 2022-11-21 08:34解决方案:如何快速搭建实用的爬虫管理平台
介绍
大多数企业都离不开爬虫,而爬虫是获取数据的有效途径。对于搜索引擎来说,爬虫是必不可少的;对于舆情公司来说,爬虫是基础;对于NLP,爬虫可以获得语料库;对于初创公司,爬虫可以获得初始内容。但是爬虫技术是复杂的,不同类型的爬虫场景会用到不同的技术。比如一个简单的静态页面,可以直接用HTTP请求+HTML解析器处理;动态页面需要使用自动化测试工具,如 Puppeteer 或 Selenium;有反爬虫的网站需要使用代理、编码等技术;等等。因此,对爬虫有*敏*感*词*需求的公司或个人需要同时应对不同类型的爬虫,这会凭空增加很多额外的管理成本。同时,爬虫管理员还需要处理网站内容变更、持续增量爬取、任务失败等问题。因此,一个成熟的爬虫管理流程应该包括一个能够有效处理上述问题的管理系统。
了解什么是爬虫管理平台
定义
爬虫管理平台是集爬虫部署、任务调度、任务监控、结果展示等模块于一体的一站式管理系统。通常配备可视化的UI界面,通过在Web端与UI界面进行交互,可以对爬虫进行有效的管理。爬虫管理平台一般支持分布式,可以多机协同运行。
当然,上面的定义是狭义的,通常是针对技术人员或者开发人员或者技术管理人员。企业一般会开发自己的内部爬虫管理系统,以应对复杂的爬虫管理需求。这样的系统就是上面定义的狭义的爬虫管理平台。
广义爬虫管理平台
而什么是广义的爬虫管理平台呢?您可能听说过优采云
(后来转变为优采云
Collector)和优采云
。前者基于云服务,可以在线编写、运行和监控爬虫,最接近广义爬虫平台中狭义的爬虫管理平台;后者是一款流行的商业爬虫爬虫,允许新手用户拖拽编写,运行爬虫,导出数据。大家可能也见过各种API聚合服务商,比如聚合数据,就是一个可以直接调用网站接口获取数据的平台。这其实是爬虫平台的一个变种,只是帮助你完成爬虫的编写。过程。中间有一家外国公司叫Kimonolab,该公司开发了一款名为 Kimono 的 Chrome 插件,可以让用户直观地点击页面上的元素并生成抓取规则,并将其显示在其网站上。生成一个爬虫程序,用户提交任务,后台可以自动抓取网站数据。Kimono是一款很棒的爬虫应用,可惜Kimonolab已经被大数据公司Plantir收购,目前无法体验。
本文主要关注狭义的爬虫管理平台,所以后面提到的爬虫管理平台都是指狭义的定义。
爬虫管理平台模块
以下是一个典型的爬虫管理平台涉及的模块。
一个典型的爬虫管理平台的模块主要包括以下内容:
当然,有些爬虫管理平台可能不止这些模块,还可能包括其他更实用的功能,比如可配置的爬虫规则、可视化配置的爬虫规则、代理池、cookie池、异常监控等等。
为什么需要爬虫管理平台
借助爬虫管理平台,开发者尤其是爬虫工程师可以轻松添加爬虫、执行任务、查看结果,无需在命令行之间来回切换,非常容易出错。一个常见的场景是爬虫工程师最初使用scrapy和crontab来管理爬虫任务。他要仔细选择定时任务的时间间隔,以免服务器CPU或内存被占满;比较棘手的问题是,他还需要将scrapy产生的日志保存在一个文件中。爬虫一旦出错,就得用shell命令一条一条查看日志,定位错误原因。严重的需要一整天;还有一个比较严重的问题,一个爬虫工程师可能发现公司的业务量越来越大,而他需要写上百个爬虫来满足公司的业务需求,用scrapy和crontab来管理简直是噩梦。可怜的爬虫工程师其实可以选择一个合适的爬虫管理平台来解决他的问题。
如何选择合适的爬虫管理平台
当你愿意解决上面提到的爬虫工程师遇到的棘手问题,而是想选择一个合适的爬虫管理平台时。
你应该回答的第一个问题是:我们需要从头开始(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的功能齐全的爬虫管理平台。也不支持scrapy以外的爬虫。Python Flask作为后端,在性能上有一定的局限性。Crawlab Golang + Vue 不局限于scrapy,可以运行任何语言和框架的爬虫,精美的UI界面,天然支持分布式爬虫,支持节点管理、爬虫管理、任务管理、定时任务、结果导出、数据统计等功能. 部署有点麻烦(不过可以使用Docker一键部署),最新版本暂时不支持可配置爬虫。通常来说,一般来说,SpiderKeeper 可能是最早的爬虫管理平台,但是功能比较有限;Gerapy虽然功能完备,界面漂亮,但是也有很多bug需要解决。建议有需要的用户等待2.0版本;Scrapydweb是一个比较完善的爬虫管理平台,但是和前两者一样,是基于scrapyd的,所以只能运行scrapy爬虫;而Crawlab是一个非常灵活的爬虫管理平台,可以运行Python、Nodejs,用Java、PHP、Go写的爬虫,功能比较齐全,但是部署起来比前三个麻烦,但是Docker可以一次部署用户(我们稍后会讨论)。Gerapy虽然功能完备,界面漂亮,但是也有很多bug需要解决。建议有需要的用户等待2.0版本;Scrapydweb是一个比较完善的爬虫管理平台,但是和前两者一样,是基于scrapyd的,所以只能运行scrapy爬虫;而Crawlab是一个非常灵活的爬虫管理平台,可以运行Python、Nodejs,用Java、PHP、Go写的爬虫,功能比较齐全,但是部署起来比前三个麻烦,但是Docker可以一次部署用户(我们稍后会讨论)。Gerapy虽然功能完备,界面漂亮,但是也有很多bug需要解决。建议有需要的用户等待2.0版本;Scrapydweb是一个比较完善的爬虫管理平台,但是和前两者一样,是基于scrapyd的,所以只能运行scrapy爬虫;而Crawlab是一个非常灵活的爬虫管理平台,可以运行Python、Nodejs,用Java、PHP、Go写的爬虫,功能比较齐全,但是部署起来比前三个麻烦,但是Docker可以一次部署用户(我们稍后会讨论)。所以它只能运行 scrapy 爬虫;而Crawlab是一个非常灵活的爬虫管理平台,可以运行Python、Nodejs,用Java、PHP、Go写的爬虫,功能比较齐全,但是部署起来比前三个麻烦,但是Docker可以一次部署用户(我们稍后会讨论)。所以它只能运行 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自今年3月上线以来,受到了爬虫爱好者和开发者的一致好评。也有不少用户表示会使用Crawlab搭建公司的爬虫平台。经过几个月的迭代,Crawlab陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动字段提取、下载结果、上传爬虫等功能,让平台更加实用全面,真正能够帮助解决用户爬虫管理难的问题。现在Github上有近1k star,相关社区(微信群、微信公众号)也已经建立,四分之一的用户表示已经将Crawlab应用于企业爬虫管理。可见Crawlab受到开发者的关注和喜欢。
解决这个问题
Crawlab主要解决爬虫数量多管理难的问题。比如需要同时监控上百个网站的scrapy和selenium混合项目,管理起来并不容易,而且命令行管理的成本非常高,而且容易出错。Crawlab 支持任何语言和任何框架。配合任务调度和任务监控,轻松有效监控和管理大型爬虫项目。
界面与使用
下面是 Crawlab 爬虫列表页面的截图。
用户只需将爬虫上传到Crawlab,配置执行命令,点击“运行”按钮即可执行爬虫任务。爬虫任务可以在任何节点上运行。从上图可以看出,Crawlab有节点管理、爬虫管理、任务管理、定时任务、用户管理等模块。
总体结构
下面是Crawlab的整体架构图,由五部分组成:
Master Node:负责任务分发、API、爬虫部署等;Worker Node:负责执行爬虫任务;MongoDB数据库:存储节点、爬虫、任务等日常运行数据;Redis数据库:存储任务消息队列、节点心跳等信息。前端客户端:Vue应用,负责前端交互,向后端请求数据。
Crawlab的使用方法和详细原理不在本文讨论范围之内。有兴趣的可以参考Github主页或相关文档。
Github地址和Demo
使用 Docker 部署安装 Crawlab
码头工人形象
Docker是部署Crawlab最方便简洁的方式。其他部署方式包括直接部署,但不推荐希望快速搭建平台的开发者使用。Crawlab 已经在 Dockerhub 上注册了相关镜像。开发者只需要执行docker pull tikazyq/crawlab命令即可下载Crawlab的镜像。
读者可以去Dockerhub查看Crawlab的镜像,只有不到300Mb。地址:/r/tikazyq/c...
安装 Docker
使用Docker部署Crawlab,首先要确保Docker已经安装。请参考以下文档进行安装。
操作系统文档 Mac /docker-for-... Windows /docker-for-... Ubuntu /install/lin... Debian /install/lin... CentOS /install/lin... Fedora /install/lin... 其他 Linux 发行版 /install/lin... 安装 Docker撰写
Docker Compose是一个简单的Docker集群运行工具,非常轻量级,我们将使用Docker Compose一键部署Crawlab。
Docker官网已经有Docker Compose安装教程,点击链接查看。这里简单介绍一下。
操作系统安装步骤 Mac Docker Desktop for Mac 或 Docker Toolbox 自带,不需要安装 Windows Docker Desktop for Windows 或 Docker Toolbox 自带,不需要单独安装 Linux 参考下面的命令table 其他选项通过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,可以在浏览器中输入:8080,即可看到登录界面;如果在另一台机器上启动Docker Compose,需要在浏览器中输入:8080才能看到登录界面,这是其他机器的IP地址(请保证本机8080端口对外开放)。
" />
初始登录用户名和密码为admin/admin,您可以使用该用户名和密码登录。如果您的环境变量CRAWLAB_API_ADDRESS设置不正确,您可能会看到登录按钮在点击登录后一直在旋转,没有任何提示。此时请在docker-compose.yml中重新设置正确的CRAWLAB_API_ADDRESS(将localhost替换为),并重启docker-compose up。然后在浏览器中输入:8080。
登录后,您将看到 Crawlab 主页。
本文主要介绍如何搭建爬虫管理平台Crawlab,所以不会详细介绍如何使用Crawlab(可能会另建一篇文章详细介绍,有兴趣的可以关注)。如果您感到困惑,请查看相关文档以了解如何使用它。同时,您也可以在微信(tikazyq1)上添加作者并注明Crawlab,作者会拉您进入讨论组,您可以在讨论组中回答问题。
如何将Scrapy等爬虫集成到Crawlab中
众所周知,Scrapy是一个非常流行的爬虫框架。其灵活的框架设计、高并发性、易用性和可扩展性已被众多开发者和企业广泛采用。市面上几乎所有的爬虫管理平台都支持Scrapy爬虫,Crawlab也不例外,但Crawlab可以运行puppeteer、selenium等爬虫。下面将介绍如何在Crawlab中运行scrapy爬虫。
Crawlab是执行爬虫的基本原理
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字段,保证可以赋值(这个很重要)。
上传并配置爬虫
在运行爬虫之前,需要将爬虫文件上传到master节点。进行如下:
将爬虫文件打包成zip(注意一定要直接打包到根目录下);点击侧边栏“爬虫”导航到爬虫列表,点击“添加爬虫”按钮,选择“自定义爬虫”;点击“上传”按钮,选择刚刚打包好的zip文件。上传成功后,新添加的自定义爬虫会出现在爬虫列表中,即表示上传成功。
您可以点击爬虫详情中的“文件”选项卡,选择一个文件,编辑文件中的代码。
接下来需要在“概览”选项卡的“执行命令”栏中输入爬虫的shell执行命令。Crawlab的Docker镜像内置了scrapy,直接运行scrapy爬虫即可。命令是scrapy crawl。点击“保存”按钮保存爬虫配置。运行爬虫任务
然后就是运行爬虫任务。其实很简单。单击“概览”选项卡中的“运行”按钮,爬虫任务将开始运行。如果日志提示找不到scrapy命令,可以将scrapy改为绝对路径/usr/local/bin/scrapy,即可运行成功。
任务的运行状态会显示在爬虫的“任务”页面或“概览”中,每5秒更新一次。你可以在这里查看。并且在爬虫的“结果”选项卡中,可以预览结果的详细信息,还可以将数据导出为CSV文件。
构建持续集成 (CI) 工作流
对于企业来说,软件开发通常是一个自动化的过程。它将经历需求、开发、部署、测试和启动的步骤。而且这个过程一般是迭代的,需要不断更新发布。
以爬虫为例,你启动了一个爬虫,这个爬虫会定时抓取网站数据。但是突然有一天你发现数据抓不到了。你很快定位原因,发现网站改版了。您需要更改抓取规则以应对网站改版。无论如何,您需要发布代码更新。最快的方法就是直接改代码就行了。但这很危险:首先,你无法测试你更新后的代码,只能通过不断调整线上代码来测试爬取是否成功;第二,你不能记录这个变化,如果以后出了什么问题,你可能会忽略这个变化,从而导致bug。您需要做的就是使用版本管理工具来管理您的爬虫代码。我们有很多版本管理工具,
当我们更新代码时,我们需要将更新后的代码发布到在线服务器上。这时候就需要自己编写部署脚本,或者更方便的是,使用Jenkins作为持续集成(Continuous Integration)管理平台。Jenkins是一个持续集成平台,可以通过获取版本库来更新部署代码。是一款非常实用的工具,很多企业都在使用。下图是如何将 Crawlab 爬虫应用到持续集成工作流中的示例。
在 Crawlab 中创建或更新爬虫有两种方式:
上传打包后的zip文件;通过更改主节点中 CRAWLAB_SPIDER_PATH 目录下的爬虫文件。
我们针对第二种方式做持续集成。进行如下:
使用Gitlab或其他平台搭建代码仓库;在Jenkins中创建一个项目,将项目中的代码源指向之前创建的仓库;在Jenkins项目中写一个工作流,将发布地址指向Crawlab的CRAWLAB_SPIDER_PATH,如果是Docker,注意该地址挂载到宿主机文件系统;Jenkins项目的工作可以直接写,也可以使用Jenkinsfile,可以查看相关资料;这样每次代码更新提交到代码仓库后,Jenkins都会将更新后的代码发布到Crawlab中,Crawlab的主节点会将爬虫代码同步到工作节点进行爬取。
综上所述
本文主要介绍了爬虫管理平台的定义,如何选择爬虫管理平台,重点介绍了如何搭建一个开源的爬虫管理平台Crawlab,同时也谈到了如何集成scrapy爬虫以及如何创建持续集成工作流. 本文还有很多内容没有涉及,包括如何理解Crawlab的原理和架构、如何使用Crawlab、如何编写大型爬虫、如何使用Jenkins等等。这些内容可能会发表在其他文章中,请感兴趣的读者多加留意。此外,Crawlab还有一些需要改进的地方,比如异常监控(零值、空值)、可配置爬虫、可视化爬虫、集中日志采集
等。
概括
欢迎关注头条号:JAVA大飞哥
如果觉得自己有所收获,可以点击关注采集
转发一波,谢谢大家的支持!
私信头条号:发送:“免费资料”获取微服务、分布式、高并发、高可用、性能优化、源码分析等一些技术资料。
最后,各位阅读到这里的Java程序员朋友,感谢大家的耐心阅读。希望在成为更好的Java程序员的道路上,我们一起学习,共同进步!能拿下白富美,走向建筑师人生的巅峰!
解决方案:智动网页内容采集器 v1.94 网络推广
2.用户可以随意导入导出任务
3、任务可设置密码,具有N页采集
暂停、采集
遇到特殊标记暂停等多种防破解、防采集
功能。
4、可以直接输入网址进行采集,也可以用JavaScript脚本生成网址,或者使用关键词搜索方式进行采集
5、可以使用登录采集
方式,采集
需要登录账号才能查看的网页内容
6、可以深入N栏目无限采集
内容和链接
" />
7、支持多种内容提取方式,您可以根据需要对采集到的内容进行处理,如清除HTML、图片等。
8、自编JAVASCRIPT脚本,可提取网页内容,轻松采集网页内容的任何部分
9、采集到的文字内容可以按照设定的模板进行保存
10.多个采集文件可以根据模板保存到同一个文件中
11、可以对网页的多部分内容进行分页内容采集
" />
12.可设置客户信息模拟百度等搜索引擎对目标网站的采集
13、软件可长期免费使用
智动网页内容采集器v1.9更新:
软件内置网址更新为
使用新的智能软件控制 UI