以下是与之相关的代码的最高位:
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 :(得分: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个(太多请求)。
如果您使用请求第三方库,这很容易:
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)
类型的东西可能是明智的。