如何调整Nitter爬虫以实时打印新推文?
首先直接回应你的核心疑问:ntscraper本身没有原生的实时监听能力,因为它是通过静态请求Nitter页面来抓取内容的,Nitter也没有提供主动推送新内容的接口。不过我们可以通过轮询的方式基于ntscraper实现近似实时的监控,不需要立刻切换到Selenium或Scrapy——当然这两个工具能实现更“即时”的监听,但ntscraper的方案是最轻量化、最贴合你现有代码的。
方案一:基于ntscraper的轮询监控(最推荐,改动小)
这个思路很简单:定时重复抓取目标用户的最新推文,和上一次抓取到的最新推文做对比,如果发现新的推文(比如链接或ID不一样),就立刻输出。
具体实现步骤:
- 记录上一次抓取到的最新推文的唯一标识(比如推文链接,每个推文的链接是唯一的)
- 每隔固定时间(比如10-30秒,别太频繁,避免被Nitter限制)重新抓取最新推文
- 对比新抓取的推文标识和记录的旧标识,如果不一样,说明是新推文,输出内容并更新记录的标识
下面是修改后的代码示例:
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页面会在推文列表顶部新增一个元素,我们可以监听这个变化。
这个方案的思路是:
- 用Selenium打开目标用户的Nitter页面
- 记录初始的推文数量或者第一个推文的元素
- 用Selenium的
WebDriverWait结合expected_conditions来监听新增的推文元素 - 一旦检测到新元素,就提取推文内容并输出
这个方案的实时性更好,但缺点是需要启动浏览器,资源占用更高,而且需要处理页面加载、简单反爬的问题。
要不要用Scrapy?
Scrapy本质上也是基于HTTP请求的框架,它能帮你更高效地处理请求、重试等逻辑,但核心还是轮询——和用ntscraper加time.sleep的思路类似,只是Scrapy的架构更适合大规模抓取,对于你这个单用户监控的场景来说,有点大材小用了,没必要特意切换。
总结建议
- 如果你追求轻量化、改动小:优先用ntscraper+轮询的方案,这是最适合你的需求的
- 如果你追求极致实时性:可以尝试Selenium监听DOM变化的方案
- Scrapy在这里必要性不高,除非你之后要扩展到监控多个用户
另外,不管用哪种方案,都要注意:
- 不要设置过短的请求间隔,避免被Nitter IP封禁
- 可以加一些异常处理(比如请求失败时重试、随机调整间隔时间)
- Nitter的页面结构可能会变化,要定期测试你的爬虫是否正常工作
备注:内容来源于stack exchange,提问作者HamidBee

