Selenium Python爬取Twitter问题求助:滚动失效与推文获取异常
解决Selenium爬取X(原Twitter)推文的问题
一、修复滚动失效问题
X现在的滚动逻辑不再基于document.body,而是使用特定的内部滚动容器,直接操作body滚动自然失效。可以用以下两种稳定方法:
定位正确的滚动容器
先找到页面主滚动容器(通常是带data-testid="primaryColumn"的div),再针对这个容器执行滚动:scroll_container = browser.find_element(By.CSS_SELECTOR, 'div[data-testid="primaryColumn"]') browser.execute_script('arguments[0].scrollTop = arguments[0].scrollHeight', scroll_container)模拟渐进式滚动(更适配X的加载逻辑)
一次性滚到底部容易触发加载异常,建议分段滚动并等待内容加载:import time scroll_container = browser.find_element(By.CSS_SELECTOR, 'div[data-testid="primaryColumn"]') last_height = browser.execute_script('return arguments[0].scrollHeight', scroll_container) while len(collected_tweets) < 10: # 每次滚动1000像素 browser.execute_script('arguments[0].scrollTop += 1000', scroll_container) # 等待内容渲染 time.sleep(2) new_height = browser.execute_script('return arguments[0].scrollHeight', scroll_container) # 无新内容加载时退出循环 if new_height == last_height: break last_height = new_height
二、解决推文收集不稳定的问题
不稳定的核心原因是动态加载未完成就抓取,或者重复收集已加载的推文,可通过以下方式解决:
用显式等待确保元素加载
不要直接抓取,先等待推文元素出现后再操作:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待至少一条推文文本元素加载完成 WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="tweetText"]')) )精准定位并去重
利用X推文的固定data-testid属性定位,同时用集合或唯一ID避免重复收集:collected_tweets = [] seen_tweet_ids = set() while len(collected_tweets) < 10: # 抓取所有推文容器 tweet_containers = browser.find_elements(By.CSS_SELECTOR, 'div[data-testid="tweet"]') for container in tweet_containers: tweet_id = container.get_attribute('data-testid') if tweet_id not in seen_tweet_ids: seen_tweet_ids.add(tweet_id) # 提取推文文本 text_elem = container.find_element(By.CSS_SELECTOR, 'div[data-testid="tweetText"]') tweet_text = text_elem.text.strip() if tweet_text: collected_tweets.append(tweet_text) # 继续滚动加载... # 输出前10条 for idx, text in enumerate(collected_tweets[:10], 1): print(f"{idx}. {text}")
额外提醒
- X有反爬机制,建议设置合理的用户代理,避免短时间内频繁滚动,优先用显式等待替代固定sleep。
- X的页面元素选择器可能随时更新,若代码失效,需重新检查元素的
data-testid或CSS属性。
内容的提问来源于stack exchange,提问作者Sevostyanov Gleb
相关产品推荐
相关产品推荐

