使用BeautifulSoup爬取API遇403错误,浏览器可正常访问求解决
解决Prizepicks API请求403错误的方案
你的403错误确实是请求头配置问题,加上会话验证缺失导致的,以下是具体修复步骤:
1. 修正请求URL
你代码里定义了带筛选参数的pp_props_url,但实际请求的是无参数的url,接口地址不匹配会直接影响请求结果,先统一使用正确的带参数URL(也可以用params单独传递参数)。
2. 清理无效请求头
你添加的Access-Control-Allow-Credentials是服务器响应头,不需要放在请求里;Sec-Fetch-Site、Sec-Fetch-Mode是浏览器自动生成的字段,手动添加反而可能触发反爬拦截,直接删掉这些冗余字段。
3. 补充关键请求头 & 处理会话Cookie
Prizepicks的API需要验证会话权限,你可以先请求官网主页获取有效Cookie,再用同一个会话请求API;同时添加X-Requested-With字段,标识这是AJAX请求,很多站点会通过这个字段验证请求合法性。
修改后的代码示例:
import requests import pandas as pd # 目标API地址(带筛选参数) target_url = 'https://api.prizepicks.com/projections?league_id=7&per_page=250&single_stat=true' # 精简后的有效请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Accept': 'application/json; charset=UTF-8', 'Referer': 'https://app.prizepicks.com/', 'X-Requested-With': 'XMLHttpRequest' # 关键标识字段 } # 创建会话,先访问主页获取会话Cookie session = requests.Session() session.get('https://app.prizepicks.com/', headers=headers) # 用同一个会话请求API r = session.get(target_url, headers=headers) # 检查响应状态并处理数据 print(r.status_code) if r.status_code == 200: df = pd.json_normalize(r.json()['data']) print(df.head()) else: print(f"请求失败,状态码:{r.status_code}")
额外提示
- 如果还是报错,打开浏览器开发者工具(F12),找到API请求的完整请求头,把
Cookie字段完整复制到请求头中(注意Cookie有有效期,过期后需要重新复制)。 - 避免频繁发起请求,必要时添加请求间隔,防止IP被封禁。
内容的提问来源于stack exchange,提问作者Shared Westover
相关产品推荐
相关产品推荐

