如何实现推特页面完整滚动加载?现有代码问题排查求助
推特评论滚动加载问题排查
我打开某条推特的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问题:直接滚动到
body的最大高度,推特评论是异步加载的,幅度过大时中间的元素还没加载就跳到底部,导致后续元素查找失败。 - 代码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
相关产品推荐
相关产品推荐

