Scrapy 工作流程深度解析:引擎驱动的完美协作

一、Scrapy 核心组件全景图

引擎 Engine
调度器 Scheduler
下载器 Downloader
爬虫 Spider
管道 Pipeline

Scrapy 是一个引擎驱动的框架,所有组件都通过引擎进行通信,形成闭环的数据流系统。下面我们将详细解析每个步骤。

二、Scrapy 完整工作流程(引擎为核心)

SpiderEngineSchedulerDownloaderPipeline1. 初始化请求yield Request(url)添加请求到队列获取下一个请求返回请求对象发送请求返回Response传递Responseyield Item传递Item处理完成yield Request(new_url)添加新请求alt[解析出数据][解析出新URL]loop[循环处理]SpiderEngineSchedulerDownloaderPipeline

详细步骤解析:

  1. 爬虫发起初始请求

    class BookSpider(scrapy.Spider):name = 'book_spider'start_urls = ['http://books.com/category1']def parse(self, response):# 解析逻辑...
    
    • 爬虫定义起始URL
    • 引擎自动创建初始Request对象
  2. 引擎 → 调度器

    • 引擎接收Request
    • 将Request放入调度器的队列中
    • 调度器实现去重(相同URL只存一份)
  3. 引擎 ← 调度器

    • 引擎向调度器请求下一个要处理的Request
    • 调度器返回优先级最高的Request
  4. 引擎 → 下载器

    # 中间件处理流程
    def process_request(self, request, spider):# 添加代理/UA等request.headers['User-Agent'] = random.choice(USER_AGENTS)return request
    
    • 引擎发送Request给下载器
    • 经过下载中间件(可修改请求)
  5. 下载器 → 引擎

    • 下载器获取网页内容
    • 封装成Response对象
    • 通过引擎返回给爬虫
  6. 引擎 → 爬虫

    def parse(self, response):# 解析数据yield {'title': response.css('h1::text').get(),'price': response.css('.price::text').get()[1:]}# 提取新链接for next_page in response.css('a.next-page'):yield response.follow(next_page, self.parse)
    
    • 引擎将Response传递给爬虫
    • 爬虫解析响应内容
  7. 爬虫处理结果 → 引擎

    • 情况1:生成数据Item → 发送给管道
    • 情况2:生成新Request → 发送给调度器
  8. 引擎 → 管道

    class MongoDBPipeline:def process_item(self, item, spider):self.collection.insert_one(dict(item))return item
    
    • 引擎将Item传递给管道
    • 管道进行数据清洗、存储等操作
    • 多个管道按优先级顺序处理
  9. 循环继续

    • 引擎继续向调度器请求下一个Request
    • 直到调度器队列为空

三、引擎的核心作用详解

引擎作为中央控制器,负责:

  1. 组件协调

    • 控制所有组件间的数据流动
    • 决定请求处理的优先级顺序
  2. 事件驱动

    # 事件触发示例
    engine.signals.item_scraped.connect(item_scraped_handler)
    engine.signals.request_scheduled.connect(request_scheduled_handler)
    
  3. 流量控制

    • 通过设置控制并发数
    # settings.py
    CONCURRENT_REQUESTS = 16  # 最大并发请求数
    DOWNLOAD_DELAY = 0.5       # 请求延迟
    
  4. 错误处理

    • 捕获组件异常
    • 重试失败请求
    RETRY_TIMES = 2
    RETRY_HTTP_CODES = [500, 502, 503]
    

四、开发者关注点:爬虫与管道

爬虫开发重点

import scrapyclass NewsSpider(scrapy.Spider):name = 'news'def start_requests(self):# 自定义初始请求yield scrapy.Request('http://news.com/latest', callback=self.parse_headlines,meta={'page': 1})def parse_headlines(self, response):# 解析新闻标题for article in response.css('div.article'):yield {'title': article.css('h2::text').get(),'url': article.css('a::attr(href)').get()}# 分页处理next_page = response.css('a.next::attr(href)').get()if next_page:yield response.follow(next_page, self.parse_headlines, meta={'page': response.meta['page'] + 1})

管道开发重点

from itemadapter import ItemAdapterclass ValidationPipeline:"""数据验证管道"""def process_item(self, item, spider):adapter = ItemAdapter(item)if not adapter.get('title'):raise DropItem("缺少标题字段")if len(adapter['title']) > 200:adapter['title'] = adapter['title'][:200] + '...'return itemclass CSVExportPipeline:"""CSV导出管道"""def open_spider(self, spider):self.file = open('output.csv', 'w', encoding='utf-8')self.writer = csv.DictWriter(self.file, fieldnames=['title', 'url'])self.writer.writeheader()def close_spider(self, spider):self.file.close()def process_item(self, item, spider):self.writer.writerow(item)return item

五、实际工作流程示例:图书抓取案例

