【发布时间】:2021-08-10 09:32:47
【问题描述】:
这里是 python 和一般编程的新手,请放轻松,哈哈。
我有一个脚本,它每 60 秒轮询一次区块链 API,以从 JSON API 获取更新的数据。它会轮询最新的活动,然后打印出带有更新的热点编号的新活动。
在过去的 3-4 周里,它一直在完美运行。直到最近 3-4 天左右,我才开始在下面收到此错误。
Traceback (most recent call last):
File "c:\Users\hello\Desktop\Dev\scripts\script-polling1.py", line 77, in <module>
data2 = res1.json()['data']
File "C:\Users\hello\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\requests\models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)
每当它出错时,我只需重新启动它,它会再工作 1-4 小时,然后再次崩溃。
上面的错误显示它在第 77 行停止,这是我对 API 的 json() 调用,但它并不总是一致的,因为我多次调用不同的 json() api URL。它在 json() 出错时会有所不同。
但为了排除故障,这是上面第 77 行的 json()。
for hotspotaddress in data:
foundaddress = hotspotaddress['address']
foundname = hotspotaddress['name']
res1 = requests.get('https://api.url/' + foundaddress + '/activity/count?min_time=-1%20day&bucket=day')
data2 = res1.json()['data'] ##THIS IS LINE 77 where the script crashes##
previous_witness = str(data2['poc_receipts_v1'])
previous_rewards = str(data2['rewards_v2'])
previous_info.append([foundaddress,foundname,previous_witness,previous_rewards])
这是它从中提取的 json 的一个小样本
{
"data": {
"vars_v1": 0,
"validator_heartbeat_v1": 0,
"unstake_validator_v1": 0,
"transfer_validator_stake_v1": 0,
"transfer_hotspot_v1": 0,
a lot more inbetween.
"assert_location_v2": 1,
"assert_location_v1": 0,
"add_gateway_v1": 1
}
}
现在我猜测它一定是 API 数据中的某些东西,因为脚本“确实”工作,并且一旦它有无法识别的数据或其他东西,它就必须崩溃。
我想我的问题是我该如何解决这个问题,因为区块链 API 数据每秒钟/每分钟都在不断变化。阅读数十篇具有相同主题的其他 stackoverflow 文章,但无法确定其中任何一篇文章是否适用于我的问题。我是不是用错了 json()?
非常感谢这个新手的任何帮助!
【问题讨论】:
-
您可以将 json 代码调用包装在 try except 块中。捕获 json 解析错误并打印/记录您尝试解析的数据,以便您可以检查它以查看问题所在。我还建议您检查 request.get 调用是否成功,也许您收到 5xx 或 4xx 错误
-
感谢您的建议。我将研究捕获错误并在发生错误时打印日志。我将不得不弄清楚如何解析 json 错误大声笑。奇怪的是,我让脚本从命令提示符运行,另一个从我的 Visual Studio 代码运行,并且当时只有命令提示符失败,而两者都失败了。有时情况正好相反。
-
我怀疑在它失败的情况下你会得到一些不是 2xx 响应的 http 错误,所以你最终没有真正的 json 数据,所以解析器失败
-
嗨,克里斯。这就说得通了。上面的部分错误是“JSONDecodeError("Expecting value", s, err.value) from None”,我猜当没有返回值时它会出错,但如果有返回值则正常运行。我想我可能需要查看代码以获得 if/else 以防有任何项目返回为空
标签: python json api blockchain