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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:20:25