Перенос твитов Twitter в текстовый файл

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)

Приведенный выше код является стандартным для доступа к 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()

Я намерен найти все твиттеры / репосты в твиттере, которые включают ключевое слово cats, что и делает. Тем не менее, он также должен написать текстовый файл, который включает в себя все твиты, но это не так. Может кто-нибудь сказать мне, что мне нужно, чтобы это исправить.

РЕДАКТИРОВАТЬ: Я использовал код, который вы, ребята, написали, но он не возвращает все твиты. Он печатает как 5 или 6, а затем ошибка

RuntimeError: No active exception to reraise

появляется и я понятия не имею почему. Почему это происходит, потому что я знаю, что не должно.

3 ответа

Решение

Я сделал это в проекте, и мой метод предполагает изменение 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

Несколько вещей в реальном коде, а не там, где вы переопределили Listener или же on_data, С целью:

  1. Определите файл, в котором вы хотите сохранить. Давайте назовем эту переменную file_path, Не забудьте добавить здесь расширения .txt.
  2. Вызовите поток и слушателя:

    twitterStream = Stream(authorization, Listener(path=file_path))
    
  3. Используйте ваши фильтры. Мои координаты, и я попробую фильтр, за исключением того, что мой код не останавливается. Вот он для вас:

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

Теперь текст в твите должен быть записан в файл всякий раз, когда текст появляется в потоке. Посмотрите на размер файла, и вы увидите, как он увеличивается. Особенно, если ваш фильтр о кошках. Интернет любит кошек.

Я полагаю, что в предоставленном вами фрагменте есть небольшая ошибка отступа, однако я постараюсь исправить вашу ошибку с помощью двух подходов, первый - исправление отступа, а второй - изменить ваш.on_data метод

Подход 1:

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")

Подход 2:

Во втором подходе мы можем изменить 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

Посмотрите ссылку ниже, и вы узнаете, как сохранить твиты в базе данных, а также в наш локальный файл.

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

Другие вопросы по тегам