当我偶然发现此错误时,我正在使用TwitterAPI收集用户的推文。
由于我计划抓取至少500条具有不同属性的tweets,并且每个查询最多只返回100条tweets,因此我创建了一个函数。
!pip install TwitterAPI
from TwitterAPI import TwitterAPI
import json
CONSUMER_KEY = #ENTER YOUR CONSUMER_KEY
CONSUMER_SECRET = #ENTER YOUR CONSUMER_SECRET
OAUTH_TOKEN = #ENTER YOUR OAUTH_TOKEN
OAUTH_TOKEN_SECRET = #ENTER YOUR OAUTH_TOKEN_SECRET
api = TwitterAPI(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
这是我的功能运行方式:
def retrieve_tweets(api, keyword, batch_count, total_count):
tweets = []
batch_count = str(batch_count)
resp = api.request('search/tweets', {'q': 'keyword',
'count':'batch_count',
'lang':'en',
'result_type':'recent',
}
)
# store the tweets in the list
tweets += resp.json()['statuses']
# find the max_id_str for the next batch
ids = [tweet['id'] for tweet in tweets]
max_id_str = str(min(ids))
# loop until as many tweets as total_count is collected
number_of_tweets = len(tweets)
while number_of_tweets < total_count:
print("{} tweets are collected for keyword {}. Last tweet created at {}".format(number_of_tweets, keyword, tweets[number_of_tweets-1]['created_at']))
resp = api.request('search/tweets', {'q': 'keyword',#INSERT YOUR CODE
'count':'batch_count',
'lang':'en',
'result_type': 'recent',
'max_id': 'max_id_str'
}
)
tweets += resp.json()['statuses']
ids = [tweet['id'] for tweet in tweets]
max_id_str = str(min(ids))
number_of_tweets = len(tweets)
print("{} tweets are collected for keyword {}. Last tweet created at {}".format(number_of_tweets, keyword, tweets[number_of_tweets-1]['created_at']))
return tweets
之后,我按如下方式运行该函数:
first_group = retrieve_tweets(api, 'Rock', 100, 500)
它一直运行良好,直到发出大约180条鸣叫,然后弹出:
179 tweets are collected for keyword Rock. Last tweet created at Mon Apr 29 02:04:05 +0000 2019
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-9-cbeb6ede7a5a> in <module>
8 # Your function call should look like this: retrieve_tweets(api,'keyword',single_count,total_count)
9
---> 10 k1_tweets = retrieve_tweets(api, 'Restaurant', 100, 500) #INSERT YOUR CODE HERE
11
12
<ipython-input-7-0d0c87e7c3e9> in retrieve_tweets(api, keyword, batch_count, total_count)
55 )
56
---> 57 tweets += resp.json()['statuses']
58 ids = [tweet['id'] for tweet in tweets]
59 max_id_str = str(min(ids))
KeyError: 'statuses'
它应该已经顺利完成到500次,之前我已经多次测试过关键字“ statuses”。
此外,这是在推文收集阶段的不同时间随机发生的,有一段时间我设法完成了第一组500条推文。但是然后,在第二组的收集过程中会弹出此错误 另外,当此错误弹出时,我将无法再使用键“状态”,直到我关闭编辑器并再次运行它。
这是在错误发生之前和之后我始终运行的简单测试。
a = api.request('search/tweets', {'q': 'Fun', 'count':'10'})
a1 = a.json()
a1['statuses']
答案 0 :(得分:0)
您使用dict.get
来获取键statuses
的值,如果不存在该键,则返回None
,其他键则提供键statuses
的值
tweets += resp.json().get('statuses')
if tweets:
ids = [tweet['id'] for tweet in tweets]
max_id_str = str(min(ids))
number_of_tweets = len(tweets)
答案 1 :(得分:0)
Twitter的JSON响应并不总是包含statuses
。您还需要处理包含errors
键的响应。错误响应记录在此处https://developer.twitter.com/en/docs/ads/general/guides/response-codes.html
此外,您的代码使用resp.json()
来获取此JSON结构。很好,但是您也可以使用TwitterAPI
随附的迭代器。迭代器将迭代statuses
或errors
中包含的项目。这是用法:
resp = api.request('search/tweets', {'q':'pizza'})
for item in resp.get_iterator():
if 'text' in item:
print item['text']
elif 'message' in item:
print '%s (%d)' % (item['message'], item['code'])
您可能还不知道的另一件事是TwitterAPI
带有实用程序类,该实用程序类将连续发出请求并为您跟踪max_id
。这是一个简短的示例https://github.com/geduldig/TwitterAPI/blob/master/examples/page_tweets.py