如何用Python的Selenium获取Twitter推文?get_attribute失效求修复
修复Selenium获取马斯克推文的代码问题
核心问题分析
find_elements()方法返回的是元素列表,不能直接调用get_attribute(),必须遍历列表中的每个元素操作- Twitter的元素ID是动态生成的(比如
id__z5kb0qs2bgp),刷新页面或重新加载后会失效,不能用固定ID定位 - 原代码逻辑是先滚动再获取推文,会漏掉初始页面加载的内容
修复后的代码
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://twitter.com/elonmusk") time.sleep(3) SCROLL_PAUSE_TIME = 4 last_height = driver.execute_script("return document.body.scrollHeight") # 用集合存储推文,避免重复 tweets = set() while True: # 先获取当前页面的所有推文 tweet_elements = driver.find_elements(By.XPATH, "//div[@data-testid='tweetText']") for elem in tweet_elements: tweet_content = elem.get_attribute("innerHTML").strip() if tweet_content: tweets.add(tweet_content) # 执行滚动加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(SCROLL_PAUSE_TIME) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 输出结果 for idx, tweet in enumerate(tweets, 1): print(f"推文{idx}: {tweet}") driver.quit()
关键修改说明
- 定位方式替换:使用
data-testid='tweetText'定位推文内容,这是Twitter官方提供的测试属性,比动态ID更稳定可靠 - 元素列表处理:遍历
find_elements()返回的所有推文元素,逐个提取内容 - 逻辑顺序调整:先抓取当前页面内容再滚动,避免遗漏初始加载的推文
- 去重处理:用集合存储推文内容,避免滚动加载时重复抓取已加载的内容
内容的提问来源于stack exchange,提问作者user16280596
相关产品推荐
相关产品推荐

