我有一个python脚本,当我的请求返回一个空白JSON响应时失败。代码在函数中反复循环,99%的情况下是成功的,但是当接收到空白JSON响应时,每隔一段时间就会失败。
i = 0
while i < 1000:
r = 0
while r < 4:
time.sleep(5)
response = c.get_quote(symbol)
jsonData = response.json()
for key in jsonData:
jsonkey = key
if jsonkey == symbol:
print (i)
print("you are good", response)
print(jsonData)
print ()
break
else:
print("you have a problem, jsonkey=")
print()
print (jsonData)
print()
r =+ 1
current_price = response.json()[symbol]["lastPrice"]
i += 1
The 'While r <4:在尝试添加错误处理时添加了'循环'。如果我能弄清楚要捕获什么,我会重试response = c.get_quote(symbol)
,但空白的JSON响应正在滑过if jsonkey == symbol
逻辑。
收到的错误消息是"current_price = response.json()[symbol]["lastPrice"]KeyError:"NVCR">
和print (jsonData)的输出是:{}与正常响应相反,正常响应包含符号作为键,后跟附加数据。请求返回一个响应[200],所以不幸的是,它不是那么简单…
不使用jsonkey == symbol
验证密钥,而是使用try-except
块捕获空白响应错误并处理它们。
例如:
i = 0
while i < 1000:
time.sleep(5)
response = c.get_quote(symbol)
jsonData = response.json()
try:
for key in jsonData:
jsonkey = key
if jsonkey == symbol:
print (i)
print("you are good", response)
print(jsonData + "n")
break
except:
print("you have a problem n")
print (jsonData + "n")
current_price = response.json()[symbol]["lastPrice"]
i += 1
@DeepSpace在评论中也可能是正确的。我的猜测是,你从(nsetools?)提取json数据的服务器正在限制你的请求,所以它可能值得在他们的文档中深入研究,看看你是否能找到一个限制,然后使用time.sleep()
保持在它之下。
编辑:如果你正在使用nsetools,他们的api似乎是通过对nse网站构建的api进行逆向工程构建的,并对url执行json api调用,比如这个(这些可以在这个源代码文件中找到)。因此,没有记录利率限制是什么,因为这些数据是直接从NSE中抓取的,并受其利率限制的约束。使用这些数据违反了NSE的使用条款(除非他们有印度政府的明确书面同意,据我所知,nsetools有,但我假设你没有。)
好吧,感谢@DeepSpace和@CarlHR,我想我有一个解决方案,但似乎仍然有太多的代码,我想要完成的。如此:
i = 0
while i < 1000:
r = 1
while r < 5:
time.sleep(1)
response = c.get_quote(symbol)
jsonData = response.json()
try:
current_price = response.json()[symbol]["lastPrice"]
print ("Looks Good, moving on")
break
except KeyError:
print ("There was an problem with the JSON response,
trying again. retry number:", r)
print (jsonData)
print ()
r += 1
i += 1
print ("Moving on to the next iteration")