如何在收集推文时修复KeyError的“状态”?

时间:2019-04-29 04:23:06

标签: python-3.x twitter

当我偶然发现此错误时,我正在使用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']

2 个答案:

答案 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随附的迭代器。迭代器将迭代statuseserrors中包含的项目。这是用法:

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