如何循环遍历查询并分页获取结果?分页爬取循环逻辑异常问题排查
解决多查询爬虫分页循环的问题
看起来你遇到的问题是循环逻辑没理清楚——你的代码在处理完一个查询的停止条件后,只是重置了n但没跳出当前查询的while循环,所以一直在重复同一个查询。我来帮你拆解问题,再给出修正后的方案:
问题根源分析
你的代码有两个核心问题:
n变量是在所有查询循环外初始化的,而且处理完一个查询的停止条件时,只是把n重置为1并continue回到while循环开头,这会让程序继续用当前的query重复执行分页请求,而不是切换到下一个查询。continue语句的作用是跳过当前循环的剩余代码、回到循环开头,但你需要的是退出当前查询的while循环,去执行下一个查询。
修正后的代码
把n的初始化放到每个查询的循环内部,同时把continue改成break,让程序在达到停止条件时跳出当前查询的分页循环:
for query in queries: n = 1 # 每个查询单独初始化起始结果编号,避免查询间相互干扰 while n < 580: url = urlbase + query + period + str(n) print(url) r = requests.get(url) html = parser.fromstring(r.text) print(html) if n > 575: # 达到停止条件,跳出当前查询的while循环,进入下一个query break else: n += 25 # 跳转到下一页的起始编号
额外优化建议
- 把停止阈值和最大页码定义成常量,后续维护起来更方便:
MAX_PAGE_NUM = 580 STOP_THRESHOLD = 575 for query in queries: n = 1 while n < MAX_PAGE_NUM: # ... 其他代码 ... if n > STOP_THRESHOLD: break n +=25 - 给请求部分加上异常处理,避免网络请求失败导致程序崩溃:
try: r = requests.get(url) r.raise_for_status() # 如果请求返回错误状态码,抛出异常 html = parser.fromstring(r.text) print(html) except requests.exceptions.RequestException as e: print(f"请求{url}失败: {e}") # 可以选择跳过当前页或者退出循环,根据需求调整 continue
内容的提问来源于stack exchange,提问作者Marcelo Soares
相关产品推荐
相关产品推荐

