使用Python Requests模块爬取网站图表数据返回空结果求助
以下是针对请求返回空结果的具体排查和修复步骤:
检查请求数据的提交方式
如果你在浏览器中看到请求的Content-Type是application/json,代码中应该使用json=post_data而非data=post_data。data参数默认会以表单编码(application/x-www-form-urlencoded)发送数据,和原请求格式不匹配会导致后端无法解析,返回空结果。修改后的请求代码:results_post = r.post(postURL, json=post_data, cookies=search_cookies, headers=headers, verify=False)补全请求头信息
仅携带User-Agent可能不够,网站可能会校验其他请求头字段,比如Referer、X-Requested-With(通常为XMLHttpRequest,标识AJAX请求)、Content-Type等。打开浏览器开发者工具的请求头面板,复制所有非自动生成的字段到headers字典中,比如:headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", "Referer": "https://xxx.com/xxx", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/json" }改用Session维持会话
手动获取Cookie可能会遗漏部分由JS动态设置的会话信息,使用requests.Session()可以自动管理Cookie,更贴近浏览器的会话流程:import requests as r session = r.Session() session.verify = False session.headers.update(headers) # 先访问目标页面,初始化会话Cookie session.get(postURL) # 发送POST请求 results_post = session.post(postURL, json=post_data)验证请求数据的完整性和格式
对比浏览器载荷中的所有字段,确保post_data包含所有必填参数,字段名、大小写、数据类型(比如数字/字符串、数组/对象)完全一致。如果原请求载荷是JSON字符串,要确保post_data是Python字典而非字符串(用json=post_data会自动序列化)。查看完整响应内容
不要直接调用json(),先打印响应状态码和原始文本,排查问题:print(results_post.status_code) print(results_post.text)如果状态码是403/401,说明存在反爬或权限校验;如果返回HTML页面而非JSON,可能是请求URL错误或触发了验证机制。
检查是否需要CSRF Token
部分网站会要求请求携带CSRF Token,通常可以在页面的HTML中找到(比如<meta name="csrf-token" content="xxx">)。先通过GET请求获取页面,提取Token后加到请求头或请求数据中。
内容的提问来源于stack exchange,提问作者fabla

