You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy技术咨询:如何让parse2向parse1返回函数执行结果

解决Scrapy中parse1获取parse2返回值的问题

嘿,我来帮你搞定这个问题!你现在遇到的核心问题是Scrapy的请求是异步的,直接用scrapy.Request没法立刻拿到parse2的返回值——你拿到的res只是个请求对象,不是parse2处理后的结果。下面给你两种实用的解决办法:

方法一:用cb_kwargs传递上下文(推荐,Scrapy 2.0+支持)

这种方式清晰直观,把parse1里需要传递的信息(比如原url、其他字段)通过cb_kwargs传给parse2,然后在parse2里把处理后的数据和这些上下文一起返回,这样最终的输出就包含了parse1和parse2的所有信息。

修改后的代码示例:

def parse1(self, response):
    for lst in response.css("tr.lst-rw"):
        url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first()
        if url is not None:
            full_url = response.urljoin(url)
            # 通过cb_kwargs传递原url给parse2
            yield scrapy.Request(
                full_url,
                callback=self.parse2,
                cb_kwargs={"original_url": full_url}
            )

def parse2(self, response, original_url):
    # 提取parse2需要的内容
    parsed_content = response.css('你需要的选择器').extract_first()
    # 返回包含原url和parse2结果的字典
    yield {
        'original_url': original_url,
        'parse2_content': parsed_content
    }

方法二:用meta传递数据(兼容旧版Scrapy)

如果你的Scrapy版本比较老,不支持cb_kwargs,可以用meta字段来传递数据,原理和上面一样:

def parse1(self, response):
    for lst in response.css("tr.lst-rw"):
        url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first()
        if url is not None:
            full_url = response.urljoin(url)
            yield scrapy.Request(
                full_url,
                callback=self.parse2,
                meta={"original_url": full_url}
            )

def parse2(self, response):
    # 从meta里取出传递的原url
    original_url = response.meta.get('original_url')
    parsed_content = response.css('你需要的选择器').extract_first()
    yield {
        'original_url': original_url,
        'parse2_content': parsed_content
    }

特殊需求:在parse1中直接收集parse2的结果

如果你的需求是让parse1等待并收集所有parse2的结果(比如要聚合数据),可以用异步函数结合await,但这种方式会同步处理请求,降低爬取效率,谨慎使用:

async def parse1(self, response):
    all_results = []
    for lst in response.css("tr.lst-rw"):
        url = lst.css('td[headers="lh_id"] > a::attr(href)').extract_first()
        if url is not None:
            full_url = response.urljoin(url)
            # 异步获取response
            res = await self.fetch(full_url)
            # 调用parse2处理并获取结果
            parse2_result = next(self.parse2(res))
            all_results.append(parse2_result)
    # 输出聚合后的结果
    yield {'all_parsed_results': all_results}

通常第一种方法是最优解,既保留了Scrapy的异步效率,又能把parse1和parse2的数据完美关联起来。

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:57:35