我过去一周收集了一些推文,收集了与“肺癌”有关的过去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相关的潜在问题
答案 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',比今天的日期高出一个。