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

从DataFrame读取链接用Selenium爬取谷歌评论报stale element reference错误如何解决

错误原因

这个StaleElementReferenceException是Selenium的常见异常,触发原因是你之前定位存储的all_reviews[-1]元素已经和当前页面DOM节点解绑,旧的元素引用彻底失效。
你单链接测试能正常运行是因为没有页面跳转操作,元素引用全程有效;加入多链接循环后,要么是上一个餐厅页面的旧元素缓存没有清空,要么是滚动时评论列表局部刷新导致旧的评论元素引用失效,就触发了报错。

修复方案

你可以按照以下步骤修改代码:

  • 修正变量重名问题:外层定义的i=0和iterrows的循环变量i重名会导致变量污染,修改外层循环逻辑:
# 去掉没用的i=0声明
driver = webdriver.Chrome()
# 重命名循环变量避免冲突
for rest_index, row in link_df.iterrows():
    base_url = row['Link']
    # 后续原有逻辑不变
  • 重构滚动加载逻辑,每次滚动前重新获取最新的评论列表,不要用旧的元素引用,同时修改错误的计数逻辑(你原代码手动给total_reviews +=1,但实际每次滚动可能加载多条评论,会导致计数不准):
    将原有的while循环替换为以下代码:
while len(all_reviews) < num_reviews:
    try:
        # 每次滚动前重新获取最新评论列表,避免旧元素失效
        all_reviews = WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.gws-localreviews__google-review')))
        driver.execute_script('arguments[0].scrollIntoView(true);', all_reviews[-1])
        # 等待加载动画消失
        WebDriverWait(driver, 5, 0.25).until_not(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[class$="activityIndicator"]')))
        time.sleep(2)
        # 更新评论列表长度
        all_reviews = WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.gws-localreviews__google-review')))
        print(f"已加载评论数:{len(all_reviews)},总评论数:{num_reviews}")
    except StaleElementReferenceException:
        # 遇到陈旧元素异常直接重试即可
        continue
  • 修复跳转链接的拼写错误,你原代码的driver.get('https:ww.google.com')缺少字符,改为driver.get('https://www.google.com'),每次跳转前清空旧元素缓存:
# 保存完csv后加一行清空旧元素
all_reviews = []
driver.get('https://www.google.com')
time.sleep(3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:04