nodejs抓取动态网页(华为云开发者社区搭建python爬虫管理平台的相关内容吗)
优采云 发布时间: 2022-01-29 23:11nodejs抓取动态网页(华为云开发者社区搭建python爬虫管理平台的相关内容吗)
想知道快速搭建python爬虫管理平台的相关内容吗?在这篇文章中,华为云开发者社区将为大家讲解搭建python爬虫平台的相关知识和一些代码示例。欢迎阅读和指正。我们先把重点放在:python、爬虫、爬虫、构建,一起来学习。
爬行动物有多重要
对于搜索引擎来说,爬虫是必不可少的;对于舆论公司来说,爬虫是基础;对于 NLP,爬虫可以获得语料库;对于初创公司,爬虫可以获取初始内容。但是爬虫技术比较复杂,不同类型的爬取场景会用到不同的技术。比如一个简单的静态页面可以直接用HTTP请求+HTML解析器完成;动态页面需要使用 Puppeteer 或 Selenium 等自动化测试工具;反爬网站需要使用代理、编码等技术;等等。这时就需要一个成熟的爬虫管理平台来帮助企业或个人处理大量的爬虫类别。
了解爬虫管理平台的定义是什么
爬虫管理平台是集爬虫部署、任务调度、任务监控、结果展示等模块于一体的一站式管理系统。它通常配备可视化的 UI 界面,通过与 Web 端的 UI 界面交互,可以有效地管理爬虫。爬虫管理平台一般支持多机分布式协同运行。
当然,上述定义是狭隘的,通常针对技术人员或开发人员或技术管理人员。企业一般会自行开发内部爬虫管理系统,以应对复杂的爬虫管理需求。这样的系统就是上面定义的狭义的爬虫管理平台。
通用爬虫管理平台
什么是通用爬虫管理平台?您可能听说过 优采云(后来转换为 优采云采集器)和 优采云。前者是基于云服务的爬虫管理平台,可以在线编写、运行和监控爬虫。是一般爬虫平台中最接近狭义的爬虫管理平台;后者是一种流行的商业爬虫爬取工具,允许新手用户通过拖放来编写和运行爬虫导出数据。您可能还见过各种 API 聚合服务提供商,例如 Aggregate Data。这是一个可以直接调用网站接口获取数据的平台。这实际上是爬虫平台的一个变种,但它可以帮助您完成爬虫编写过程。过程。而在两者之间,国外有个叫Kimonolab的公司,开发了一个Chrome插件叫Kimono,可以让用户直观的点击页面上的元素,生成抓取规则,放到网站爬虫生成后,用户提交任务,数据可以在网站上自动捕获。Kimono是一款很棒的爬虫应用,可惜Kimonolab已经被大数据公司Plantir收购,现在无法体验。
在本文中,我们主要关注狭义的爬虫管理平台,因此后面提到的爬虫管理平台指的是狭义的。
爬虫管理平台模块
以下是一个典型的爬虫管理平台所涉及的模块。
爬虫管理平台架构
一个典型的爬虫管理平台的模块主要包括以下几个:
当然,有些爬虫管理平台的模块可能不止这些。它可能包括其他更实用的功能,如可配置爬虫规则、可视化配置爬虫规则、代理池、cookie池、异常监控等。
为什么需要爬虫管理平台
有了爬虫管理平台,开发者,尤其是爬虫工程师,可以很方便的添加爬虫,执行任务,查看结果,不用在命令行之间来回切换,非常容易出错。一个常见的场景是爬虫工程师在最初的技术选型中使用了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自今年3月上线以来,深受爬虫爱好者和开发者的好评。不少用户也表示会使用Crawlab搭建公司的爬虫平台。经过几个月的迭代,Crawlab先后推出了定时任务、数据分析、网站信息、可配置爬虫、自动字段提取、下载结果、上传爬虫等功能,使平台更加实用和全面,可以真正帮助用户解决爬虫管理的难题。现在 Github 上有近 1k 的明星相关社区,四分之一的用户表示已经将 Crawlab 应用到企业爬虫管理中。可见Crawlab受到开发者的关注和喜爱。
解决这个问题
Crawlab主要解决大量爬虫管理困难的问题,比如需要监控数百个网站混合的scrapy和selenium项目。同时不容易管理,命令行管理成本很高,容易出错。Crawlab 支持任意语言、任意框架的任务调度和任务监控,轻松有效监控和管理大型爬虫项目。
接口和使用
下面是 Crawlab 爬虫列表页面的截图。
Crawlab爬虫列表
用户只需要将爬虫上传到Crawlab配置执行命令,点击“运行”按钮即可执行爬虫任务。爬虫任务可以在任何节点上运行。从上图可以看出,Crawlab有节点管理、爬虫管理、任务管理、定时任务、用户管理等模块。
整体结构
以下是Crawlab的整体架构图,由五部分组成:
1.Master Node:负责任务调度、API、爬虫部署等;
2.Worker Node:负责执行爬虫任务;
3.MongoDB数据库:存储节点、爬虫、任务等日常运行数据;
4.Redis数据库:存储任务消息队列、节点心跳等信息。
5.前端客户端:Vue应用负责前端交互,向后端请求数据。
Github地址和Demo
查看演示 DemoGithub:
使用 Docker 部署安装 CrawlabDocker 映像
Docker 是部署 Crawlab 最方便、最简洁的方式。其他部署方式包括直接部署,但不推荐给想要快速搭建平台的开发者。Crawlab 已经在 Dockerhub 上注册了相关镜像。开发者只需执行 docker pull tikazyq/crawlab 命令即可下载 Crawlab 镜像。
读者可以去Dockerhub看看,Crawlab的镜像只有不到300Mb。地址:
Dockerhub 页面
安装 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 Compose 启动 Crawlab 及其依赖的数据库 MongoDB 和 Redis。首先我们需要修改Docker Compose的yaml配置文件docker-compose.yml。该配置文件定义了需要启动的容器服务和网络配置。这里我们使用 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。很多新手用户因为变量配置不正确而无法登录。在大多数情况下,您不需要进行任何配置更改。请参阅常见问题解答和详细的环境变量配置文档,以帮助根据您的环境配置 Crawlab。
然后运行以下命令启动 Crawlab。您可以添加 -d 参数以使 Docker Compose 在后台运行。
docker-compose up
运行上述命令后,Docker Compose 将拉取 MongoDB 和 Redis 映像,这可能需要几分钟时间。拉取完成后,四个服务会依次启动。您将在命令行上看到以下内容。
码头工人撰写
正常情况下应该可以看到四个服务全部启动成功,并且可以顺利打印日志。
如果在本地机器上启动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(可以另写一篇文章文章详细介绍,有兴趣的可以付费注意力)。如果您感到困惑,请查看相关文档以了解如何使用它。
如何将 Scrapy 等爬虫集成到 Crawlab 中
众所周知,Scrapy 是一个非常流行的爬虫框架。其灵活的框架设计、高并发、易用性和可扩展性已被众多开发者和企业广泛采用。市面上几乎所有爬虫管理平台都支持Scrapy爬虫Crawlab也不例外,但Crawlab可以运行puppeteer、selenium等其他爬虫。下面将介绍如何在Crawlab中运行scrapy爬虫。
Crawlab是执行爬虫的基本原理
Crawlab的爬虫原理很简单。它实际上是一个 shell 命令。用户在爬虫中输入shell命令执行爬虫,比如scrapy crawl some_spiderCrawlab执行器会读取这个命令,直接在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 字段,确保可以赋值(这个很重要)。
上传并配置爬虫
在运行爬虫之前,您需要将爬虫文件上传到主节点。进行如下操作:
1.将爬虫文件打包成zip(请确保直接打包在根目录下);
2.点击侧边栏的“爬虫”导航到爬虫列表,点击“添加爬虫”按钮选择“自定义爬虫”;
3.点击“上传”按钮选择刚刚打包好的zip文件
4.上传成功后,新添加的自定义爬虫会出现在爬虫列表中,所以上传成功。
您可以点击爬虫详情中的“文件”选项卡选择一个文件来编辑文件中的代码。
接下来,需要在“概览”选项卡的“执行命令”栏中输入爬虫的shell执行命令。Crawlab的Docker镜像内置了scrapy,可以直接运行scrapy爬虫。命令是scrapy crawl。点击“保存”按钮保存爬虫配置。
运行爬虫任务
然后是时候运行爬虫任务了。其实很简单,点击“概览”选项卡中的“运行”按钮即可启动爬虫任务。如果日志提示找不到scrapy命令,可以将scrapy改成绝对路径/usr/local/bin/scrapy,运行成功。
任务的运行状态会显示在“任务”页面或爬虫的“概览”中,每5秒更新一次。你可以在这里查看。并且在爬虫“结果”选项卡中,您可以预览结果的详细信息并将数据导出到 CSV 文件。
构建持续集成 (CI) 工作流
软件开发通常是企业的自动化过程。它将经历需求、开发、部署、测试和启动的步骤。而且这个过程一般是迭代的,需要不断的更新和发布。
以爬虫为例。您已经启动了一个爬虫。此爬虫将定期获取 网站 数据。但突然有一天,你发现无法捕获数据。你快速定位原因,发现网站版本已经修改。你需要改变爬虫的爬取规则来应对网站的修改。无论如何,您需要发布代码更新。最快的做法是直接在线更改代码。但这很危险:第一,不能测试自己更新的代码,只能通过不断调整在线代码来测试爬取是否成功;其次,如果出现问题,您以后无法记录更改,您很可能会忽略它。此更改导致了错误。您需要做的就是使用版本管理工具来管理您的爬虫代码。
当我们更新代码时,我们需要将更新后的代码发布到在线服务器。这时候就需要自己编写部署脚本或者更方便的使用Jenkins作为持续集成管理平台。Jenkins 是一个持续集成平台,可以通过获取存储库来更新部署代码。它是一个非常实用的工具,被许多企业使用。下图是如何将 Crawlab 爬虫应用于持续集成工作流的示例。
词
在 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主节点会将爬虫代码同步到worker节点进行爬取。
总结
本篇文章主要介绍爬虫管理平台的定义,如何选择爬虫管理平台,重点介绍如何搭建开源的爬虫管理平台Crawlab。它还讨论了如何集成scrapy爬虫以及如何创建持续集成工作流。这篇文章文章并没有涉及很多内容,包括如何Crawlab的原理和架构细节,如何使用Crawlab,如何编写大型爬虫,如何使用Jenkins等等。这些内容可能会在其他文章上发表,感兴趣的读者请留意。此外,Crawlab 还有一些需要改进的地方,比如异常监控(零值、空值)、可配置爬虫、可视化爬取、集中日志采集等。
相关文章