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

