2017-03-17 65 views
2

下面是与自己相关的代码的最高位:阅读JSON文件有时工作,有时不工作(Python)的

url1 = "https://www.reddit.com/r/todayilearned/new/.json" 
response = urllib.urlopen(url1) 
data = json.loads(response.read()) 
tiloriginal = [] 

    for post in data["data"]["children"]: 
     tilfact = post["data"]["title"] 

那么奇怪的是,我的代码工作正常。但我想喜欢的2/5时间,它给了我下面的错误:

for post in data["data"]["children"]: 
KeyError: 'data' 

当我运行该脚本,虽然再次,它工作正常。但是当我再次运行它时,它会再次出现错误。

这是完全相同的代码正在运行每一次,但只有有时它是否给我这个错误。

任何帮助,为什么这是这种情况?我的代码有问题吗?我的互联网?

+0

也许你查询服务器的那一刻,那个服务器把你的回应弄错了,首先检查它是否为200好,然后检查数据是否存在于字典中 – MrJomp

回答

2

您应该经常检查响应代码。

In [44]: url1 = "https://www.reddit.com/r/todayilearned/new/.json" 

In [45]: requests 
Out[45]: <module 'requests' from '.../env/lib/python3.6/site-packages/requests/__init__.py'> 

In [46]: requests.get(url1) 
Out[46]: <Response [429]> 

In [47]: requests.get(url1) 
Out[47]: <Response [200]> 

In [48]: requests.get(url1) 
Out[48]: <Response [200]> 

In [49]: requests.get(url1) 
Out[49]: <Response [429]> 

In [50]: 

在这里,你可以看到有一些200的(成功)和一些429的(太多请求)。

如果使用请求第三方lib下,这是很容易:

In [52]: r=requests.get(url1) 

In [53]: r 
Out[53]: <Response [429]> 

In [54]: r.status_code 
Out[54]: 429 

所以,你会做什么,然后就是一个while循环,检查(说)3倍或5倍?

喜欢:

r = requests.get(url1) 
status_count = 0 
while r.status_code == 429 and status_count < 3: 
    r = requests.get(url1) 
    status_count += 1 

例如

(我只检查429 - 在这种情况下,太多的要求,因为我不想掩盖其他代码,如404或500等)

噢,还有一件事 - 考虑到这些是429的 - 在这个while语句的开头放置一个import time; time.sleep(1)类型的东西可能很明智。

+0

你能解释一下In [46] Out [46]事情好吗?我是新来的:你是否把它写入你的代码? – chemo

+0

不,这是终端的输出。我使用了一个ipython终端 - 这是非常方便的。它有像Tab完成和其他漂亮的功能,使生活作为开发者更容易,你可以通过安装ipython来安装ipython(如果你已经安装了pip),如果你不确定pip是什么,那就问。 –