起始URL
添加请求
返回请求
发送请求
获取网页
返回响应
解析数据
数据Item
新URL
Spider
引擎
调度器
下载器
管道
  1. 爬虫定义起始URL:http://books.com/fiction
  2. 引擎将请求加入调度器队列
  3. 调度器返回请求给引擎
  4. 引擎发送请求给下载器
  5. 下载器获取HTML返回给引擎
  6. 引擎将响应传递给爬虫
  7. 爬虫解析出:
    • 10本图书数据(发送到管道)
    • 下一页链接(发送到调度器)
  8. 管道处理图书数据(存储到数据库)

六、常见误区澄清

  1. 误区:爬虫直接与下载器通信
    正确:所有通信必须通过引擎

  2. 误区:调度器只做简单排队
    正确:调度器实现复杂功能:

    • 请求去重
    • 优先级管理
    • 并发控制
  3. 误区:管道只用于数据存储
    正确:管道可执行多种操作:

    • 数据清洗
    • 去重处理
    • 格式转换
    • 数据验证

七、高级工作流程:中间件介入

请求
请求
响应
响应
引擎
下载中间件
下载器

中间件的作用点:

  1. 请求发出前:修改请求头、设置代理

    class ProxyMiddleware:def process_request(self, request, spider):request.meta['proxy'] = 'http://proxy.com:8080'
    
  2. 响应返回后:处理异常、修改响应内容

    class RetryMiddleware:def process_response(self, request, response, spider):if response.status == 503:new_request = request.copy()return new_request  # 自动重试return response
    
  3. 数据处理时:爬虫中间件可修改Item/Request

    class ItemProcessorMiddleware:def process_spider_output(self, response, result, spider):for item in result:if isinstance(item, dict):item['source'] = spider.nameyield item
    

八、最佳实践建议

  1. 保持爬虫简洁:仅关注解析逻辑

  2. 管道职责分离:每个管道只做一件事

  3. 善用中间件:处理通用逻辑

  4. 监控引擎事件:了解系统状态

    from scrapy import signalsclass StatsExtension:def __init__(self, stats):self.stats = stats@classmethoddef from_crawler(cls, crawler):ext = cls(crawler.stats)crawler.signals.connect(ext.request_scheduled, signal=signals.request_scheduled)return ext
    
  5. 合理配置设置

    # settings.py
    CONCURRENT_REQUESTS = 32  # 根据网络条件调整
    DOWNLOAD_TIMEOUT = 30     # 超时设置
    RETRY_TIMES = 2           # 失败重试
    

九、总结:Scrapy 工作流程精髓

  1. 引擎中心化:所有组件通过引擎通信
  2. 数据驱动:Request/Item 在组件间流动
  3. 闭环处理:从请求到存储的完整生命周期
  4. 可扩展架构:通过中间件灵活扩展功能

理解 Scrapy 的工作流程,关键在于把握引擎的核心调度作用组件间的数据流向。这种设计使得 Scrapy 能够高效处理大规模数据采集任务,同时保持代码的模块化和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917708.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCIe Base Specification解析(七)

文章目录3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决

Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决:遇到此种情况时:1、在“开始”右键——设置——账号——登录选项2、需要在PIN这里先进行删除此登录选项&#xff…

qq scheme

QQ intent scheme跳转 1.跳转指定说说(root) 2.跳转指定说说(非root) 3. 跳转聊天框 4. 跳转用户主页 5. 跳转加群 6. 跳转指定用户空间 1.跳转指定说说(root) 该方法需root权限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C语言基础_随机数、数组、函数、指针

0、随机数: 要用C语言产生随机数,首先在预处理程序部分要引入stdlib.h头文件,然后就可以用rand()在后续程序中生成随机数了。如果不设置随机数种子srand(),后面生成的随机数序列就是以41开头的一个固定序列,因此一般以…

PHP‑ORT扩展构建纯PHP机器学习的推荐系统

结合 PHP‑ORT 构建推荐系统的核心思想是:使用 ONNX 格式的机器学习模型,在 PHP 中本地执行推理,实时给出推荐结果。下面是一个完整的架构设计与实现路径,适合你快速上手。🎯 场景目标 你想在一个 PHP 网站中实现推荐功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目录 一、PromptPilot 二、基于产品评价的用户情感分析 2.1 使用PromptPiolt工具进行提示词生成 2.2 基于prompt的模型调试 2.3 基于prompt的批量数据测评 2.4 基于多轮对话的prompt测试 如今,我们正身处一个 AI 技术飞速迭代的时代。人工智能早已不再是实验室…

MSPM0开发学习笔记:二维云台结合openmv实现小球追踪

文章目录前言一、硬件选择二、原理介绍(UART)三、硬件连线三、软件代码1、视觉部分代码(Openart)2、控制部分代码(MSPM0)(1) UART部分(2) 计算函数部分&#…

