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

Selenium点击加载按钮失效,无法加载网站全部评论求助

问题解答

是的,这个TimeoutException确实意味着要么找不到加载更多评论的按钮,要么按钮存在但在设定的20秒超时时间内无法变为可点击状态。

你的代码存在的核心问题

  • 绝对XPATH不可靠:你使用的/html/body/div[3]/div/div[1]/main/div/div[2]/div[2]/div[3]/div[3]/div[51]/div/button是绝对路径,页面结构(比如广告、动态元素加载)稍有变化就会定位失败。
  • 异常捕获错误:代码里捕获的是TimeoutError,但Selenium抛出的是selenium.common.exceptions.TimeoutException,导致异常无法被正确捕获,循环直接报错中断。
  • 无头模式缺少窗口尺寸设置:无头模式下默认窗口尺寸很小,可能导致加载按钮不在可视区域内,无法被点击。
  • 无加载等待逻辑:点击加载按钮后,没有等待新评论加载完成就立刻尝试下一次点击,可能导致重复操作或提前终止。

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time

def scrape_comments(url):
    # 设置Chrome选项
    chrome_options = Options()
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument('disable-infobars')
    chrome_options.add_argument("--block-notifications")
    chrome_options.add_argument("--headless=new")  # 使用新版无头模式,更稳定
    chrome_options.add_argument("--window-size=1920,1080")  # 设置无头模式窗口尺寸
    
    driver = webdriver.Chrome(options=chrome_options)
    wait = WebDriverWait(driver, 10)
    comments = []
    
    try:
        driver.get(url)
        # 等待页面核心评论元素加载完成
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".wpd-comment-text")))
        
        while True:
            try:
                # 改用相对定位,通过按钮文本定位加载更多按钮
                load_more_btn = wait.until(
                    EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Load More Comments')]"))
                )
                load_more_btn.click()
                print("已点击加载更多")
                # 等待新评论加载完成,简单延迟+元素存在校验
                time.sleep(1)
                wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".wpd-comment-text")))
            except TimeoutException:
                print("没有更多评论可加载")
                break
        
        # 解析并提取评论文本
        soup = BeautifulSoup(driver.page_source, "html.parser")
        comment_elements = soup.select(".wpd-comment-text")
        comments = [elem.get_text(strip=True) for elem in comment_elements]
        
        return comments
    finally:
        driver.quit()

# 调用示例
url = "https://www.rok.guide/buildings/lyceum-of-wisdom/"
print(scrape_comments(url))

关键修改说明

  1. 改用相对定位:通过按钮文本contains(text(), 'Load More Comments')定位,比绝对路径更适配页面动态变化。
  2. 修正异常捕获:捕获TimeoutException而非TimeoutError,确保正确处理加载超时场景。
  3. 优化无头模式:使用新版--headless=new并设置窗口尺寸,避免因窗口过小导致元素不可见。
  4. 添加加载等待:点击后增加延迟和元素校验,确保新评论加载完成后再进行下一次操作。
  5. 补充评论解析:原代码未实现评论提取逻辑,新增BeautifulSoup解析步骤,直接返回提取后的评论内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:03:09