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

使用Selenium进行网页爬取时无法遍历全部分页范围报TimeoutException

问题原因
  • 等待条件参数错误:代码中wait = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CLASS_NAME, elements)))这行的第二个参数传入的是第一页获取到的元素列表elements,而By.CLASS_NAME要求传入的是类名字符串,参数完全不符合要求,页面跳转后这个等待条件永远无法满足,自然触发超时。
  • 元素没有重新获取:你只在循环外获取了一次第一页的screener-link-primary元素,页面跳转后旧DOM已经销毁,之前获取的elements属于陈旧元素,既无法继续读取属性,也不能作为等待条件使用。
  • 分页按钮选择器容错性差:硬拼接href的方式很容易因为网站的href结构变化(比如参数顺序调整、额外参数插入)匹配失败,第二页能匹配不代表后续页面的href都符合你拼接的规则。
修复方案

修复后可正常运行的代码如下:

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

list_of_tickers = []
# 分页起始r值
y = 1
# 爬取总页数
max_page = 10

for x in range(max_page):
    # 每页重新等待并获取当前页的目标元素
    elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, 'screener-link-primary'))
    )
    for element in elements:
        list_of_tickers.append(element.get_attribute('text'))
    
    # 最后一页无需点击下一页
    if x == max_page - 1:
        break
    
    y += 20
    next_button_selector = f'a[href="screener.ashx?v=111&o=-marketcap&r={y}"]'
    next_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, next_button_selector))
    )
    next_button.click()
    
    # 等待旧元素失效,确认页面完成跳转
    WebDriverWait(driver, 10).until(EC.staleness_of(elements[0]))
  • 核心调整点:将元素获取逻辑移入循环内部,每页重新拉取当前页元素,避免陈旧元素问题;修正等待条件的参数错误,增加页面跳转完成的校验逻辑。
  • 可选优化:如果后续仍出现下一页匹配失败的问题,可以把下一页的选择器改为匹配按钮文本的XPath选择器(比如//a[text()="Next"]),容错性远高于硬拼href的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:54:03