0

0

Scrapy 中如何在多个解析函数间传递变量值

聖光之護

聖光之護

发布时间:2026-01-15 19:51:05

|

975人浏览过

|

来源于php中文网

原创

Scrapy 中如何在多个解析函数间传递变量值

在 scrapy 爬虫中,局部变量无法跨回调函数访问;若需将 parse() 中生成的日期(如 scrapedate)传递至深层解析函数(如 parse_race()),应通过 spider 实例属性(self.scrapedate)实现状态共享。

Scrapy 的请求-响应流程是异步且基于回调的:parse() 生成的 Request 对象在后续被调度执行时,会调用指定的回调函数(如 parse_date),但此时原始 parse() 的局部作用域已销毁,其中定义的变量(如 scrapedate)不可访问。因此,直接在 parse_race() 中引用 scrapedate 会导致 NameError: name 'scrapedate' is not defined。

正确做法是将该值提升为 Spider 实例的属性(即 self.scrapedate),使其在整个爬虫生命周期内可被任意回调方法读取。注意:由于 Scrapy 可能并发处理多个请求,不能简单地将 self.scrapedate 作为全局共享变量使用——必须确保每个请求链携带其对应的上下文。更健壮、推荐的方式是使用 cb_kwargs(Scrapy 1.7+ 支持),将参数显式传递给回调函数:

import scrapy
from datetime import datetime, timedelta
from dogscraper.items import DogItem

racedate = '2024-01-25'
days = 2
realdate = datetime.strptime(racedate, '%Y-%m-%d').date()
scrape_list = [(realdate - timedelta(days=x)).strftime('%Y-%m-%d') for x in range(days)]

class DogspiderSpider(scrapy.Spider):
    name = "dogspider"
    allowed_domains = ["www.thedogs.com.au"]
    start_urls = ["https://www.thedogs.com.au/racing/" + racedate]

    def parse(self, response):
        for scrapedate in scrape_list:
            next_dateurl = 'https://www.thedogs.com.au/racing/' + scrapedate
            # ✅ 推荐:使用 cb_kwargs 安全传递上下文
            yield scrapy.Request(
                url=next_dateurl,
                callback=self.parse_date,
                cb_kwargs={'scrapedate': scrapedate}
            )

    def parse_date(self, response, scrapedate):  # ← 参数自动注入
        nswmeetings = response.css('table.meeting-grid')[0].css('td.meetings-venues__name')
        for meeting in nswmeetings:
            meeting_url = meeting.css('a::attr(href)').get()
            if meeting_url:
                nextmeeting = 'https://www.thedogs.com.au' + meeting_url
                yield scrapy.Request(
                    url=nextmeeting,
                    callback=self.parse_meeting,
                    cb_kwargs={'scrapedate': scrapedate}  # 向下透传
                )

    def parse_meeting(self, response, scrapedate):
        races = response.css('a.race-box.race-box--result')
        for race in races:
            race_url = race.css('::attr(href)').get()
            if race_url:
                nextrace = 'https://www.thedogs.com.au' + race_url
                yield scrapy.Request(
                    url=nextrace,
                    callback=self.parse_race,
                    cb_kwargs={'scrapedate': scrapedate}  # 持续透传
                )

    def parse_race(self, response, scrapedate):  # ← 最终接收
        dogs = response.css('tr.accordion__anchor.race-runner')
        for dog in dogs:
            dog_item = DogItem()
            dog_item['date'] = scrapedate  # ✅ 安全赋值
            # ... 其他字段提取逻辑
            yield dog_item

优势说明

AI Content Detector
AI Content Detector

Writer推出的AI内容检测工具

下载
  • cb_kwargs 是 Scrapy 原生支持的线程安全机制,避免多请求间属性覆盖风险;
  • 语义清晰,显式声明依赖,便于调试与维护;
  • 符合函数式回调设计原则,不依赖隐式状态。

⚠️ 注意事项

  • 若仍选择 self.scrapedate = ... 方式,请确保无并发请求冲突(例如禁用并发:custom_settings = {'CONCURRENT_REQUESTS': 1}),否则将导致数据错乱;
  • 所有 cb_kwargs 传入的参数必须在对应回调函数签名中声明,否则抛出 TypeError;
  • 始终校验 CSS 选择器结果(如 .get() 返回 None 时需跳过),避免 IndexError 或 AttributeError。

综上,优先使用 cb_kwargs 传递上下文变量,这是 Scrapy 官方推荐、高可靠、易扩展的最佳实践。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

522

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

262

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

753

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

539

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

757

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

604

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

560

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

389

2023.08.22

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号