【问题标题】:retrieving a list of tweets using tweet ID in tweepy在 tweepy 中使用推文 ID 检索推文列表
【发布时间】:2018-07-02 03:47:30
【问题描述】:

我有一个包含推文 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 的索引所以有没有办法这样做!?

【问题讨论】:

    标签: python twitter tweepy


    【解决方案1】:

    是的 - twitter 一次只能查找 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
    

    【讨论】:

    • 谢谢。这是小菜一碟:)
    • @ason​​gtoruin:当 tweet_count 为 100、200 等时,此代码 api.statuses_lookup(id=tweet_IDs[i * 100:end_loc]) 存在问题。您能帮忙修改代码吗?谢谢。
    • @Jason 不了解您遇到的具体问题,可能不会。你遇到了什么问题?
    • @ason​​gtoruin:问题是当有 100 条推文时,tweet_IDs[i*100 : end_loc] 将返回一个空 id,导致TweepError: [{'code': 38, 'message': 'id parameter is missing.'}]
    • @Jason 不会被 try... except 块捕获吗?
    【解决方案2】:

    添加到上面的代码。推文是推特状态对象时的输出格式。下面这段代码会将其转换为可消毒的 json,然后将其映射到推文 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)
    

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 2020-09-07
      • 1970-01-01
      • 2017-02-18
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      相关资源
      最近更新 更多