0
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import json 
from pprint import pprint

data_file = open('twitter.json')  
data = json.load(data_file)
##Json file with all the ckey, csecret, atoken, and asecret
pprint(data)

#consumer key, consumer secret, access token, access secret.
ckey = data["ckey"]
csecret = data["csecret"]
atoken = data["atoken"]
asecret = data["asecret"]

class listener(StreamListener):

def on_data(self, data):
    all_data = json.loads(data)       
    tweet = all_data["text"]        
    username = all_data["user"]["screen_name"]
    print((username,tweet))
    return True

def on_error(self, status):
    print (status)


auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)

上面的代码是访问 twitter api 的所有标准。但是,我需要将从 twitter 获得的推文传输到 .txt 文件中。我尝试使用下面的代码 twitterStream = Stream(auth, listener())

fid = open("cats based tweets.txt","w")
for tweet in twitterStream.filter(track=[cats]):
        fid.write(tweet)
    fid.close()

我打算找到所有包含关键字猫的推特推文/转发,确实如此。但是,它还应该编写一个包含所有推文的 txt 文件,但它没有。谁能告诉我我需要做什么来修复它。

编辑:我使用了你们编写的代码,但它没有返回所有推文。它像 5 或 6 一样打印出来,然后是错误

RuntimeError: No active exception to reraise

出现,我不知道为什么。为什么会发生这种情况,因为我知道它不应该。

4

3 回答 3

1

我猜您提供的代码段中存在轻微的缩进错误,但是我将尝试使用 2 种方法来修复您的错误,第一种方法是更正缩进,第二种方法是更改​​您的on_data方法

方法一:

fid = open("cats based tweets.txt","w")
for tweet in twitterStream.filter(track=[cats]):
    fid.write(tweet+"\n")
fid.close()

或者你可以简单地将上面的代码写成:

with open("cats based tweets.txt","w") as fid:
    for tweet in twitterStream.filter(track=[cats]):
        fid.write(tweet+"\n")

方法二:

在第二种方法中,我们可以更改on_data方法,以便当程序收到一条新推文时,它会打开并归档并直接写入它,但为此我们需要以附加模式打开文件,因为以w可写模式打开文件会覆盖文件的内容一次又一次。

def on_data(self, data):
    all_data = json.loads(data)       
    tweet = all_data["text"]        
    username = all_data["user"]["screen_name"]
    print((username,tweet))
    with open("cats based tweets.txt","a") as fid:
        fid.write(tweet+"\n")
    return True
于 2015-04-14T18:36:11.357 回答
1

我已经在一个项目中完成了这项工作,我的方法涉及更改对象中的on_data方法StreamListener。我的代码如下所示:

class Listener(StreamListener):
    def __init__(self, api=None, path=None):
        #I don't remember exactly why I defined this.
        self.api = api
        #We'll need this later.
        self.path = path

    def on_data(self, data):
        all_data = json.loads(data)

        tweet = all_data["text"]        
        username = all_data["user"]["screen_name"]
        print((username,tweet))

        #Open, write and close your file.
        savefile = open(file_path, 'ab')
        savefile.write(tweet)
        savefile.close()

        return True

实际代码中的一些内容,而不是您重新定义Listeneron_data. 为了:

  1. 定义要保存的文件。我们称该变量为file_path. 不要忘记在此处添加.txt扩展名。
  2. 调用 Stream 和 Listener:

    twitterStream = Stream(authorization, Listener(path=file_path))
    
  3. 使用您的过滤器。我的是坐标,我尝试使用过滤器,除非我的代码不会停止。这里适合你:

    try:
        twitterStream.filter(track=[cats])
    except Exception, e:
        print 'Failed filter() with this error:', str(e)
    

现在,只要文本出现在流中,推文中的文本就应该写入文件中。看看你的文件大小,你应该会看到它增加了。特别是,如果您的过滤器是关于猫的。互联网爱猫。

于 2015-04-17T17:13:46.083 回答
0

请参阅下面的链接,然后您将了解如何将推文保存到数据库以及我们的本地文件。

https://github.com/anandstarz/Scrapee/blob/master/tweets

于 2015-04-13T05:03:25.513 回答