Python自动登录网站出现JSONDecodeError问题求助
核心错误根源
json.decoder.JSONDecodeError 表明你尝试解析的响应内容不是有效的JSON格式——要么是res.content为空字符串,要么服务器返回了非JSON的内容(比如HTML错误页、无意义文本),导致json.loads()无法完成解析。
具体诱因及修复方案
请求未成功,返回异常状态码
当用户名密码错误、请求参数不合法或被网站反爬拦截时,服务器通常会返回4xx/5xx状态码,此时响应内容是错误提示页而非预期的JSON令牌。
修复:在解析前先校验请求状态,添加异常抛出逻辑:res = s.post('https://domainNamePostUrl', json=payload) # 若状态码非200,直接抛出异常终止流程 res.raise_for_status()响应内容为空
网络波动、请求被拦截等情况会导致服务器返回空内容,json.loads()自然无法解析空字符串。
修复:把print(res.content)移到解析代码之前,先查看真实返回内容:res = s.post('https://domainNamePostUrl', json=payload) print("实际响应内容:", res.content) # 先确认返回值 s.headers.update({'authorization': json.loads(res.content)['token']})请求参数格式不匹配接口要求
部分网站登录接口只接受表单格式(application/x-www-form-urlencoded)的参数,你用json=payload会发送application/json格式数据,不符合接口预期导致返回错误内容。
修复:改用data参数提交表单数据:res = s.post('https://domainNamePostUrl', data=payload)缺少必要请求头被拦截
多数网站会校验User-Agent等请求头,模拟浏览器标识,缺失会被判定为爬虫,返回非预期内容。
修复:在创建Session后添加模拟浏览器的请求头:s = requests.Session() s.headers.update({ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' })网站存在反爬验证(验证码、前置Cookie)
若网站需要验证码、或必须先访问首页获取特定Cookie才能登录,直接发送账号密码请求会被拦截,返回空或错误内容。
修复:手动登录一次,用浏览器开发者工具查看登录请求的完整参数、Cookie、请求头,确保代码复刻所有必要信息。
内容的提问来源于stack exchange,提问作者Farhan

