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

Scrapy向同一URL提交formdata递增参数循环获取结果的问题问询

问题根源

你原来的代码存在3个核心错误,导致无法实现递增参数爬取:

  • 方法缩进错误:parse和后续回调方法没有缩进在爬虫类内部,属于类外的独立函数,爬虫调度逻辑无法正常调用
  • 错误使用return返回请求:return会直接终止方法执行,导致你写的while循环仅执行1次,只能生成第一个参数的请求
  • 新增的分页逻辑无效:仅重复请求目标URL,没有携带递增后的seating_no参数,也没有维护参数递增状态,导致每次返回的都是相同结果
修复后完整代码
import scrapy

class NatigahSpider(scrapy.Spider):
    name = "natiga"
    start_urls = ["https://natega.youm7.com/Home/Result"]
    # 可自定义爬取的座位号范围
    start_seat_no = 1112346
    end_seat_no = 1112356

    def parse(self, response):
        # 遍历生成所有需要提交的座位号参数
        for seat_no in range(self.start_seat_no, self.end_seat_no + 1):
            yield scrapy.FormRequest.from_response(
                response,
                formdata={"seating_no": str(seat_no)},
                callback=self.parse_result,
                dont_filter=True
            )
          
    def parse_result(self, response):
        for product in response.css(".RightSide"):
            yield {
                "name": product.css(".full-result > ul:nth-child(1) > li:nth-child(1) > span:nth-child(2)::text").get(),
                "seat_no": product.css("li.col:nth-child(1) > h1:nth-child(2)::text").get(),
                "Percent": product.css("li.col:nth-child(3) > h1::text").get()
            }
关键修改说明
  • 修正了方法缩进,保证所有业务逻辑都属于爬虫类的成员方法
  • 抽离座位号范围为类属性,后续调整爬取范围时直接修改即可,无需改动业务逻辑
  • 用range遍历生成所有参数,替换原有嵌套循环逻辑,代码更简洁不易出错
  • 将return改为yield,可以依次生成所有参数对应的表单请求,不会提前终止方法执行
  • 移除原有的无效重复请求逻辑,避免无限爬取相同页面
  • 添加dont_filter=True参数,避免scrapy的自动去重机制过滤掉同URL不同参数的POST请求
  • 回调方法更名更贴合业务语义,可读性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:48:01