如何更新 Tweepy Streaming Python 代码

How to update Tweepy Streaming Python code

我有这个代码 运行 用于早期版本的 Python 但现在想将它升级到最新版本的 Python 和 Tweepy 但是我似乎无法让它工作.任何帮助将非常感激!我得到的错误是:

ImportError: 无法从 'tweepy.streaming' 导入名称 'StreamListener' (C:\Users\mmanenica\anaconda3\lib\site-packages\tweepy\streaming.py)

import sys

from tweepy import OAuthHandler
from tweepy import API
from tweepy import Stream
from tweepy.streaming import StreamListener
import pandas as pd
from time import sleep
from random import randint

CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = API(auth, wait_on_rate_limit=True,
          wait_on_rate_limit_notify=True)

tweets = pd.DataFrame(columns=['description', 'location', 'text', 'name', 'user_created', 
                  'followers', 'user_id', 'created', 'retweets', 'analysis', 'sentiment'])

class Listener(StreamListener):
    def __init__(self, output_file=sys.stdout):
        super(Listener,self).__init__()
        self.output_file = output_file
        self.counter = 0
        self.limit = 3
    def on_status(self, status):
        try:
            name = status.user.screen_name  
            sleep(randint(100,190))
            print(name)
            api.create_friendship(name)            
            
            print(status.text, file=self.output_file)
                 
            self.counter += 1
            if self.counter <= self.limit:
                print(self.counter)
                return True
            else:
                print('Limit reached')
        except:
            print("Error in adding friendship")                   
        
    def on_error(self, status_code):
        print('Error ' + str(status_code))
        return False

listener = Listener()

stream = Stream(auth=api.auth, listener=listener)
try:

    stream.filter(track=['NFTs', 'Buying NFT', 'Buy NFT', '-filter:links', '-filter:retweets'])

    print('Start streaming.')
except KeyboardInterrupt:
    print("Stopped.")
finally:
    print('Done.')
    stream.disconnect()

首先,确保你已经安装了最新版本的tweepy (4.5.0)。您可以通过在终端中输入 pip install --user --upgrade tweepy 来保证这一点。您可以在没有 --user 部分的情况下尝试。它也应该升级。 现在,安装了最新版本后,您可以开始使用如下代码(基于 https://docs.tweepy.org/en/stable/streaming.html)收集流:

import tweepy 

class StreamCollector(tweepy.Stream):

    def on_data(self, data):
        print(data)


stream = StreamCollector(
  "Consumer Key here", "Consumer Secret here",
  "Access Token here", "Access Token Secret here"
)
stream.filter(track=["Obama"])

请注意,on_data 方法直接从 Twitter 接收 raw_data。我们只是用上面的代码打印它,但你可以像对待 python 字典一样对待这个 data 对象,并提取你想要的关于推文的任何信息。

我建议,不要打印 data 对象,而是像下面这样(导入 json 库并将其余代码放在 def on_data 中,而不是 print(data)):

import json

tweet_info = json.loads(data)
print(tweet_info['text'])

请注意,我们已经访问了 data 对象并仅提取了推文“文本”信息。您可以更深入地访问 tweet_info 词典中的其他信息,并根据问题中显示的必要条件补充上面的代码。

希望对您有所帮助。 :)