gpt4 book ai didi

python - 使用 requests.get().json() 时的 ValueErrors、ProtocolErrors 和 ChunkedEncodingErrors

转载 作者:行者123 更新时间:2023-12-05 05:02:42 32 4
gpt4 key购买 nike

我正在使用 Python 从比特币区 block 链收集数据(交易量、挖矿费用等)。为此,我尝试使用 JSON 查询 blockchain.info 上的各个页面。

导入 json、requests 和 urlopen 后,我的代码开始于:

url = "https://blockchain.info/rawblock/00000000000000000000427c2cbfd8868c5bc987603d2483c9637f052316f89f?"
currentblock = requests.get(url, stream = True).json()
prevhash = str(currentblock['prev_block'])

我选择从最近的 block 开始我的代码(url 中/rawblock/之后的所有内容都是 block 的 ID),然后从 requests.get(url, stream=True) 的输出开始。 json(),我得到链中前一个 block 的 ID(然后在下一个循环/循环中查询)。

我进入一个 for 循环,重复从每个 block 收集信息的过程,获取前一个 block 的 ID,然后继续以这种方式向后查询:

prevhash = str(currentblock['prev_block'])
for num in range(0,2700):
currenthash = prevhash
url = "https://blockchain.info/rawblock/" + currenthash + "?"
print(currenthash)
try:
currentblock = requests.get(url, stream = True).json()
except ValueError:
print(hashnum)
print("Response content is not JSON")
prevhash = currentblock['prev_block']

我设置 try,except 序列的原因是因为在看似随机的时间间隔内,我会收到一个错误,该错误会停止我的程序,该错误表示 requests.get() 的响应不是' JSON。我发现,如果我简单地捕捉到那个错误,程序会再次查询网页,大多数时候,在第二次尝试时,一切正常,程序会继续运行。

但是,我刚刚遇到了一连串令人讨厌的错误,老实说,我不知道它们的含义或如何修复它们。

这是回溯(删除了中间步骤):

Traceback (most recent call last):
File "C:\Users\Vlad\Desktop\lib\site-packages\urllib3\response.py", line 685, in _update_chunk_length
self.chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: b''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
...
File "C:\Users\Vlad\Desktop\lib\site-packages\urllib3\response.py", line 689, in _update_chunk_length
raise httplib.IncompleteRead(line)
http.client.IncompleteRead: IncompleteRead(0 bytes read)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
...
File "C:\Users\Vlad\Desktop\lib\site-packages\urllib3\response.py", line 443, in _error_catcher
raise ProtocolError("Connection broken: %r" % e, e)
urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
...
File "C:\Users\Vlad\Desktop\lib\site-packages\requests\models.py", line 753, in generate
raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

最让我困惑的是这些错误并不一致(也就是说,如果我尝试完全相同的代码,我不会像以前那样在相同的时间/地点出现错误)。这是我第一次使用 JSON 查询,所以我根本不熟悉它,但我不知道为什么错误会以看似随机的间隔发生。

出于好奇,我在上述错误发生之前的链中的那个点重新启动了我的程序——这次没有错误。它一直在毫无问题地运行。

任何帮助将不胜感激,如果我可以更详细地解释我在做什么,请告诉我!

谢谢

最佳答案

使用重试包重试由于网络错误而失败的请求。

import requests
from retry import retry


@retry(exceptions=Exception, tries=5, delay=1)
def get_currentblock(url):
return requests.get(url)


url = "https://blockchain.info/rawblock/00000000000000000000427c2cbfd8868c5bc987603d2483c9637f052316f89f"
currentblock = get_currentblock(url).json()
prevhash = str(currentblock['prev_block'])
for num in range(0,2700):
currenthash = prevhash
url = "https://blockchain.info/rawblock/" + currenthash
print(currenthash)
try:
currentblock = get_currentblock(url).json()
except ValueError:
print(hashnum)
print("Response content is not JSON")
prevhash = currentblock['prev_block']

这将在出现任何 Exception 时以一秒的延迟重试最多五次 get()。您可能希望将 exceptions=Exception 更改为更具限制性,因为您可以更好地了解可能遇到的异常。 get_currentblock() 方法只返回响应而不是 JSON 组件,以避免在 JSON 解析错误时触发重试,即我们只希望在发生网络错误时重试。

另请注意,stream=True 已从 get() 调用中删除,因为它与 json() 结合没有任何效果> 调用,因为在尝试将内容解析为 JSON 对象之前必须接收到整个响应。流式请求用于获取响应内容的迭代器,以便在接收到每一行时对其进行处理,但这不是它在这里的使用方式。

最后,我从 URL 末尾删除了 ??表示后面的查询参数,但没有必要,因为没有查询参数。

关于python - 使用 requests.get().json() 时的 ValueErrors、ProtocolErrors 和 ChunkedEncodingErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009432/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com