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
相关产品推荐
相关产品推荐

