Python中Scrapy框架使用yield无法获取返回内容的问题如何解决?

未满 30 天不能发代码片段吗?,,, 我只能把代码丢到开源中国了.麻烦大佬看一下 困扰一天了,我用 postman 可以返回结果 oschina .net/question/4096170_2306688


Python中Scrapy框架使用yield无法获取返回内容的问题如何解决?
7 回复

好像还不能发链接…所以我拆开了


这个问题很常见,核心在于理解Scrapy的异步机制。yield在Scrapy里不是直接“返回”给你数据,而是把请求或数据对象“发送”给引擎去调度处理。你不能像调用普通函数那样用变量去接yield的值。

直接原因:你在Spider的解析函数(比如parse)里yield了一个RequestItem后,这个函数就暂停了,控制权交回给Scrapy引擎。引擎去执行请求、调用回调,最终数据会通过Item PipelineFeed exports输出,而不是返回到你调用yield的那行代码后面。

解决方案:你不需要“获取”yield的返回内容。Scrapy的设计模式就是基于生成器的数据流。正确的做法是让数据在整个框架里流动起来。

正确代码模式示例

import scrapy

class MySpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://example.com']

    def parse(self, response):
        # 1. 直接yield Item,数据会进入pipeline
        yield {
            'title': response.css('h1::text').get(),
            'url': response.url
        }

        # 2. 如果要跟进链接,yield Request,并指定回调函数
        next_page = response.css('a.next::attr(href)').get()
        if next_page:
            # 注意:这里yield的是Request对象,它的“结果”会在`parse_next_page`函数中被处理
            yield scrapy.Request(response.urljoin(next_page), callback=self.parse_next_page)

    def parse_next_page(self, response):
        # 在这里处理新页面的数据,同样通过yield输出
        yield {'data': response.css('p::text').get()}

关键点

  • 数据输出:所有你想保存的数据,都用yield抛出一个字典或Item对象。它们会被引擎捕获,按settings.py中配置的Pipeline和Feed设置进行处理(比如保存到JSON文件、数据库)。
  • 请求链:通过yield Request并设置callback来定义页面抓取的流程和数据处理的路径。

检查步骤

  1. 确保你的Spider类继承自scrapy.Spider
  2. 确保你yield的是可被引擎处理的对象(Request, dict, Item等)。
  3. settings.py中正确配置了ITEM_PIPELINESFEED_URI来导出数据(例如:FEED_URI='output.json')。
  4. 运行爬虫时使用scrapy crawl <spider_name>命令,而不是直接运行Python脚本。

总结:别想着去接住yield,配置好Pipeline和输出,让框架处理数据流。

oschina 后面去掉空格

start_request 里面的请求那步卡住了?抓包看下,写法没问题

UserNameInput 和 PasswordInput 需要加密以后的值,不能是 xx

因为不能暴露我自己的信息,所以我用 xx 代替了…

解决了,在下载器中间 process_request 方法里面,我 return request, 不做任何处理就没有问题

回到顶部