JavaScript批量拉取美国议员JSON文件合并遇CORS错误求解
跨域拉取美国议员JSON数据解决方案
问题本质
你遇到的报错是浏览器同源策略导致的CORS限制,只有在浏览器环境运行的前端JS发起请求时才会触发,所有前端调用的fetch、d3.json方法都会被该规则拦截,设置no-cors也只能拿到opaque类型的空响应,无法读取实际数据。
可行方案
方案1:本地服务端脚本爬取(最推荐,适合批量拉取)
直接使用Python、Node.js等本地脚本发起请求,不受浏览器同源策略限制,可直接完成拉取、处理、合并导出全流程,示例Python代码如下:
import requests import json import time # 补全所有需要拉取的议员ID member_ids = ["F000061", "F000062", "F000063", "F000064", "F000091", "F000092"] base_url = "https://bioguide.congress.gov/search/bio/{}.json" all_members = [] for mid in member_ids: try: resp = requests.get( base_url.format(mid), # 模拟浏览器UA避免被拦截 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" }, timeout=15 ) resp.raise_for_status() all_members.append(resp.json()) print(f"已完成ID:{mid} 拉取") # 控制请求频率,避免被封IP time.sleep(1) except Exception as e: print(f"ID:{mid} 拉取失败,错误信息:{str(e)}") # 导出整合后的全量JSON文件 with open("congress_members_full.json", "w", encoding="utf-8") as f: json.dump(all_members, f, ensure_ascii=False, indent=2)
运行前需先安装依赖:pip install requests
方案2:CORS代理(适合必须在前端环境运行的场景)
在请求URL前拼接CORS代理服务前缀,代理服务会在返回结果中添加跨域头,即可绕过浏览器限制:
// 可使用本地搭建的代理,或者公共CORS代理(公共代理稳定性无保障) const proxy = "https://cors-anywhere.azm.workers.dev/" const url = "https://bioguide.congress.gov/search/bio/F000061.json" fetch(proxy + url) .then(res => res.json()) .then(data => console.log(data)) .catch(err => console.error(err))
方案3:浏览器跨域插件(适合临时测试)
安装Chrome/Edge插件「Allow CORS: Access-Control-Allow-Origin」,开启后即可直接在前端发起请求,无需修改代码。
注意事项
- 批量拉取时请控制请求频率,避免对目标站点服务器造成压力,触发IP封禁
- 该站点数据为公开数据,拉取请遵守相关使用规范
内容的提问来源于stack exchange,提问作者console.log
相关产品推荐
相关产品推荐

