如何识别Python Requests请求所需元素?Blibli接口调用失败排查
问题分析与解决方法
一、先修正代码里的基础错误
你写的代码里,判断请求是否成功的逻辑错了——不能直接拿resp对象和200比较,得用resp.status_code == 200,否则判断逻辑完全失效。先把这个改了:
import requests resp = requests.get('https://www.blibli.com/backend/content/promotions/blm-ranch-market') if resp.status_code == 200: print(resp.json()) else: print(f"请求失败,状态码:{resp.status_code}")
二、可能缺失的关键请求元素
浏览器能成功但requests调用失败,大概率是你漏了浏览器会自动携带的核心请求头,常见的有这些:
- User-Agent:服务器靠这个识别请求来源,requests默认的User-Agent很容易被识别为爬虫,必须换成浏览器的真实值。
- Referer:部分接口会校验请求的来源页面,得带上该接口所在的网站首页或父页面地址。
- Accept:指定客户端能接收的内容类型,浏览器的Accept头会明确包含
application/json,而requests默认的可能不够精准。 - Cookie:你说带了Cookie但还是失败,要确认是不是完整的有效Cookie——浏览器里的Cookie可能包含会话ID、CSRF令牌等多个字段,漏了任何一个关键字段都可能被拒绝。
- 自定义请求头:有些网站会加类似
X-Requested-With: XMLHttpRequest的头,标记这是AJAX请求,没有的话服务器直接拒绝。
三、精准确定请求所需的必要元素
直接对比浏览器和requests的请求差异是最靠谱的方法,步骤如下:
- 用Chrome抓包查看真实请求:
- 打开Chrome,按F12打开开发者工具,切换到「Network」标签页。
- 在浏览器里刷新那个接口页面,找到对应的GET请求,点击它查看「Headers」详情。
- 复制浏览器的完整请求头:
- 找到「Request Headers」部分,把所有字段复制下来(注意不要复制
Host,requests会自动处理)。
- 找到「Request Headers」部分,把所有字段复制下来(注意不要复制
- 在requests中完整模拟请求:
- 把复制的请求头整理成字典,传给
requests.get的headers参数,示例代码:import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://www.blibli.com/', # 替换成你从浏览器复制的完整Cookie 'Cookie': 'your_full_valid_cookie_here' } resp = requests.get('https://www.blibli.com/backend/content/promotions/blm-ranch-market', headers=headers) if resp.status_code == 200: print(resp.json()) else: print(f"请求失败,状态码:{resp.status_code}") print(resp.text) # 打印服务器返回的内容,通常能看到具体错误原因
- 把复制的请求头整理成字典,传给
- 逐步排查必要字段:
- 如果模拟成功,就逐个删除请求头里的字段,直到请求失败,这时被删除的就是必要元素——这样能精准找出服务器要求的所有关键头。
另外,如果以上方法都不行,注意查看resp.text的内容,服务器一般会返回具体的拒绝原因,比如「缺少必要请求头」「会话过期」等,根据提示再针对性调整。
内容的提问来源于stack exchange,提问作者Halim stack
相关产品推荐
相关产品推荐

