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

如何使用Scrapy抓取同一商品多页面并整合子项数据

问题:抓取商品多页面数据时合并子组件为单条数据

想要抓取同一商品的多页面数据,但每次执行yield时,返回的是增量的商品列表,而非同一商品下的所有子项集合。

原代码

class GdSpider(scrapy.Spider):
    name = 'pcs'
    start_urls = [...]

    def parse(self, response):
        PC= dict()
        PC['Name'] = response.css('h2::text').get()
        components_urls = response.css('a::attr(href)').get()
        components = []
        for url in components_urls:
            req = yield scrapy.Request(response.urljoin(url), self.parse_component)
            components.append(parse_component(req))
        PC['components'] = components
        yield PC

    def parse_component(self, response):
        component_name = response.css('h1::text')
        component_tag = response.css('div[class="tag"]::text').get()
        yield {"component_name": component_name, "component_tag": component_tag}     

期望输出

{"Name": "HP 15", "components": [.....]}

实际输出

{"Name": "HP 15", "components":  [<generator object GdSpider.parse_part_component at 0x000001B8A7405230>]

{component1}
{component2}

请问如何借助@inline-requests装饰器实现返回包含所有子组件的单条商品数据?


解决方案:使用@inline-requests装饰器合并子请求结果

首先安装scrapy-inline-requests扩展:

pip install scrapy-inline-requests

修改后的代码如下:

from scrapy import Spider
from scrapy_inline_requests import inline_requests

class GdSpider(Spider):
    name = 'pcs'
    start_urls = [...]

    @inline_requests
    def parse(self, response):
        PC = {}
        PC['Name'] = response.css('h2::text').get()
        # 改用getall()获取所有组件链接,原get()仅返回第一个
        components_urls = response.css('a::attr(href)').getall()
        components = []
        
        for url in components_urls:
            # 直接发起请求并获取响应,无需回调函数
            component_resp = yield scrapy.Request(response.urljoin(url))
            # 解析组件数据
            component_name = component_resp.css('h1::text').get()
            component_tag = component_resp.css('div[class="tag"]::text').get()
            components.append({
                "component_name": component_name,
                "component_tag": component_tag
            })
        
        PC['components'] = components
        yield PC

关键修改点

  • 添加@inline-requests装饰器:让parse方法可以同步处理子请求,避免回调函数导致的数据分散输出。
  • 修正链接获取方式:用getall()替代get(),确保拿到所有组件的URL。
  • 移除独立的parse_component方法:直接在parse方法内解析子请求的响应,将结果存入列表,最后统一组装成完整的商品数据再yield。

这样就能得到包含所有子组件的单条商品数据,符合期望格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:55:49