Selenium爬取烂番茄影评遇stale element reference错误求助
问题原因分析
出现stale element reference错误的核心原因是:点击下一页后页面DOM会重新渲染,之前定位的元素引用会彻底失效。你的代码虽每次循环都会重新获取reviews集合,但存在两个关键问题:
- 用
lambda直接查找元素集合的方式不够可靠,未明确等待元素完全加载的条件 - 点击下一页后没有等待新页面稳定加载,就立即进入下一次循环获取元素,导致新的review元素还未挂载到DOM中
解决方法
调整代码的等待逻辑与元素定位方式,确保每次操作都基于稳定的DOM元素:
- 用
EC.presence_of_all_elements_located替代自定义lambda,明确等待所有review元素加载完成 - 点击下一页后,等待页面刷新完成(通过上一页元素失效来判断)
- 提取单个影评内容时,增加元素可见性等待,避免访问未渲染完成的元素
修改后的完整代码
from selenium.webdriver import Chrome from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import chromedriver_autoinstaller chromedriver_autoinstaller.install() TYPES = ['user', 'verified_audience', 'top_critics'] TYPE = TYPES[2] URL = 'https://www.rottentomatoes.com/m/dunkirk_2017/reviews' PAGES = 2 driver = Chrome() driver.get(URL) data_reviews = [] wait = WebDriverWait(driver, 30) while PAGES > 0: # 等待当前页所有review元素加载完成,确保稳定挂载到DOM reviews = wait.until(EC.presence_of_all_elements_located( (By.CSS_SELECTOR, '.review_table_row'))) # 提取当前页影评数据 for review in reviews: if TYPE == 'top_critics': try: # 等待单个review内的元素可见,确保可正常访问 critic_name_el = wait.until(EC.visibility_of( review.find_element(By.CSS_SELECTOR, '[data-qa=review-critic-link]'))) critic_review_text_el = wait.until(EC.visibility_of( review.find_element(By.CSS_SELECTOR, '[data-qa=review-text]'))) data_reviews.append(critic_name_el.text) except Exception as e: # 跳过获取失败的单个影评,不中断整体爬取 print(f"提取单个影评失败: {e}") continue try: # 等待下一页按钮可点击且未被禁用 next_button_el = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, '[data-qa=next-btn]:not([disabled=disabled])'))) next_button_el.click() # 等待页面刷新完成:确认上一页的第一个review元素已失效 wait.until(EC.staleness_of(reviews[0])) PAGES -= 1 except Exception as e: print(f"无法点击下一页或已到最后一页: {e}") break driver.quit() print(f"共爬取{len(data_reviews)}条影评")
关键修改点说明
- 统一使用
WebDriverWait结合expected_conditions内置方法,等待逻辑更严谨可靠 - 提取单个影评时增加
visibility_of等待,确保元素可见且可交互 - 点击下一页后用
staleness_of判断页面刷新状态,避免提前获取新页面元素 - 增加局部异常捕获,单个影评提取失败时不中断整体爬取流程
内容的提问来源于stack exchange,提问作者Lun
相关产品推荐
相关产品推荐

