使用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
相关产品推荐
相关产品推荐

