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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:05