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

Scrapy分页出现KeyError问题的排查与解决问询

解决Scrapy分页爬取时的KeyError问题

嘿,我来帮你拆解这个问题——你遇到的KeyError: 'item'根源很明确:分页请求没有传递初始请求里的item数据!

问题原因分析

你在start_requests里发起初始请求时,特意把item存入了request.meta,所以第一次调用parse函数时,能顺利拿到response.meta['item']。但当你发起分页的scrapy.Request时,只传了URL和回调函数,完全没把当前正在收集数据的item传递过去。这样当parse处理分页页面的响应时,response.meta里根本找不到item这个键,直接触发了KeyError。

另外还有个隐藏坑:你现在的代码每次进入parse都执行item['results'] = [],就算解决了KeyError,最后也只能保留最后一页的数据——因为每次都会清空之前的结果列表!

解决方案

我们需要做两处修改:

  1. 发起分页请求时,把当前的item传入新请求的meta中
  2. 只在第一次处理初始页面时初始化results列表,分页页面直接追加数据

修改后的parse函数代码如下:

def parse(self, response):
    # 从meta获取item:初始请求拿的是start_requests里的item,分页请求拿的是上一页传递的item
    item = response.meta['item']
    
    # 仅当results不存在时初始化,避免清空已收集的数据
    if 'results' not in item:
        item['results'] = []
    
    for caritem in response.css("div.adCardOuter_d2sn17 > div[itemprop='item']"):
        data = AnnonceItem()
        # 提取车型数据,extract_first()本身会在无匹配时返回None
        data["model"] = caritem.css("h2.title_16j3u81 > div::text").extract_first()
        item['results'].append(data)
    
    # 处理分页逻辑
    next_page = response.css(
        'a.link_huvdae-o_O-linkPrevNext_1v3fox8::attr(href)').extract_first()
    if next_page is not None:
        url_pagination = 'https://www.url.com' + next_page
        # 关键:将当前item传入分页请求的meta中
        yield scrapy.Request(url=url_pagination, callback=self.parse, meta={'item': item})
    
    # 仅在爬完最后一页时,输出完整的结果item
    if not next_page:
        yield item

额外优化说明

  • extract_first()方法在没有匹配到内容时会自动返回None,所以你原来的if len(data["model"]) == 0:判断可以直接省略,简化代码。
  • 调整yield item的时机:放到if not next_page:分支里,只会在爬完所有分页后输出完整的结果;如果需要每爬完一页就输出一次中间结果,也可以把yield item移到分页逻辑之前。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:34:37