Привет!
Я пытаюсь скачать твиты с хештегами на кириллице, но у меня не выходит.
В сети почему-то не могу найти ответа.
Вы не могли бы посмотреть код? Огромное спасибо!
identation не скопировалась- #!/usr/bin/env python
- # encoding: utf-8
- import tweepy #github.com/tweepy/tweepy
- import csv
- import sys
- # sys.setdefaultencoding() does not exist, here!
- reload(sys) # Reload does the trick!
- sys.setdefaultencoding('UTF8')
- #Twitter API credentials
- def get_all_tweets(screen_name):
- #Twitter only allows access to a users most recent 3240 tweets with this method
-
- #authorize twitter, initialize tweepy
- auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
- auth.set_access_token(access_key, access_secret)
- api = tweepy.API(auth)
-
- #initialize a list to hold all the tweepy Tweets
- alltweets = []
-
- #make initial request for most recent tweets (200 is the maximum allowed count)
- new_tweets = api.user_timeline(screen_name = screen_name,count=200)
-
- #save most recent tweets
- alltweets.extend(new_tweets)
-
- #save the id of the oldest tweet less one
- oldest = alltweets[-1].id - 1
-
- #keep grabbing tweets until there are no tweets left to grab
- while len(new_tweets) > 0:
- print "getting tweets before %s" % (oldest)
-
- #all subsiquent requests use the max_id param to prevent duplicates
- new_tweets = api.user_timeline(screen_name = screen_name,count=200,max_id=oldest)
-
- #save most recent tweets
- alltweets.extend(new_tweets)
-
- #update the id of the oldest tweet less one
- oldest = alltweets[-1].id - 1
-
- print "...%s tweets downloaded so far" % (len(alltweets))
-
- #transform the tweepy tweets into a 2D array that will populate the csv
- outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode("utf-8"),tweet.retweet_count,tweet.favorite_count] for tweet in alltweets]
-
- #write the csv
- with open('%s_tweets.csv' % screen_name, 'wb') as f:
- writer = csv.writer(f)
- writer.writerow(["id","created_at","text","retweet_count","favorite_count"])
- writer.writerows(outtweets)
-
- pass
- if __name__ == '__main__':
- #pass in the username of the account you want to download
- get_all_tweets("гамлета")
@темы:
Computer Science,
Интернет
Я подправил у себя локально отступы и запустил указав вместо гамлета medvedevrussia.
в итоге создался файл и там есть хештеги на русском, строки вроде
787036800376242176,2016-10-14 21:06:10,RT @Pravitelstvo_RF: Бюджет 2017-2019. Приоритетные проекты. СОБЫТИЯ НЕДЕЛИ #видеоблог #Медведев t.co/7PBdoBWs6m,94,0
При том, тут не выходит и в другом скрипте с использованием JSON тоже не выходит(( Кракозябры выходят. А в ДжейСоне вообще пустые твиты прилетают, если по-русски пишутся.
#pass in the username of the account you want to download
get_all_tweets("гамлета")
Это же название аккаунта в котором надо искать, а не хэштег, и все падает потому что такого аккаунта нет.
И выводится информация по всем постам
Хештеги идут похоже просто как часть текста, то есть tweet.text.encode("utf-8")
Чтобы как-то отфильтровать по конкретному хештегу надо это явно делать.
Например
Но вполне возможно, эта библиотека и лучше умеет работать с хештегами, это просто если исходить из примера, который уже есть
Да. Вот в этом коде не въезжаю, что происходит в итоге.
Вот тут сис заставил код замолчать и искать все. И, когда я его запускаю в пауэр шелле, мне выскакивают кракозябры, которые, подозреваю, хештег по-русски, а потом пустые твиты, если они по-русски. Я понимаю, что или нужно менять параметры в json.loads(data), или в принте назад на decode("utf8", "ignore")?
Спасибо еще раз ><'
читать дальше
Если честно, сейчас я уже не понимаю, что от кода ожидается и в чем именно с ним проблема.
powershell скорее всего использует cp1251.
Если предположить, что данные приходят в utf8, а их надо в cp1251 вывести, то можно просто везде сделать
Если это не поиожет, то можно скоировать крякозябры в www.artlebedev.ru/tools/decoder/ или www.online-decoder.com/ru чтобы определить какая кодировка на самом деле, а какая использовалась для вывода.
sys соответственно в такой ситуации можно не трогать. (хотя теоретически указание там utf8 должно было помочь).
Игнорить ошибки смысла нет, так как
Фактически означает "проигнорь все не ascii символы" (то есть кириллицу в даннои случае)
Соответственно код должен сработать
Можно за ним еще decode('utf8') приписать, ну или 'cp1251'. Т.к. иначе используется юникод, и возможно кто-то ожидает, что он будет закодирован в какой-то кодировке, но судя по моим экспериментам локально должно быть без этого.
И аналогичное там где сейчас ignore.
еще есть вариант поставть mingw bash и запускать из под него python, там всегда будет utf8 и скорее всего не будет никаких проблем с кодировкой.
Я например просто удалил все эти декодирования с игнором и из обычного юниксового терминала все ок