从Twitter API中丢失推文(使用Tweepy)?

时间:2014-09-23 16:28:42

标签: python-2.7 twitter tweepy

我过去一周收集了一些推文,收集了与“肺癌”有关的过去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相关的潜在问题

1 个答案:

答案 0 :(得分:0)

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

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

我建议使用:

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

以便您的申请不会超过费率限制,或者您应该检查您使用的内容:

print(api.rate_limit_status())

然后你可以像你一样睡觉线程。

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