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

使用Tweepy 3.9.0将Twitter数据导入MongoDB时遇TypeError报错求助

解决Tweepy 3.9.0中StreamListener初始化的TypeError问题

错误原因

你代码里的核心问题是流对象创建逻辑错误:

  • tweepy.StreamListener是自定义监听逻辑的基类,不能直接用来创建流实例,正确的流类是tweepy.Stream
  • 初始化流时,auth参数应该传入配置好的tweepy.OAuthHandler对象,而非tweepy.API实例

修正后的完整代码

import tweepy
import pymongo
from pymongo import MongoClient

# MongoDB连接部分(保持不变)
client = MongoClient(mongod_connect)
db = client.Data_Extractfrom_Twitter 
tweets = db.Tweets_Collections 
tweets.create_index([("id", pymongo.ASCENDING)], unique=True)

# 认证部分(简化,不需要创建API对象)
stream_auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
stream_auth.set_access_token(OAUTH_TOKEN, OATH_TOKEN_SECRET)

track = ['Presidential Election with Donald Trump and Joe Biden']

# 自定义监听类(保持不变)
class MyStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        print(status.id_str)
        try:
            tweets.insert_one(status._json)
        # 优化:捕获具体的重复键异常,避免吞掉其他错误
        except pymongo.errors.DuplicateKeyError:
            pass

    def on_error(self, status_code):
        if status_code == 420:
            # 返回False断开流连接(应对限流)
            return False

# 修正流实例创建逻辑
myStreamListener = MyStreamListener()
# 用tweepy.Stream创建实例,传入auth和listener参数
myStream = tweepy.Stream(auth=stream_auth, listener=myStreamListener)
myStream.filter(track=track)

关键修正点

  • 替换流类:将tweepy.StreamListener改为tweepy.Stream来创建流实例
  • 修正auth参数:直接传入stream_auth(OAuthHandler对象),无需先创建tweepy.API(如果仅使用流功能,该API对象可以删除)
  • 异常捕获优化:把宽泛的except:改为捕获pymongo.errors.DuplicateKeyError,因为你已经给id字段设置了唯一索引,大部分插入失败是因为重复推文ID,这样能避免隐藏其他未知错误

内容的提问来源于stack exchange,提问作者Yarrarapu Jashwanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:21:13