Scrapy通过Request的meta传last_page时分页循环出现KeyError如何解决
问题根因
构造分页请求时未将last_page参数传入meta中,导致回调parse_start方法时,无法从response的meta读取到对应值。首次请求能正常运行,是因为触发首次parse_start的初始请求已经携带了last_page的meta,后续分页请求没有传递该参数,导致值丢失。
解决方案
方案1:分页请求时保持传递meta参数
只需要在构造分页的scrapy.Request时,将last_page写入meta即可,同时建议用get方法读取meta避免直接触发KeyError,修改后代码如下:
def parse_start(self, response): last_page = response.meta.get('last_page') if not last_page: # 可根据实际业务逻辑补充异常处理/默认值 return dress_links = response.xpath('//p[@class="brand"]/a/@href').getall() for dress_link in dress_links: link_item = 'https://www.modanisa.com/en' + dress_link yield scrapy.Request( url = link_item, callback=self.parse_clothing, meta={'link_item' : link_item}) for idx_next in range(2, last_page+1): url_next = 'https://www.modanisa.com/en/dresses-en.list' + f'?page={idx_next}' yield scrapy.Request( url = url_next, callback = self.parse_start, # 新增这行传递last_page参数 meta={'last_page': last_page} )
方案2:将last_page存为爬虫实例属性(更适合全局固定值场景)
如果last_page在整个爬取过程中是恒定值,可以在第一次拿到该值时赋值给爬虫实例的属性,后续直接调用属性即可,不需要反复传递meta:
def parse_start(self, response): # 首次请求时从meta读取并存为实例属性 if not hasattr(self, 'last_page'): self.last_page = response.meta.get('last_page') if not self.last_page: return # 后续直接读取实例属性,不依赖meta传递 last_page = self.last_page dress_links = response.xpath('//p[@class="brand"]/a/@href').getall() for dress_link in dress_links: link_item = 'https://www.modanisa.com/en' + dress_link yield scrapy.Request( url = link_item, callback=self.parse_clothing, meta={'link_item' : link_item}) for idx_next in range(2, last_page+1): url_next = 'https://www.modanisa.com/en/dresses-en.list' + f'?page={idx_next}' yield scrapy.Request( url = url_next, callback = self.parse_start # 不需要再传递last_page的meta )
内容的提问来源于stack exchange,提问作者chaim18
相关产品推荐
相关产品推荐

