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

如何实现推特页面完整滚动加载?现有代码问题排查求助

推特评论滚动加载问题排查

我打开某条推特的URL,该推文下方有大量评论,尝试用两段Selenium代码实现滚动到底部加载所有评论,但都有问题:

  • 代码1:一次性滚动到页面底部,因滚动幅度过大导致元素找不到
  • 代码2:改成每次滚动1000像素,但仅滚动几次就停止,Python提示已滚动到底部,调整参数也无效

原代码展示

代码1

while True:
    last_height = driver.execute_script("return document.body.scrollHeight")
    driver.execute_script("window.scrollBy(0, document.body.scrollHeight);")
    time.sleep(2)
    new_height = driver.execute_script("return document.body.scrollHeight")
    try:
        elements = driver.find_elements(By.XPATH,
                                        "//a[@class='css-4rbku5 css-18t94o4 css-901oao r-14j79pv r-1loqt21 r-xoduu5 r-1q142lx r-1w6e6rj r-37j5jr r-a023e6 r-16dba41 r-9aw3ui r-rjixqe r-bcqeeo r-3s2u2q r-qvutc0']")                   
        click4 = driver.find_element(By.XPATH,
                                     "//div[@class='css-1dbjc4n r-16y2uox r-1wbh5a2 r-1777fci']")
        click4.click()
    except:
        time.sleep(0.5)
    try:
        elements = driver.find_elements(By.XPATH,
                                        "//a[@class='css-4rbku5 css-18t94o4 css-901oao r-14j79pv r-1loqt21 r-xoduu5 r-1q142lx r-1w6e6rj r-37j5jr r-a023e6 r-16dba41 r-9aw3ui r-rjixqe r-bcqeeo r-3s2u2q r-qvutc0']")
        click5 = driver.find_element(By.XPATH, "//div[@class='css-1dbjc4n r-1ndi9ce']")
        click5.click()
    except:
        time.sleep(0.5)

    if new_height == last_height:
        print("end")
        time.sleep(10)  
        break

代码2

while True:
    last_height = driver.execute_script("return document.body.scrollHeight")
    driver.execute_script("window.scrollBy(0, 1000)", "")
    time.sleep(2)
    new_height = driver.execute_script("return document.body.scrollHeight")
    try:
        elements = driver.find_elements(By.XPATH,
                                        "//a[@class='css-4rbku5 css-18t94o4 css-901oao r-14j79pv r-1loqt21 r-xoduu5 r-1q142lx r-1w6e6rj r-37j5jr r-a023e6 r-16dba41 r-9aw3ui r-rjixqe r-bcqeeo r-3s2u2q r-qvutc0']")                   
        click4 = driver.find_element(By.XPATH,
                                     "//div[@class='css-1dbjc4n r-16y2uox r-1wbh5a2 r-1777fci']")
        click4.click()
    except:
        time.sleep(0.5)
    try:
        elements = driver.find_elements(By.XPATH,
                                        "//a[@class='css-4rbku5 css-18t94o4 css-901oao r-14j79pv r-1loqt21 r-xoduu5 r-1q142lx r-1w6e6rj r-37j5jr r-a023e6 r-16dba41 r-9aw3ui r-rjixqe r-bcqeeo r-3s2u2q r-qvutc0']")
        click5 = driver.find_element(By.XPATH, "//div[@class='css-1dbjc4n r-1ndi9ce']")
        click5.click()
    except:
        time.sleep(0.5)
    if new_height == last_height:
        print("end")
        time.sleep(10)  
        break

问题原因&修正方案

核心问题分析

  1. 代码1问题:直接滚动到body的最大高度,推特评论是异步加载的,幅度过大时中间的元素还没加载就跳到底部,导致后续元素查找失败。
  2. 代码2问题:用body.scrollHeight判断是否到底部不准确——推特的评论区是独立滚动容器,不是整个页面;且单次高度对比就停止,容易误判(比如评论加载有延迟)。另外,依赖动态生成的r-xxxxxx类定位元素,很容易失效。

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("你的推特推文URL")
time.sleep(3)  # 等待页面初始加载完成

# 定位推特评论区的独立滚动容器(优先用data-testid这类稳定属性)
scroll_container = driver.find_element(By.XPATH, "//div[@data-testid='primaryColumn']")

last_height = 0
retry_count = 0
max_retries = 3  # 连续3次高度不变才算真的到底

while retry_count < max_retries:
    # 获取当前滚动容器的实际高度
    current_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container)
    # 滚动到容器底部附近,留100px触发加载(避免直接到底不触发)
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight - 100", scroll_container)
    
    time.sleep(2)  # 等待评论加载,可根据网络调整
    
    # 检查新高度
    new_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container)
    
    # 尝试点击"显示更多"按钮(用文本定位,比动态class稳定)
    try:
        show_more = driver.find_element(By.XPATH, "//div[contains(text(), '显示更多') or contains(text(), 'Show more')]")
        if show_more.is_displayed():
            show_more.click()
            time.sleep(1)
            retry_count = 0  # 点击后重置重试计数
            continue
    except:
        pass
    
    if new_height == current_height:
        retry_count += 1
        print(f"高度未变化,重试次数:{retry_count}")
    else:
        retry_count = 0
        last_height = new_height

print("已加载完所有评论或滚动到底部")
driver.quit()

额外注意事项

  • 元素定位优化:别用推特的动态r-xxxxxx类,改用data-testid或文本内容定位,比如//div[@data-testid="reply"],避免页面更新后代码失效。
  • 等待机制:尽量用WebDriverWait显式等待替代time.sleep,比如等待元素可点击时再操作,更稳定。
  • 反爬限制:推特有反爬,别滚动太频繁,适当增加等待时间,避免触发人机验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:16:06