Selenium爬虫分页操作触发ReadTimeoutError,请求修正分页代码
Selenium爬虫分页操作触发ReadTimeoutError,请求修正分页代码
看起来你的分页逻辑里有几个关键问题导致了超时和不稳定,我帮你梳理并修正一下:
问题分析
- 硬编码的元素定位:你注释里提到r是动态的页码按钮索引,但代码里却写死了
li[4],这会导致每次都点击同一个按钮,页面没有实际翻页,后续操作等待超时。 - 重复冗余的代码:主逻辑和异常处理里的分页代码几乎完全重复,既难维护又容易出错。
- 低效的固定等待:
time.sleep(30)这种超长固定等待不仅浪费时间,还不能保证元素状态就绪,应该用Selenium的显式等待来替代。 - 不完整的异常处理:仅捕获
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,提问作者손승운
相关产品推荐
相关产品推荐

