使用Selenium和BeautifulSoup爬取NASA Twitter推文不全问题求助
解决Twitter推文爬取不全的问题
问题根源
- 滚动加载机制:Twitter采用滚动触发加载的模式,初始页面仅显示少量推文,不主动滚动的话,后续内容不会自动加载。你当前仅等待20秒就获取页面源码,只能拿到初始加载的几条内容。
- 动态Class选择器:你依赖的
css-901oao r-1nao33i...这类Class是Twitter动态生成的,随时可能变更,用它定位元素稳定性极差。 - 固定等待不可靠:
time.sleep(20)是固定时长等待,实际加载速度受网络影响,要么等待冗余,要么内容还没加载完成就停止等待。
改进方案
1. 模拟滚动加载更多推文
通过循环滚动页面底部,触发Twitter加载更多内容,直到页面高度不再变化(说明已加载完所有内容),或者达到你需要的滚动次数。
2. 使用稳定的元素定位方式
优先选择语义化属性定位,比如推文容器的data-testid="tweet"属性,这类属性比动态Class更不容易变动。
3. 用显式等待替代固定sleep
利用Selenium的WebDriverWait等待目标元素加载完成,既避免不必要的等待,也能确保元素已就绪。
改进后的代码
from bs4 import BeautifulSoup 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 url = 'https://twitter.com/nasa' driver = webdriver.Firefox() driver.get(url) # 模拟滚动加载更多推文 scroll_pause_time = 2 # 每次滚动后的等待间隔 last_height = driver.execute_script("return document.body.scrollHeight") # 设置滚动次数,可根据需求调整 for _ in range(5): # 滚动到当前页面底部 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 # 显式等待推文元素加载完成 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="tweet"]')) ) finally: pagesource = driver.page_source driver.quit() soup = BeautifulSoup(pagesource, 'lxml') # 通过data-testid定位推文容器 tweets = soup.find_all('div', attrs={'data-testid': 'tweet'}) for tweet in tweets: # 提取推文文本内容 tweet_text = tweet.find('div', attrs={'data-testid': 'tweetText'}) if tweet_text: print(tweet_text.text.strip()) print('---分隔线---')
额外提醒
- 反爬注意:频繁滚动或请求可能触发Twitter的反爬限制,建议适当延长等待时间,不要过度爬取。
- API替代方案:如果需要长期稳定获取数据,使用Twitter官方API是更合规的选择,能避免被拦截风险。
内容的提问来源于stack exchange,提问作者Ashborn3
相关产品推荐
相关产品推荐

