
芝加哥交通局(CTA)的 lapi.transitchicago.com API 在浏览器中可正常访问并返回 200,但在 Python 中常因 403 错误失败;实际原因并非缺少 User-Agent 等请求头,而是参数拼写、编码或会话管理不当——正确使用 requests.Session() 并严格按文档传递参数即可稳定获取 JSON 响应。
芝加哥交通局(cta)的 `lapi.transitchicago.com` api 在浏览器中可正常访问并返回 200,但在 python 中常因 403 错误失败;实际原因并非缺少 user-agent 等请求头,而是参数拼写、编码或会话管理不当——正确使用 `requests.session()` 并严格按文档传递参数即可稳定获取 json 响应。
芝加哥交通局(CTA)提供的实时列车到站 API 是一个典型的公共交通数据接口,其设计初衷是供开发者集成至第三方应用。尽管该 API 文档明确要求使用有效 API Key,并支持标准 HTTP GET 请求,但许多开发者在从浏览器迁移到 Python 脚本时遭遇 403 Forbidden 错误,误以为是反爬机制(如缺失 User-Agent 或 Cookie)所致。实际上,CTA 此接口并不校验请求头,403 的根本原因通常是:
- 参数名拼写错误(如
outputType写成outputtype或output_type); - URL 中手动拼接了已编码的
&(HTML 实体),导致服务端解析失败; - 使用了过期、权限不足或未激活的 API Key;
-
mapid值无效或该站点不支持实时数据。
✅ 正确做法是:完全避免手动拼接 URL,始终通过 params 参数由 requests 自动编码;不添加冗余 headers;使用上下文管理的 Session 提升健壮性。
以下为推荐的生产级调用示例:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
import requests
import json
from apikeys import CTA_API_KEY # 建议将密钥存于独立文件,勿硬编码
URL = "https://lapi.transitchicago.com/api/1.0/ttarrivals.aspx"
params = {
"key": CTA_API_KEY, # 必填:注册获取的有效密钥
"mapid": 40380, # 必填:车站 ID(如 Clark/Lake)
"outputType": "JSON", # 注意大小写:必须为 "JSON"(非 "json" 或 "Json")
"max": 5 # 可选:限制返回最多 5 条预测记录
}
try:
with requests.Session() as session:
response = session.get(URL, params=params, timeout=10)
response.raise_for_status() # 自动抛出 4xx/5xx 异常
data = response.json()
print(json.dumps(data, indent=2))
except requests.exceptions.Timeout:
print("❌ 请求超时,请检查网络或增加 timeout 值")
except requests.exceptions.HTTPError as e:
print(f"❌ HTTP 错误:{e},状态码 {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"❌ 请求异常:{e}")
except json.JSONDecodeError:
print("❌ 响应非合法 JSON,请检查 API Key 是否有效或参数是否合规")? 关键注意事项:
立即学习“Python免费学习笔记(深入)”;
- ✅
outputType必须严格为"JSON"(全大写),小写或驼峰均会导致 403; - ✅
mapid必须是 CTA 官方公布的有效车站 ID(可通过 CTA Station List 查询); - ❌ 不要自行对 URL 进行
urllib.parse.quote()编码——requests会自动处理params; - ❌ 避免在 URL 字符串中出现
&(这是 HTML 转义结果,Python 请求中应直接使用&); - ? API Key 应通过环境变量或配置文件加载,切勿提交至版本控制;
- ? 该 API 无速率限制声明,但仍建议添加
timeout=10防止阻塞,并实现简单重试逻辑(如配合tenacity库)。
综上,CTA 到站 API 的 Python 调用失败,90% 源于参数规范性问题而非反爬策略。遵循官方参数命名、借助 requests 的原生参数机制、并做好基础异常处理,即可实现稳定、可维护的数据接入。

















