POST请求返回HTML而非JSON,Python爬虫无法获取目标JSON数据
解决UMass People Finder POST请求返回HTML而非JSON的问题
我来帮你排查一下问题所在,你遇到的情况很常见——浏览器里能看到JSON,但用requests请求却拿到了页面HTML,通常是因为请求的URL不对或者请求参数/头信息不匹配。
问题分析
你现在请求的是主页面https://www.umass.edu/peoplefinder/,但实际处理搜索请求的API端点大概率是另一个路径。Chrome DevTools里看到的JSON响应,对应的请求URL应该不是这个主页面地址,而是一个专门的接口(比如/peoplefinder/search这类)。
另外,你的请求头和数据格式可能也和浏览器实际发送的不匹配,导致服务器返回了默认的HTML页面而非JSON响应。
解决方案步骤
1. 找到正确的API端点
打开Chrome DevTools的Network标签,重新执行搜索操作,找到返回JSON的那个POST请求,复制它的Request URL。比如这个网站的搜索接口实际是https://www.umass.edu/peoplefinder/search(你可以自己验证一下)。
2. 匹配浏览器的请求头和数据格式
浏览器发送请求时会带上很多必要的头信息,比如User-Agent、Referer,有些接口还要求这些头才能返回正确的响应。另外要注意Content-Type:如果浏览器里看到的是application/x-www-form-urlencoded,那你就不需要用json.dumps,直接传字典格式的data即可。
3. 修正后的代码示例
下面是调整后的代码,你可以根据实际抓到的请求信息修改:
import requests # 替换成你从DevTools里找到的真实API URL url = "https://www.umass.edu/peoplefinder/search" 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', 'Referer': 'https://www.umass.edu/peoplefinder/', 'Content-Type': 'application/x-www-form-urlencoded' # 根据实际情况调整,可能是这个而非application/json } # 如果接口接受表单数据,直接传字典 search_data = {'q': 'Alex'} response = requests.post(url, data=search_data, headers=headers) # 先检查响应状态码,确认请求成功 print(response.status_code) # 再解析JSON content = response.json() print(content)
额外提示
- 如果还是拿到HTML,检查是否需要携带Cookie:有些网站会验证会话Cookie,你可以从DevTools里复制Cookie信息,加到headers里(
'Cookie': 'xxx=xxx; yyy=yyy')。 - 仔细对比浏览器发送的请求和你的代码请求的所有参数(包括Query String、Form Data、Headers),确保完全一致,服务器才会返回预期的JSON响应。
内容的提问来源于stack exchange,提问作者user6422333
相关产品推荐
相关产品推荐

