Search code examples
pythonjsontwittertweepytwitter-streaming-api

save twitter user information into a file using StreamListener


Guys i wanna save twitter user info like name, statuses, tweet in my file (either json,txt,csv or any other json or text are prefered). I tried this code and some other similar but none of them work. Guys have a look at below code and suggest me what changes should i made??

import time
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import os
import json

ckey = '**********'
consumer_secret = '**********'
access_token_key = '**********'
access_token_secret = '**********'

start_time = time.time() #grabs the system time
keyword_list = ['twitter'] #track list

#Listener Class Override
class listener(StreamListener):

    def __init__(self, start_time, time_limit=60):

        self.time = start_time
        self.limit = time_limit

    def on_data(self, data):

        while (time.time() - self.time) < self.limit:
            try:
                all_data = json.loads["text"]
                username = all_data["user"]["name"]
                tweets = all_date["user"]["statuses"]
                saveFile = open('raw_tweets29.json', 'a')
                saveFile.write(username)
                saveFile.write('\n')
                saveFile.close()

                return True
            except BaseException, e:
                print 'failed ondata,', str(e)
                time.sleep(5)
                pass
        exit()

    def on_error(self, status):
        print statuses

auth = OAuthHandler(ckey, consumer_secret) #OAuth object
auth.set_access_token(access_token_key, access_token_secret)
twitterStream = Stream(auth, listener(start_time, time_limit=20))
twitterStream.filter(track=['twitter'])

when i run below code this give me error -
failed ondata, 'function' object has no attribute '__getitem__'

I would greatly appreciate any help you can give me in working this problem


Solution

  • I am doing some mistake, now i figure it out there is no need of temp variable 'text' what i need to do is load actual data. there is one more thing require is encoding. thanks everyone for your time.

    import time
    from tweepy import Stream
    from tweepy import OAuthHandler
    from tweepy.streaming import StreamListener
    import os,sys
    import json
    
    ckey = '***'
    consumer_secret = '***'
    access_token_key = '***'
    access_token_secret = '***'
    
    start_time = time.time()
    
    class listener(StreamListener):
    
        def __init__(self, start_time, time_limit=300):
    
            self.time = start_time
            self.limit = time_limit
    
        def on_data(self, data):
    
            while (time.time() - self.time) < self.limit:
                try:
                    tweet = json.loads(data)
                    user_name = tweet['user']['name']
                    tweet_count = tweet['user']['statuses_count']
                    text = tweet['text']
                    saveFile = open('user_tweets29.json', 'a')
                    saveFile.write(text.encode('utf8'))
                    saveFile.write('\n')
                    saveFile.close()
    
                    return True
                except BaseException, e:
                    print 'failed ondata,', str(e)
                    time.sleep(5)
                    pass
            exit()
    
        def on_error(self, status):
            print statuses
    
    auth = OAuthHandler(ckey, consumer_secret)
    auth.set_access_token(access_token_key, access_token_secret)
    twitterStream = Stream(auth, listener(start_time, time_limit=60))
    twitterStream.filter(track=['twitter'])