调用myetherapi的JSON RPC接口遇403错误及JSONDecodeError求助
解决403 Forbidden与JSON解析错误的问题
首先,咱们拆解下你遇到的两个核心问题:
- 403响应:这说明服务器直接拒绝了你的请求,通常是因为请求不符合服务器的访问规则(比如反爬机制拦截)。
- JSONDecodeError:因为403返回的内容根本不是JSON格式(大概率是HTML错误提示页面),所以调用
res.json()自然会触发解析报错。
结合你说的「时而能运行时而不行」的情况,大概率是这个API的反爬机制在起作用——比如它会临时限制频繁请求的IP,或者验证请求的User-Agent头(你的请求里没加这个,很容易被识别成非浏览器的脚本请求)。
给你几个具体的修改方案:
1. 添加合法的User-Agent头
很多服务器会拒绝没有User-Agent或者看起来像爬虫的请求,咱们给headers加上一个模拟浏览器的标识:
import requests url = 'https://api.myetherapi.com/eth' headers = { 'content-type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } payload = { "jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8", "latest"], "id": 1 } # 直接用requests的json参数,不用手动dumps,更简洁且不易出错 res = requests.post(url, json=payload, headers=headers) # 先检查响应状态码再处理,避免直接解析报错 if res.status_code == 200: print(res.json()) else: print(f"请求失败,状态码:{res.status_code}") # 打印响应文本,查看服务器返回的具体错误内容 print(res.text)
2. 控制请求频率
如果短时间内多次发起请求,服务器可能会临时封禁你的IP,建议在重复请求之间添加间隔:
import time # 每次请求后等待1秒,避免触发频率限制 time.sleep(1)
3. 排查IP限制问题
你提到关闭电脑后再运行能成功,可能是因为重启后IP发生了变化(如果是动态IP的话),服务器解除了之前的临时限制。如果是固定IP,可能需要确认该API是否有访问白名单或配额限制。
另外,建议你养成先判断响应状态码的习惯,避免直接调用res.json()导致报错,像上面代码里那样,先检查res.status_code == 200再解析JSON,同时打印res.text能帮你快速定位服务器返回的具体问题。
内容的提问来源于stack exchange,提问作者zonzon510
相关产品推荐
相关产品推荐

