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

Selenium爬虫分页操作触发ReadTimeoutError,请求修正分页代码

Selenium爬虫分页操作触发ReadTimeoutError,请求修正分页代码

看起来你的分页逻辑里有几个关键问题导致了超时和不稳定,我帮你梳理并修正一下:

问题分析

  1. 硬编码的元素定位:你注释里提到r是动态的页码按钮索引,但代码里却写死了li[4],这会导致每次都点击同一个按钮,页面没有实际翻页,后续操作等待超时。
  2. 重复冗余的代码:主逻辑和异常处理里的分页代码几乎完全重复,既难维护又容易出错。
  3. 低效的固定等待:time.sleep(30)这种超长固定等待不仅浪费时间,还不能保证元素状态就绪,应该用Selenium的显式等待来替代。
  4. 不完整的异常处理:仅捕获NoSuchElementException不够,点击操作还可能遇到元素不可点击、超时等问题,且异常分支里的逻辑可能再次触发相同错误。

修正后的代码

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import (
    NoSuchElementException, ElementClickInterceptedException, TimeoutException
)

# 把分页逻辑抽成独立函数,避免重复代码
def navigate_to_next_page(driver, current_r):
    wait = WebDriverWait(driver, 10)  # 显式等待最长10秒,可根据页面加载速度调整
    try:
        # 动态使用current_r定位页码按钮,替代硬编码的li[4]
        if current_r < 13:
            # 等待按钮可点击后再操作
            btn_page = wait.until(
                EC.element_to_be_clickable(
                    (By.XPATH, f'//*[@id="main"]/div[2]/div[2]/div/ul/li[{current_r}]/a')
                )
            )
            btn_page.click()
            print(f"已点击第{current_r}个页码按钮")
            new_r = current_r + 1
        elif current_r == 13:
            # 点击下一页按钮(>)
            btn_page = wait.until(
                EC.element_to_be_clickable(
                    (By.XPATH, '//*[@id="main"]/div[2]/div[2]/div/ul/li[13]/a')
                )
            )
            btn_page.click()
            print("已点击下一页按钮(>)")
            new_r = 3  # 重置r为数字按钮起始索引
        
        # 等待页面内容更新,验证翻页是否生效(可根据页面实际特征调整)
        wait.until(
            EC.staleness_of(driver.find_element(By.CSS_SELECTOR, '#main div.contentsRow'))
        )
        return new_r
    except (NoSuchElementException, ElementClickInterceptedException, TimeoutException) as e:
        print(f"分页操作失败: {str(e)}")
        return None  # 返回None表示分页失败,终止循环

# 主逻辑中调用分页函数
if c == len(cnt_accident) - 1:
    new_r = navigate_to_next_page(driver, r)
    if new_r is not None:
        r = new_r
        time.sleep(1)  # 可选短等待,避免操作过于频繁
    else:
        print("无法继续分页,终止循环")
        break

关键修改说明

  • 抽成分页函数:把重复的分页逻辑封装成独立函数,减少冗余代码,提升可维护性。
  • 显式等待替代固定sleep:用WebDriverWait等待元素可点击、页面更新,比固定等待更可靠,能有效避免无意义的超时等待。
  • 动态元素定位:根据current_r动态生成XPATH,确保点击的是对应页码按钮,解决硬编码导致的翻页无效问题。
  • 全面异常处理:覆盖分页操作中常见的异常类型,返回明确的失败标识,避免陷入死循环。
  • 翻页验证:通过staleness_of等待页面内容更新,确保翻页操作确实生效后再继续。

备注:内容来源于stack exchange,提问作者손승운

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:09:36