Получение списка твитов с использованием идентификатора твита в твипи

У меня есть файл, содержащий список идентификаторов твитов, и я хочу получить эти твиты. Файл содержит более 100000 твитов, а твиттер API позволяет получить только 100.

api = tweepy.API(auth)
good_tweet_ids = [i for i in por.TweetID[0:100]]
tweets = api.statuses_lookup(good_tweet_ids)
for tweet in tweets:
    print(tweet.text)

Есть ли способ получить больше твитов, скажем 1000 или 2000, я не хочу брать выборку данных и сохранять результаты в файл и каждый раз изменять индекс идентификатора твита, так что есть ли способ сделать это!?

2 ответа

Решение

Да, твиттер позволяет вам искать только 100 твитов за раз, но вы можете посмотреть еще 100 сразу после этого. В таком случае единственное беспокойство вызывает ограничение скорости - вы ограничены количеством вызовов, которые вы можете совершать через API в каждом 15-минутном окне. К счастью, tweepy может изящно справиться с этим при создании API с помощью wait_on_rate_limit=True, Все, что нам нужно сделать, это обработать наш полный список идентификаторов твитов в пакетах по 100 или менее (предположим, у вас есть 130 - второй пакет должен быть только последним 30) и искать их по одному за раз. Попробуйте следующее:

import tweepy


def lookup_tweets(tweet_IDs, api):
    full_tweets = []
    tweet_count = len(tweet_IDs)
    try:
        for i in range((tweet_count / 100) + 1):
            # Catch the last group if it is less than 100 tweets
            end_loc = min((i + 1) * 100, tweet_count)
            full_tweets.extend(
                api.statuses_lookup(id=tweet_IDs[i * 100:end_loc])
            )
        return full_tweets
    except tweepy.TweepError:
        print 'Something went wrong, quitting...'

consumer_key = 'XXX'
consumer_secret = 'XXX'
access_token = 'XXX'
access_token_secret = 'XXX'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

# do whatever it is to get por.TweetID - the list of all IDs to look up

results = lookup_tweets(por.TweetID, api)

for tweet in results:
    if tweet:
        print tweet.text

Дополнение к коду выше. Формат вывода, если твит - это статусный объект Twitter. Следующий фрагмент кода преобразует его в стерилизуемый json, а затем сопоставляет его с идентификатором твита, чтобы получить полный df.

df = pd.read_csv('your.csv')
good_tweet_ids = [i for i in df.TweetID] #tweet ids to look up 
results = lookup_tweets(good_tweet_ids, api) #apply function

#Wrangle the data into one dataframe
import json
temp = json.dumps([status._json for status in results]) #create JSON
newdf = pd.read_json(temp, orient='records')
full = pd.merge(df, newdf, left_on='TweetID', right_on='id', how='left').drop('id', axis=1)
Другие вопросы по тегам