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,最后也只能保留最后一页的数据——因为每次都会清空之前的结果列表!
解决方案
我们需要做两处修改:
- 发起分页请求时,把当前的
item传入新请求的meta中 - 只在第一次处理初始页面时初始化
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
相关产品推荐
相关产品推荐