【CTF-WEB-SQL】SQL注入基本流程(sql-labs的Less11)(用burp抓取post然后用sqlmap盲注)

题目 从第11less开始,就是POST表单了burp抓取数据包将抓取到的数据包存放到桌面,保存为post.txt数据包内容如下:POST /Less-11/ HTTP/1.1 Host: 223.112.39.132:44537 Content-Length: 39 Cache-Control: max-age0 Accept-Language: zh-CN,zh…

WPF 与 Winform :Windows 桌面开发该用谁?

WPF 与 Winform :Windows 桌面开发该用谁? 一、 WPF 与 Winform的概念 WPF:颜值与实力并存的 “后起之秀” Winform:简单直接的 “老前辈” 二、WPF 与 Winform 的核心差异 1. 设计理念:分离 vs 耦合 2. 布局系统:灵活适配 vs 固定坐标 3. 视觉效果:绚丽动画 vs 朴素原生…

【Git学习】入门与基础

目录 Git的安装 Git 配置用户信息 Git 初始化本地仓库 Git 工作区、暂存区和版本库 Git 跟踪文件 Git 修改文件 Git 删除文件 Git 撤销本地文件的修改 Git 取消暂存 Git 跳过暂存区 Git 版本回退 Git 撤销提交 Git 设置忽略文件 Git 比较文件差异 Git 代码托管平台…

idea添加gitlab访问令牌

1.按下图所示顺序操作gitlab,获取到对应的token;2.填写对应的gitlab地址和第一步获取的token

人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报

2025年5月IMYAI平台技术动态与模型更新综述 摘要: 本文整理了2025年5月期间IMYAI平台发布的主要技术更新、新模型上线信息及功能调整公告,涵盖DeepSeek、Gemini、Claude、即梦、Suno等模型动态及平台功能优化。 正文: 一、 模型更新与上线Dee…

机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利

一、机器人权利:真实还是虚幻?机器人权利的讨论源于技术进步对传统法律与伦理体系的冲击,其真实性取决于技术发展阶段与社会接受度的互动。当前,机器人权利仍呈现“虚幻与真实交织”的特征:技术基础:从工具…

通信小白产品学习碎片01

1. 云中继(Cloud Media Relay) 运营商在Volte/Vonr场景中引入的核心网关键功能,用于优化媒体流的传输路径,解决跨运营商、跨地域通信时的网络绕行问题。 传统:A终端—>A核心网—>跨网互联点—>B核心网—>…

⭐CVPR2025 3D 生成新框架|Kiss3DGen 让 2D 扩散模型玩转 3D 资产生成

⭐CVPR 3D 生成新框架|Kiss3DGen 让 2D 扩散模型玩转 3D 资产生成 📄论文题目:Kiss3DGen: Repurposing Image Diffusion Models for 3D Asset Generation ✍️作者及机构:Jiantao Lin、Xin Yang、Meixi Chen 等(HKUST …

HTTP基本结构

目录前言1. 概念2. HTTP基本格式2.1 抓包原理2.2 抓包软件使用2.3 抓包结果3. HTTP请求3.1 URL3.2 方法3.3 版本号3.4 HTTP报头3.4 正文部分4. HTTP响应4.1 HTTP状态码4.2 其他部分总结前言 本篇文章介绍HTTP的基本结构。 1. 概念 HTTP全称为超文本传输协议,是一…

CVPR优秀论文 | DashGaussian:在200秒内优化三维高斯点绘制

本文选自gongzhonghao【图灵学术SCI论文辅导】关注我们,掌握更多顶会顶刊发文资讯1.导读1.1 论文基本信息论文标题:DashGaussian: Optimizing 3D Gaussian Splatting in 200 Seconds作者:Youyu Chen、Junjun Jiang、Kui Jiang、Xiao Tang、Zh…

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 采用PyTorch 内置函数F.kl_div的实现方式

知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 采用PyTorch 内置函数F.kl_div的实现方式 flyfish kl_div 是 Kullback-Leibler Divergence的英文缩写。 其中,KL 对应提出该概念的两位学者(Kullback 和 Leibler)的姓氏首字母“div”是 div…

C语言基础_补充知识、数据类型转换、选择结构

0、补充知识: 原码、反码、补码的知识: 计算机中原码转补码,正数不变,负数是符号位不变,其余各位取反码加一。负数的补码转原码应该是补码减一然后再取反,为什么负数的补码转原码是补码取反然后再加一&…

ubuntu自动重启BUG排查指南

当 Ubuntu 系统意外重启时,排查原因需要从系统日志、硬件状态和定时任务等多个方面入手。 示例:通过日志检查重启原因 last -x | head | tac 此命令显示最近的关机和重启记录。如果记录中包含 shutdown 或 crash,则可能是人为操作或系统故障导…