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

While循环在分页按钮禁用后未终止,重复爬取同一页面问题

解决Selenium分页爬取时禁用按钮无法退出循环的问题

问题根源分析

  1. 表格元素未刷新:原代码中row_group在循环外初始化,页面切换后仍引用旧页面的表格元素,导致每次循环都重复爬取同一页内容。
  2. 分页按钮判断逻辑错误:禁用状态下的分页按钮依然存在,presence_of_element_located会成功找到元素,但点击无效且不会触发异常,循环持续执行。
  3. 异常处理冗余:异常分支里的等待操作没必要,且未正确判断按钮的禁用状态。

修改后的代码

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import csv
import time

with open('testfile.csv', 'w', newline='') as csvfile:
    wr = csv.writer(csvfile, delimiter=',', skipinitialspace=True)
    wr.writerow(header)
    while True:
        # 每次循环重新定位当前页面的表格tbody,确保获取最新内容
        row_group = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
            (By.XPATH, '//*[@id="mainPanel"]/div/div/div[2]/div[1]/div[2]/div/div/div[3]/div/div/div/div/div[2]/table/tbody')))
        
        # 爬取当前页面所有行数据
        for row in row_group.find_elements(By.CSS_SELECTOR, 'tr'):
            wr.writerow([d.text for d in row.find_elements(By.CSS_SELECTOR, 'td')])
            time.sleep(1)  # 非必需,可根据页面实际情况移除或替换为显式等待
        
        print(f"当前页处理完成")
        
        try:
            # 等待下一页按钮可点击,超时则说明按钮已禁用
            next_link = WebDriverWait(driver, 5).until(
                EC.element_to_be_clickable((By.CLASS_NAME, "ant-pagination-next")))
            next_link.click()
            # 等待旧表格元素失效,确保新页面加载完成(替代固定sleep)
            WebDriverWait(driver, 10).until(EC.staleness_of(row_group))
        except:
            print('没有更多页面了')
            break

关键修改点说明

  • 表格元素循环内获取:将row_group的定位移到while循环内部,每次页面切换后重新获取当前页的表格,避免引用旧元素。
  • 用可点击状态判断分页按钮:EC.element_to_be_clickable会等待按钮处于可点击状态,若按钮禁用(不可点击)则触发超时异常,直接进入退出逻辑。
  • 替换固定sleep为显式等待:用EC.staleness_of(row_group)等待旧表格元素失效,确保新页面加载完成,提升代码稳定性。
  • 简化异常处理:移除冗余的等待操作,捕获超时异常后直接退出循环。

额外优化方案(可选)

可以直接检查按钮的类属性判断是否禁用,避免依赖异常处理:

next_link = driver.find_element(By.CLASS_NAME, "ant-pagination-next")
if "ant-pagination-disabled" in next_link.get_attribute("class"):
    print('没有更多页面了')
    break
else:
    next_link.click()
    WebDriverWait(driver, 10).until(EC.staleness_of(row_group))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:50:45