Python 3.x 如何修复KeyError';状态';收集推文的时候?
当我偶然发现这个错误时,我正在使用TwitterAPI收集用户的推文 因为我计划抓取至少500条具有不同属性的tweet,并且每个查询最多只返回100条tweet,所以我创建了一个函数Python 3.x 如何修复KeyError';状态';收集推文的时候?,python-3.x,twitter,Python 3.x,Twitter,当我偶然发现这个错误时,我正在使用TwitterAPI收集用户的推文 因为我计划抓取至少500条具有不同属性的tweet,并且每个查询最多只返回100条tweet,所以我创建了一个函数 !pip安装TwitterAPI 从TwitterAPI导入TwitterAPI 导入json 消费者密钥=#输入你的消费者密钥 CONSUMER_SECRET=#输入您的CONSUMER_SECRET OAUTH_令牌=#输入您的OAUTH_令牌 OAUTH_TOKEN_SECRET=#输入您的OAUTH_TO
!pip安装TwitterAPI
从TwitterAPI导入TwitterAPI
导入json
消费者密钥=#输入你的消费者密钥
CONSUMER_SECRET=#输入您的CONSUMER_SECRET
OAUTH_令牌=#输入您的OAUTH_令牌
OAUTH_TOKEN_SECRET=#输入您的OAUTH_TOKEN_SECRET
api=TwitterAPI(使用者密钥、使用者密钥、OAUTH令牌、OAUTH令牌密钥)
我的函数是这样运行的:
def retrieve_tweets(api、关键字、批次计数、总计数):
tweets=[]
批次计数=str(批次计数)
resp=api.request('search/tweets',{'q':'keyword',
“计数”:“批次计数”,
"郎":"恩",,
“结果类型”:“最近”,
}
)
#将推文存储在列表中
tweets+=resp.json()['status']
#查找下一批的最大id值
ids=[tweet['id']用于tweets中的tweet]
max_id_str=str(min(ids))
#循环,直到收集到的tweet数与总tweet数相同
tweets的数量=len(tweets)
当推文数量<总计数:
打印(“{}条推文是为关键字{}收集的。最后一条推文是在{}创建的”。格式(推文数量,关键字,推文[推文数量-1]['created_at']))
resp=api.request('search/tweets',{'q':'keyword',#插入您的代码
“计数”:“批次计数”,
"郎":"恩",,
'结果类型':'最近',
“max_id”:“max_id_str”
}
)
tweets+=resp.json()['status']
ids=[tweet['id']用于tweets中的tweet]
max_id_str=str(min(ids))
tweets的数量=len(tweets)
打印(“{}条推文是为关键字{}收集的。最后一条推文是在{}创建的”。格式(推文数量,关键字,推文[推文数量-1]['created_at']))
返回推文
之后,我按如下方式运行函数:
first_group=retrieve_tweets(api,'Rock',100500)
它一直运行良好,直到第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'
您可以使用
dict.get
获取键状态的值
,如果键不存在,则返回None
,其他将给出键状态的值
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)
来自Twitter的JSON响应并不总是包含
status
。您还需要处理包含错误
键的响应。错误响应记录在这里
此外,您的代码使用resp.json()
来获取此json结构。这很好,但是您也可以使用TwitterAPI
附带的迭代器。迭代器将迭代包含在状态
或错误
中的项目。用法如下:
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
。这里有一个简短的例子Hi@a-quan,我看到你没有接受我的答案,我的代码中有什么东西对你不起作用吗?对不起,我的错。我昨天有点忙,忘了回复你的评论。代码仍然有点愚蠢,所以我的计划是在批准答案之前运行一些测试。所以,我第一次运行您的代码时,它运行得非常出色。再运行几次后,它突然停止并再次弹出相同的错误。在这件事发生后,我关闭了所有的程序,并尝试了原始的代码,令我惊讶的是,这段代码实际上是有效的。然后今天,就在最近,原来的一个再次失败,并且您的代码运行良好。因此,我现在的计划可能是按照下面的注释建议更改我的方法。我的代码只不过是一个检查,以确保只有当状态键存在时才从中获取值,仅此而已,您的代码运行良好,然后失败,然后,我的代码工作与此之外的其他事情有关,我建议使用像Pycharm这样的IDE来调试代码。不管怎样,如果我的代码运行良好,你能重新标记我的答案吗?另外,代码的工作/非工作状态循环仅在运行之间的一段时间后发生。Tysm用于回答。你的评论给了我很多新信息。这真的很有帮助,我一定会尝试将这些新信息应用到我的代码中。