在tweepy中使用推文ID检索推文列表

时间:2017-06-16 05:45:41

标签: python twitter tweepy

我有一个包含推文ID列表的文件,我想要检索这些推文。该文件包含超过100000条推文,而twitter 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,我不想采集数据样本并将结果保存到文件并每次更改推文ID的索引所以那里是一种方法!?

2 个答案:

答案 0 :(得分:6)

是的 - 推特只允许您一次查找100条推文,但您可以在此之后立即查找另外100条推文。唯一需要考虑的是速率限制 - 您可以在每个15分钟窗口中对API进行的调用次数进行限制。幸运的是,当您使用wait_on_rate_limit=True创建API时,tweepy能够优雅地处理此问题。然后,我们需要做的就是将完整的推文ID列表处理成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

答案 1 :(得分:0)

上述代码的补充。如果tweet是twitter状态对象,则为输出格式。以下代码段将其转换为可消毒的json,然后将其映射到tweet id以获取完整的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)