【问题标题】:Missing Tweets from Twitter API (using Tweepy)?缺少来自 Twitter API 的推文(使用 Tweepy)?
【发布时间】:2018-04-13 00:57:24
【问题描述】:

我一直在收集过去一周的推文,收集过去7天与“肺癌”相关的推文,昨天我想我需要开始收集更多的字段,所以我添加了一些字段并开始重新收集上周与“肺癌”相关的推文。问题是,我第一次在 2014 年 9 月 18 日收集了约 2000 条与肺癌相关的推文。但昨晚,它只提供了约 300 条推文,当我查看这组新推文的时间时,它是仅在 2014 年 9 月 18 日约 23:29 至 23:59 之间收集推文。大量数据显然丢失。我不认为这与我的代码(下)有关,我测试了各种方法,包括删除大部分要收集的字段并且数据的时间仍然过早地被切断。

这是 Twitter API 的一个已知问题(收集过去 7 天的数据时)吗?如果是这样,如果有人试图进行认真的研究,那将是非常可怕的。还是我的代码中的某个地方导致了这种情况(注意:它在其他之前/之后的日期运行得非常好)?

import tweepy
import time
import csv

ckey = ""
csecret = ""
atoken = ""
asecret = ""

OAUTH_KEYS = {'consumer_key':ckey, 'consumer_secret':csecret,
    'access_token_key':atoken, 'access_token_secret':asecret}
auth = tweepy.OAuthHandler(OAUTH_KEYS['consumer_key'], OAUTH_KEYS['consumer_secret'])
api = tweepy.API(auth)

# Stream the first "xxx" tweets related to "car", then filter out the ones without geo-enabled
# Reference of search (q) operator: https://dev.twitter.com/rest/public/search

# Common parameters: Changeable only here
startSince = '2014-09-18'
endUntil = '2014-09-20'
suffix = '_18SEP2014.csv'

############################
### Lung cancer starts #####
searchTerms2 = '"lung cancer" OR "lung cancers" OR "lungcancer" OR "lungcancers" OR \
    "lung tumor" OR "lungtumor" OR "lung tumors" OR "lungtumors" OR "lung neoplasm"'

# Items from 0 to 500,000 (which *should* cover all tweets)
# Increase by 4,000 for each cycle (because 5000-6000 is over the Twitter rate limit)
# Then wait for 20 min before next request (becaues twitter request wait time is 15min)

counter2 = 0
for tweet in tweepy.Cursor(api.search, q=searchTerms2, 
    since=startSince, until=endUntil).items(999999999): # changeable here

    try:
        '''
        print "Name:", tweet.author.name.encode('utf8')
        print "Screen-name:", tweet.author.screen_name.encode('utf8')
        print "Tweet created:", tweet.created_at'''

        placeHolder = []
        placeHolder.append(tweet.author.name.encode('utf8'))
        placeHolder.append(tweet.author.screen_name.encode('utf8'))
        placeHolder.append(tweet.created_at)

        prefix = 'TweetData_lungCancer'
        wholeFileName = prefix + suffix     
        with open(wholeFileName, "ab") as f: # changeable here
            writeFile = csv.writer(f)
            writeFile.writerow(placeHolder)

        counter2 += 1

        if counter2 == 4000:
            time.sleep(60*20) # wait for 20 min everytime 4,000 tweets are extracted 
            counter2 = 0
            continue

    except tweepy.TweepError:
        time.sleep(60*20)
        continue

    except IOError:
        time.sleep(60*2.5)
        continue

    except StopIteration:
        break

更新: 从那以后,我尝试在另一台计算机上运行相同的 python 脚本(这比我的家用笔记本电脑更快、更强大)。后者导致了预期的推文数量,我不知道为什么会发生这种情况,因为我的家用笔记本电脑适用于许多程序,但我认为我们可以搁置此案并排除与脚本或 Twitter API 相关的潜在问题.

【问题讨论】:

  • 这能回答你的问题吗? “暂时将搜索速率限制为每 15 分钟窗口 180 个查询”dev.twitter.com/rest/public/rate-limiting。我知道向公众开放的 Twitter API 有很多限制。
  • 感谢您的意见,但我认为这不是问题所在。我一直在测试,它通常在我提取 6500+ 条推文后达到速率限制,这就是为什么我将睡眠功能设置为每 4000 条记录。收集约 300 个应该远未达到速率限制。
  • 你是对的,对不起。我应该注意到

标签: python-2.7 twitter tweepy


【解决方案1】:

如果您想收集更多数据,我强烈推荐 Tweepy 提供的流媒体 API。它的速率限制要高得多,事实上我在一天之内就能收集到 500,000 条推文。

此外,您的速率限制检查不是很可靠,您不确定 Twitter 是否允许您访问 4000 条推文。根据经验,我发现你越频繁地达到速率限制,你被允许的推文就越少,你需要等待的时间就越长。

我建议使用:

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

以便您的应用程序不会超过速率限制,或者您应该检查您使用的内容:

打印 (api.rate_limit_status())

然后你就可以像之前那样让线程休眠了。

您的结束日期也不正确。结束日期应该是“2014-09-21”,比今天的日期高一。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2017-12-26
    • 2016-06-29
    • 2023-03-18
    • 2021-10-18
    • 2013-06-10
    • 2016-05-28
    • 2021-04-30
    • 1970-01-01
    相关资源
    最近更新 更多