Python爬虫下载JSON报JSONDecodeError如何让循环继续执行?
问题原因
你遇到的json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)报错,是请求返回的响应内容为空或者不是合法JSON格式导致的,一般就是文件缺失、404、反爬拦截这类场景触发的。你之前加try...except报缩进错误,通常是代码缩进层级没对齐导致的语法问题。
修复后可直接运行的代码
import json import requests from time import sleep # 你之前的其他变量定义保持不变 x1、today2、link_append、headers、path 这些都保留原来的就行 RACE_L = x1["pageProps"]["initialState"]["racecards"]["races"][today2] for r1 in RACE_L: id_race = r1["uuid"] link2go = link_append + id_race + '.json' n1 = "races" n12 = "races" n2 = r1["uuid"] name1 = n12 + '-' + n2 name1 = today2 + '_' + name1 + '.json' try: print('正在爬取 %s' % link2go) r3 = requests.get(link2go, headers=headers, timeout=10) sleep(2) # 先判断请求是否成功,非200直接进入异常处理逻辑 r3.raise_for_status() # 解析JSON,内容不合法时会触发JSONDecodeError x3 = r3.json() # 同时捕获JSON解析失败、请求本身失败两类常见异常(404、超时、连接错误等都包含在内) except (json.decoder.JSONDecodeError, requests.exceptions.RequestException): print('爬取 %s 失败,跳过当前项' % name1) # 跳过后续写入逻辑,直接进入下一轮循环爬取下一个目标 continue # 走到这里说明JSON解析成功,再打开文件写入,避免生成无效空文件 with open(path +'%s' % name1,'w',encoding='utf-8') as f2: print('正在写入 %s 到文件' % name1) json.dump(x3, f2, indent=4, ensure_ascii=False)
改动说明
- 调整了执行顺序:先完成请求、JSON解析校验,确认内容合法后再打开本地文件写入,避免生成无效的空JSON文件
- 明确捕获
JSONDecodeError和请求相关异常,触发异常时打印提示后直接continue跳过当前项,不会中断整个循环 - 额外增加了响应状态码校验、请求超时设置,进一步提升代码稳定性,避免其他异常导致脚本终止
内容的提问来源于stack exchange,提问作者Paul R
相关产品推荐
相关产品推荐

