如何使用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
相关产品推荐
相关产品推荐

