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

如何调整Nitter爬虫以实时打印新推文?

如何调整Nitter爬虫以实时打印新推文?

首先直接回应你的核心疑问:ntscraper本身没有原生的实时监听能力,因为它是通过静态请求Nitter页面来抓取内容的,Nitter也没有提供主动推送新内容的接口。不过我们可以通过轮询的方式基于ntscraper实现近似实时的监控,不需要立刻切换到Selenium或Scrapy——当然这两个工具能实现更“即时”的监听,但ntscraper的方案是最轻量化、最贴合你现有代码的。

方案一:基于ntscraper的轮询监控(最推荐,改动小)

这个思路很简单:定时重复抓取目标用户的最新推文,和上一次抓取到的最新推文做对比,如果发现新的推文(比如链接或ID不一样),就立刻输出。

具体实现步骤:

  1. 记录上一次抓取到的最新推文的唯一标识(比如推文链接,每个推文的链接是唯一的)
  2. 每隔固定时间(比如10-30秒,别太频繁,避免被Nitter限制)重新抓取最新推文
  3. 对比新抓取的推文标识和记录的旧标识,如果不一样,说明是新推文,输出内容并更新记录的标识

下面是修改后的代码示例:

from ntscraper import Nitter
import pandas as pd
import time

def monitor_tweets(username, check_interval=15):
    scraper = Nitter()
    last_tweet_link = None  # 记录上一次的最新推文链接

    print(f"开始实时监控@{username}的推文...")
    print(f"每隔{check_interval}秒检查一次新推文\n")

    while True:
        try:
            tweets_data = scraper.get_tweets(username, mode='user', number=1)
            if tweets_data and 'tweets' in tweets_data and len(tweets_data['tweets']) > 0:
                latest_tweet = tweets_data['tweets'][0]
                current_link = latest_tweet['link']

                # 如果是第一次抓取,或者抓到了新推文
                if last_tweet_link is None:
                    print("=== 初始抓取到的最新推文 ===")
                    print(f"Text: {latest_tweet['text']}")
                    print(f"Link: {current_link}\n")
                    last_tweet_link = current_link
                    # 可选:保存初始推文
                    df = pd.DataFrame([latest_tweet])
                    df.to_csv('latest_tweet.csv', index=False)
                elif current_link != last_tweet_link:
                    print("=== 检测到新推文! ===")
                    print(f"Text: {latest_tweet['text']}")
                    print(f"Link: {current_link}\n")
                    last_tweet_link = current_link
                    # 可选:更新CSV
                    df = pd.DataFrame([latest_tweet])
                    df.to_csv('latest_tweet.csv', index=False)
                # 没有新推文的话,静默等待下一次检查
            else:
                print("当前没有抓取到推文,继续监控...\n")
            
            # 等待指定时间后再检查
            time.sleep(check_interval)
        
        except Exception as e:
            print(f"监控过程中出现错误:{str(e)}")
            print("等待1分钟后重试...\n")
            time.sleep(60)

if __name__ == "__main__":
    monitor_tweets("Vader_AI_", check_interval=15)

这个方案的优点是:完全基于你现有的ntscraper代码,几乎不需要学习新工具,也不用依赖浏览器,资源占用很低。缺点是:实时性取决于你设置的检查间隔,间隔越短越接近实时,但也会增加被Nitter限制请求的风险(建议设置10-30秒以上)。

方案二:用Selenium实现更即时的监控

如果你想要更“实时”的体验(比如几秒内就能检测到新推文),可以用Selenium模拟浏览器打开Nitter页面,然后监听页面的DOM变化——当有新推文发布时,Nitter页面会在推文列表顶部新增一个元素,我们可以监听这个变化。

这个方案的思路是:

  1. 用Selenium打开目标用户的Nitter页面
  2. 记录初始的推文数量或者第一个推文的元素
  3. 用Selenium的WebDriverWait结合expected_conditions来监听新增的推文元素
  4. 一旦检测到新元素,就提取推文内容并输出

这个方案的实时性更好,但缺点是需要启动浏览器,资源占用更高,而且需要处理页面加载、简单反爬的问题。

要不要用Scrapy?

Scrapy本质上也是基于HTTP请求的框架,它能帮你更高效地处理请求、重试等逻辑,但核心还是轮询——和用ntscraper加time.sleep的思路类似,只是Scrapy的架构更适合大规模抓取,对于你这个单用户监控的场景来说,有点大材小用了,没必要特意切换。

总结建议

  • 如果你追求轻量化、改动小:优先用ntscraper+轮询的方案,这是最适合你的需求的
  • 如果你追求极致实时性:可以尝试Selenium监听DOM变化的方案
  • Scrapy在这里必要性不高,除非你之后要扩展到监控多个用户

另外,不管用哪种方案,都要注意:

  • 不要设置过短的请求间隔,避免被Nitter IP封禁
  • 可以加一些异常处理(比如请求失败时重试、随机调整间隔时间)
  • Nitter的页面结构可能会变化,要定期测试你的爬虫是否正常工作

备注:内容来源于stack exchange,提问作者HamidBee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:54:50