Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何修复KeyError';状态';收集推文的时候?_Python 3.x_Twitter - Fatal编程技术网

Python 3.x 如何修复KeyError';状态';收集推文的时候?

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

当我偶然发现这个错误时,我正在使用TwitterAPI收集用户的推文

因为我计划抓取至少500条具有不同属性的tweet,并且每个查询最多只返回100条tweet,所以我创建了一个函数

!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用于回答。你的评论给了我很多新信息。这真的很有帮助,我一定会尝试将这些新信息应用到我的代码中。