使用GET请求调用API爬取网页时遭遇Validation Error问题求助
解决API 403权限错误的方案
你遇到的403错误是因为目标API设置了反爬验证,仅允许来自网站自身上下文的请求。以下是具体解决步骤:
1. 添加浏览器请求头并维护会话
API会验证请求的来源和环境,需要模拟浏览器的请求头,同时通过会话携带网站设置的Cookie。修改后的代码如下:
import requests import time from datetime import date clinic_data = {} column_names = ["Name", "Address", "City", "State", "Zipcode", "Email", "Phone Number", "Specialties"] coordinates = [ (40.750742, -73.99653), # 10001 (New York, NY) (33.973951, -118.248405), # 90001 (Los Angeles, CA) (41.88531, -87.621238), # 60601 (Chicago, IL) (29.775186, -95.31022), # 77001 (Houston, TX) (25.787676, -80.224145) # 33101 (Miami, FL) ] zipcodes = [ "10001", # New York, NY "90001", # Los Angeles, CA "60601", # Chicago, IL "77001", # Houston, TX "33101" # Miami, FL ] # 模拟Chrome浏览器的请求头 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", "Referer": "https://www.dysportusa.com/find-a-specialist", "Accept": "application/json, text/plain, */*" } # 创建会话,先访问目标页面获取Cookie session = requests.Session() session.get("https://www.dysportusa.com/find-a-specialist", headers=headers) for i in range(len(coordinates)): latitude = coordinates[i][0] longitude = coordinates[i][1] zipcode = zipcodes[i] api_url = f"https://www.dysportusa.com/api/find-a-specialist?latitude={latitude}&longitude={longitude}&take=100&radius=150&zipToSortBy={zipcode}" try: # 用会话发送请求,自动携带Cookie和请求头 r = session.get(api_url, headers=headers).json() print(r) # 添加1秒延迟,避免请求过快触发拦截 time.sleep(1) except Exception as e: print(f"第{i+1}次请求失败: {str(e)}") continue
2. 关键验证项说明
- User-Agent:伪装成标准浏览器,避免被识别为爬虫脚本;
- Referer:证明请求是从目标网站的
find-a-specialist页面发起的,符合API的访问上下文要求; - Session会话:先访问页面获取网站设置的会话Cookie,API可能依赖这些Cookie验证用户合法性;
- 请求延迟:短时间内大量请求会触发网站的频率拦截,添加
time.sleep()降低请求密度。
3. 额外排查方向
如果上述方法仍无效,打开浏览器开发者工具(F12),切换到Network标签,找到网站调用API的请求,对比你的请求头是否缺少其他字段(比如X-Requested-With、CSRF Token等),将缺失的字段补充到请求头中即可。
内容的提问来源于stack exchange,提问作者michaelkim25
相关产品推荐
相关产品推荐

