博客
关于我
pyspider爬虫学习-文档翻译-Architecture.md
阅读量:798 次
发布时间:2023-03-05

本文共 1716 字,大约阅读时间需要 5 分钟。

过去两年,我在一家垂直搜索引擎工作时,面临着多项爬行需求。我们需要收集100-200个网站,这些网站可能是在线的,也可能是离线的,并且可能随时更换模板。为了有效地监控这些网站的变化,并为每个网站编写相应的脚本或模板,我们需要一个强大的监控工具。同时,我们需要在网站更新五分钟内收集到数据。传统的方法是通过频繁检查索引页面,并使用“最后更新时间”或“最后回复时间”来确定哪些页面被修改过。此外,我们还需要在X天后重新检查页面,以防止遗漏。为了应对WWW不断变化的事实,我们需要一个永不停止的系统。另外,我们有一些来自合作伙伴的API,这些API可能需要支持POST、代理、签名请求等操作。全局参数的限制让我们无法完全控制这些组件,因此我们希望通过脚本来完全控制爬行过程。

pyspider的体系结构设计初衷是为了满足以上需求。它通过消息队列连接各个组件,每个组件都可以独立运行并替换。当处理器出现性能瓶颈时,可以部署多个处理器实例,充分利用多个CPU,甚至部署到多台机器上。这种架构使pyspider成为一个非常高效的工具。

### 组件概述

Scheduler调度器接收来自处理器的新任务,并决定任务是否需要重新爬行。它会根据优先级排序任务,并将任务分配给具有流量控制功能的Fetcher。Scheduler还负责处理定期任务、遗失任务和失败任务,并能够通过API`self.crawl`来设定相关参数。目前的实现中,只允许使用一个调度器。

Fether提取者负责抓取网页内容,并将结果发送给处理器。Fetcher支持多种抓取方式,包括通过URL和JavaScript动态抓取(支持PhantomJS)。通过API,可以控制抓取的方法、头部信息、Cookie、代理服务器和ETag等参数。

PhantomJS Fetcher作为一个代理工作,连接到通用的Fetcher,通过JavaScript渲染页面,并将处理后的HTML内容返回给Fetcher。其架构如下:

scheduler -> fetcher -> processor | phantomjs | internet

Processor处理器运行用户编写的脚本,用于解析和提取信息。脚本可以在任何环境下运行,我们提供了如PyQuery等工具帮助用户提取信息和链接。Processor负责捕获异常和日志,并将状态信息(包括任务跟踪)和新任务发送给Scheduler。处理完成的结果则发送给Result Worker。

Result Worker结果工作者(可选)接收Processor的处理结果。pyspider内置了一个结果工作者,将结果保存到`resultdb`中。如果需要,可以通过自定义结果工作者来满足特定需求。

WebUI是一个强大的web前端,集成了多种功能,包括脚本编辑器、调试器、项目管理器、任务监控器和结果查看器等。通过WebUI,可以就像pyspider一样一步步调试脚本,启动或停止项目,实时监控任务状态和结果输出。

### 数据流

pyspider的数据流主要包括以下几个步骤:

  • 当用户通过WebUI点击“Run”按钮时,脚本中的on_start回调函数被提交给Scheduler作为新任务。
  • Scheduler将on_start任务与数据URI一起提交给Fetcher。
  • Fetcher根据任务请求发起抓取,并将结果返回给Processor。
  • Processor执行on_start方法,生成新的爬取URL,并将处理完成的状态和新任务通过消息队列发送给Scheduler。
  • Processor将处理结果发送给Result Worker。
  • Scheduler接收新任务,根据数据库中的记录确定任务是否为新任务或需要重新爬取。如果是新任务或需要重新爬取的任务,Scheduler会将其加入任务队列,并按照优先级进行排序。
  • 这个过程将持续进行,直到WWW停止更新为止。
  • 通过这种架构,pyspider能够在WWW不断变化的情况下,持续、快速地抓取和处理数据。它支持定期任务,确保最新数据的获取,同时也能处理遗失和失败的任务,最大限度地减少数据获取的延迟。

    转载地址:http://ecafk.baihongyu.com/

    你可能感兴趣的文章
    PyQt5 和 asyncio:从永不完成的收益
    查看>>
    PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
    查看>>
    PyQt5 按钮运行功能和更新 LCD
    查看>>
    pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
    查看>>
    pyqt5 设置控件在最上层或者在下层
    查看>>
    pyqt5 设置网格布局的间距
    查看>>
    pyTorch Hub 系列#4:PGAN — GAN 模型
    查看>>
    PyQt5-基本窗口控件-QMainWindow
    查看>>
    PyQt5:如何安装/运行 Qt 设计器
    查看>>
    PyQt5——pyqtgraph绘图大招
    查看>>
    PyQt5——多窗口之间数据处理
    查看>>
    PyQt5——多线程、信号与槽
    查看>>
    PyQt5——开发地图软件
    查看>>
    PyQt5——装饰器信号与槽
    查看>>
    PyQt5——软件密码登陆跳转主界面
    查看>>
    PyQt5——通过信号与槽进行数据传输
    查看>>
    PyQt5“定时器不能从另一个线程启动“更改 QLabel 的大小时出错
    查看>>
    pyqt5不显示窗口
    查看>>
    pyqt5任意组件的拖拽问题
    查看>>
    SpringBoot中集成MobileIMSDK并实现记录所有用户以实现消息群发
    查看>>