使用Python Requests获取JSON却返回HTML的问题求助
解决爬虫返回HTML而非JSON的常见思路
嘿,我明白你遇到的问题了——这种情况在新手写爬虫时超常见,别慌,咱们一步步排查:
1. 核对请求头(Request Headers)
服务器经常会通过请求头判断请求是否来自真实浏览器,而requests库默认的请求头很“朴素”,容易被识别为爬虫。你可以这么做:
- 打开Chrome开发者工具(F12),切换到Network标签,找到那个返回JSON的请求,右键选择「Copy」→「Copy as cURL (bash)」
- 把cURL里的
User-Agent、Accept、Referer这些关键头信息摘出来,放到requests的请求里:
import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "application/json, text/javascript, */*; q=0.01", # 其他你从Chrome里复制的必要头 } response = requests.get("你的目标URL", headers=headers) print(response.json()) # 试试能不能解析成JSON
2. 检查是否需要携带Cookies
有些网站需要验证会话(比如登录状态、临时会话)才会返回JSON数据。你可以:
- 回到Chrome的Network请求详情里,找到「Cookies」标签,把里面的Cookie键值对复制出来,加到请求里:
cookies = { "session_id": "xxx", # 其他你看到的Cookie } response = requests.get("你的目标URL", headers=headers, cookies=cookies)
或者用requests.Session()来维持会话,先模拟访问首页获取Cookies,再请求目标URL。
3. 确认请求方法和请求体
有时候你看到的URL需要用POST方法请求,而不是默认的GET。检查Chrome里的请求方法:
- 如果是POST,还要看「Payload」标签里的参数,可能是form表单格式,也可能是JSON格式:
# 表单格式的POST请求 data = { "key1": "value1", "key2": "value2" } response = requests.post("你的目标URL", headers=headers, data=data) # JSON格式的POST请求 json_data = { "key1": "value1" } response = requests.post("你的目标URL", headers=headers, json=json_data)
4. 排查是否是动态渲染的JSON
如果前面的方法都没用,可能这个JSON是页面加载后通过JavaScript动态生成的,不是直接请求URL返回的。这种情况你可以试试用selenium或者playwright模拟浏览器运行,等待页面渲染完成后提取数据,但这对新手来说稍复杂,先优先排查前面的三个问题。
另外,你可以先打印response.text看看返回的HTML内容里有没有提示(比如“请使用浏览器访问”“需要登录”),这能帮你更快定位问题~
内容的提问来源于stack exchange,提问作者Shelby
相关产品推荐
相关产品推荐

