You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Python爬取Twitter问题求助:滚动失效与推文获取异常

解决Selenium爬取X(原Twitter)推文的问题

一、修复滚动失效问题

X现在的滚动逻辑不再基于document.body,而是使用特定的内部滚动容器,直接操作body滚动自然失效。可以用以下两种稳定方法:

  1. 定位正确的滚动容器
    先找到页面主滚动容器(通常是带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)
    
  2. 模拟渐进式滚动(更适配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
    

二、解决推文收集不稳定的问题

不稳定的核心原因是动态加载未完成就抓取,或者重复收集已加载的推文,可通过以下方式解决:

  1. 用显式等待确保元素加载
    不要直接抓取,先等待推文元素出现后再操作:

    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"]'))
    )
    
  2. 精准定位并去重
    利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:21:06