如何从目标JSON接口抓取并提取全部学校数据?
解决方案
1. 定位批量获取学校数据的API
你当前调用的是单个学校详情接口(URL中带uuid参数),要获取全量学校数据,需要找到网站加载学校列表的接口:
- 打开Chrome开发者工具的Network面板,刷新网站首页后点击页面搜索按钮(无需输入关键词),观察XHR/fetch请求,会发现类似
https://schulfinder.kultus-bw.de/api/schools/search的POST请求,这就是批量获取学校列表的接口。 - 该接口的请求体通常包含分页、排序参数,示例payload如下:
{ "page": 0, "size": 100, "sort": ["name", "asc"], "filters": {} }
2. 批量获取数据的Python代码示例
以下代码模拟列表接口请求,遍历所有分页获取完整数据:
import requests import json # 批量学校列表接口URL list_api_url = "https://schulfinder.kultus-bw.de/api/schools/search" headers = { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } all_schools = [] current_page = 0 page_size = 100 # 每页获取数量,可根据API限制调整 while True: request_payload = { "page": current_page, "size": page_size, "sort": ["name", "asc"], "filters": {} } response = requests.post(list_api_url, headers=headers, json=request_payload) response_data = response.json() # 提取当前页的学校数据 page_schools = response_data.get("content", []) if not page_schools: break # 无更多数据,终止循环 all_schools.extend(page_schools) current_page += 1 print(f"已获取第 {current_page} 页,累计收集 {len(all_schools)} 所学校") # 将全量数据保存到本地JSON文件 with open("bw_all_schools.json", "w", encoding="utf-8") as f: json.dump(all_schools, f, ensure_ascii=False, indent=2) print("所有学校数据已保存至 bw_all_schools.json")
3. 补充说明
- 请求头适配:如果请求被拦截,需从Network面板复制完整请求头(如
Referer、X-Requested-With)添加到代码的headers中。 - 分页参数调整:部分接口可能用
offset/limit替代page/size,需根据实际请求参数修改。 - 获取完整详情:列表接口返回的是精简数据,若需要单个学校的完整信息,可遍历列表中每个学校的
uuid,调用你原有的单个学校API补充数据。
内容的提问来源于stack exchange,提问作者Yankzz
相关产品推荐
相关产品推荐

