Перенос твитов 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
, С целью:
- Определите файл, в котором вы хотите сохранить. Давайте назовем эту переменную
file_path
, Не забудьте добавить здесь расширения .txt. Вызовите поток и слушателя:
twitterStream = Stream(authorization, Listener(path=file_path))
Используйте ваши фильтры. Мои координаты, и я попробую фильтр, за исключением того, что мой код не останавливается. Вот он для вас:
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
Посмотрите ссылку ниже, и вы узнаете, как сохранить твиты в базе данных, а также в наш локальный файл.