Scrapy多页面数据合并异常:无法获取usage值,请求对象错误赋值
Scrapy多页面数据抓取问题:usage字段显示Request对象&多页面数据合并方案
问题原因
你在代码里犯了两个关键错误:
- 首先你已经通过
response.xpath("sompath").get().strip()正确获取了usage值,但紧接着又把scrapy.Request对象赋值给了item['usage'],直接覆盖了之前的正确结果,所以控制台输出的是Request对象的字符串形式<GET ...>。 - 其次
parse_storage函数直接返回字符串,但Scrapy无法自动将这个字符串关联到之前的Item上,而且你也没有把已填充部分字段的Item传递到这个回调函数中。
解决方法
要实现多页面数据合并到同一个Item,核心逻辑是把已填充部分字段的Item通过Request的meta参数传递给下一个回调函数,在后续回调里继续填充剩余字段,最后统一输出完整的Item。
修改后的代码示例:
def parse_item(self, response): links = response.xpath('somepath') for link in links: name = link.xpath('text()').get() href = 'mydomain' + link.xpath('@href').get() # 把title传递给下一个回调 yield scrapy.Request(href, callback=self.parse_info, meta={"title": name}) def parse_info(self, response): item = MyItem() item["title"] = response.request.meta['title'] # 正确获取usage,不再被覆盖 item['usage'] = response.xpath("sompath").get().strip() storagelink = response.xpath("somepath/@href").get() # 把已填充部分字段的item放到meta里,传递给parse_storage yield scrapy.Request(storagelink, callback=self.parse_storage, meta={"item": item}) def parse_storage(self, response): # 从meta里取出之前的item item = response.request.meta['item'] # 填充storage字段 item['storage'] = response.xpath("somepath/text()").get().strip() # 返回完整的item yield item
关键改动说明
- 取消了对
item['usage']的重复赋值,确保该字段存储的是页面抓取到的文本值。 - 在
parse_info中不再直接返回Item,而是将已填充部分字段的Item存入meta,通过yield scrapy.Request传递给parse_storage。 - 在
parse_storage中取出传递过来的Item,填充storage字段后,再输出完整的Item。
内容的提问来源于stack exchange,提问作者user2155362
相关产品推荐
相关产品推荐

