使用Selenium爬取Twitter推文遇漏爬及日期断层问题求助
解决推特批量加载推文的滚动问题
原代码的核心问题
- 循环遍历推文时就执行滚动操作,DOM更新后原
tweets列表直接失效,只能获取初始加载的少量内容 - 直接滚动到页面底部会触发Twitter的批量加载机制,跳过中间时间段的推文,造成日期断层
- 固定像素滚动容易因页面布局变化陷入重复加载旧内容的死循环
优化方案
改用滚动到当前最后一条推文位置的方式触发增量加载,同时跟踪已处理推文数量避免重复,结合等待逻辑确保内容加载完成:
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 driver = webdriver.Chrome() driver.get("https://twitter.com/MYACC") wait = WebDriverWait(driver, 10) # 等待初始推文加载完成 wait.until(EC.presence_of_all_elements_located((By.XPATH, "//article[@data-testid='tweet']"))) processed_tweets = 0 while True: # 获取当前所有已加载的推文 tweets = driver.find_elements(By.XPATH, "//article[@data-testid='tweet']") current_count = len(tweets) # 处理未处理过的推文 for tweet in tweets[processed_tweets:]: print(tweet.text) # 更新已处理数量 processed_tweets = current_count # 滚动到最后一条推文的位置,触发加载更多 if current_count > 0: last_tweet = tweets[-1] driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'end'});", last_tweet) # 等待新内容加载,平衡加载速度和资源占用 time.sleep(5) # 检查是否有新推文加载 new_tweets = driver.find_elements(By.XPATH, "//article[@data-testid='tweet']") if len(new_tweets) == current_count: # 没有新内容,退出循环 break driver.quit()
关键优化点
- 增量滚动:通过
scrollIntoView滚动到最后一条推文,触发Twitter的渐进式加载,避免跳过中间时间段的内容 - 跟踪已处理推文:用
processed_tweets记录已处理的数量,避免重复打印旧内容 - 平滑滚动:
behavior: 'smooth'让滚动更符合Twitter的加载触发逻辑,减少加载异常 - 初始等待:用WebDriverWait确保页面初始推文渲染完成,避免过早执行后续逻辑
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

