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

Selenium爬取Reddit时提前停止滚动问题求助

问题分析与解决

核心问题

  1. 选择器逻辑错误:你用By.ID抓取评论,但HTML规范中ID是唯一属性,能拿到19条结果说明-post-rtjson-content根本不是ID,大概率是data-id或class属性,ID选择器在这里完全不适用。
  2. 滚动对象错误:Reddit的评论加载依赖评论区专属容器的滚动,而非整个网页body,滚动body到顶/底无法触发后续评论的加载机制。
  3. 等待与终止逻辑缺陷:固定1秒等待可能不足以让评论加载完成,且一次检测到高度不变就直接终止循环,没有给加载延迟留重试空间。

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

comments = []
itemTargetCount = 30
driver = webdriver.Chrome()  # 可替换为你使用的浏览器驱动
driver.get("https://www.reddit.com/r/androidapps/comments/13xdn8m/summer_23_promo_codes/")

# 等待评论区容器加载完成
wait = WebDriverWait(driver, 10)
comment_container = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "_3sf33-9rVAO_v4y0pIW_CH")))

# 设置重试次数,避免单次加载误判
retry_limit = 3
retry_count = 0

while len(comments) < itemTargetCount and retry_count < retry_limit:
    # 滚动评论区容器到底部(触发评论加载)
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", comment_container)
    
    # 用显式等待等待新评论加载,替代固定sleep
    try:
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, "_1qeIAgB0cPwnLhDF9XSiJM")))
        time.sleep(0.5)  # 给页面渲染留缓冲时间
    except:
        pass

    # 抓取所有评论内容(用评论内容的class选择器,可通过浏览器开发者工具确认最新class)
    comment_elements = driver.find_elements(By.CLASS_NAME, "_1qeIAgB0cPwnLhDF9XSiJM")
    comments = [elem.text for elem in comment_elements]
    
    # 检查评论区容器高度是否变化,判断是否加载了新内容
    current_height = driver.execute_script("return arguments[0].scrollHeight;", comment_container)
    time.sleep(0.5)
    new_height = driver.execute_script("return arguments[0].scrollHeight;", comment_container)
    
    if current_height == new_height:
        retry_count += 1
    else:
        retry_count = 0  # 加载到新内容,重置重试计数

print(f"获取到{len(comments)}条评论")
print(comments)
driver.quit()

关键调整说明

  • 修正选择器:改用评论内容对应的class选择器(示例为_1qeIAgB0cPwnLhDF9XSiJM),可通过浏览器右键评论→检查元素确认最新的class属性。
  • 精准滚动:直接操作评论区的DOM容器滚动,确保触发Reddit的评论加载逻辑。
  • 重试机制:连续3次检测到高度不变才终止循环,避免加载延迟导致提前退出。
  • 显式等待:用WebDriverWait等待评论元素出现,比固定time.sleep更适配不同网络环境下的加载速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:28:20