使用requests调用JSON接口抓取Taleo职位信息触发JSONDecodeError的求助
Taleo招聘接口JSONDecodeError排查方案
报错Expecting value: line 1 column 1 (char 0)的本质是响应内容第一个字符就不符合JSON格式要求(要么为空、要么是HTML错误页、要么是压缩乱码),优先按以下步骤排查:
第一步:打印原始响应定位根因
不要直接调用response.json(),先输出以下核心信息:
response.status_code:确认请求状态,4xx/5xx状态码基本都会返回非JSON的错误页response.headers.get("Content-Type"):确认响应声明的类型,是否为application/jsonresponse.text[:500]:查看响应前500个字符,直接判断是空白、HTML、乱码还是有效JSON开头
高频坑点(按出现概率排序)
- 缺失Taleo专属请求头:Taleo的异步接口普遍要求携带
X-Requested-With: XMLHttpRequest头,未携带该字段时服务器会直接返回HTML格式的页面而非JSON数据 - 请求体格式不匹配:绝大多数旧版Taleo接口的POST请求体要求是
application/x-www-form-urlencoded格式,而非application/json。不要把请求体字典转成JSON字符串发送,直接将字典传给requests.post()的data参数即可 - 请求上下文不合法:Taleo会校验请求的
Referer是否为对应搜索页的完整URL,同时必须携带完整的会话Cookie(尤其是JSESSIONID类的会话标识),缺漏任意一项都会被服务器拦截返回空响应 - 手动覆盖编码配置:如果手动在请求头中设置了
Accept-Encoding,可能导致requests无法自动解压服务器返回的gzip压缩内容,出现乱码导致解析失败。调试阶段不要手动设置该字段,让requests自动处理即可 - 接口URL错误:确认从Network面板复制的接口URL没有遗漏路径参数、未额外拼接无关查询参数,避免请求到404页面返回HTML
最小调试代码模板
import requests # 初始化会话,自动管理Cookie上下文 session = requests.Session() # 按浏览器实际请求复制完整请求头,不要遗漏字段 headers = { "User-Agent": "你实际浏览器的UA字符串", "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Referer": "你访问的Taleo招聘搜索页完整URL", "X-Requested-With": "XMLHttpRequest" } # 把所有Cookie键值对更新到会话,不要塞到请求头里避免格式错误 session.cookies.update({ "JSESSIONID": "你从浏览器复制的会话ID值", # 补充所有其他Cookie键值对 }) # 发起POST请求 response = session.post( "你从Network面板复制的完整接口URL", headers=headers, data={ # 直接传POST表单参数键值对,不要用json.dumps处理 "参数1": "参数值1", "参数2": "参数值2" } ) # 先输出调试信息 print("状态码:", response.status_code) print("响应类型:", response.headers.get("Content-Type")) print("响应预览:", response.text[:500]) # 确认响应符合要求后再解析为JSON if response.status_code == 200 and "application/json" in response.headers.get("Content-Type", ""): job_detail = response.json() # 后续数据处理逻辑 else: print("响应不符合预期,根据上述调试信息修正请求参数")
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

