如何用Python从动态URL自动下载加州医疗CSV文件?
动态获取Medi-Cal FFS Provider CSV的Python方案
加州公共医疗网站基于CKAN开放数据框架,我们可以通过它的API动态获取最新的CSV资源URL,无需硬编码固定ID和日期:
实现步骤
- 调用CKAN的数据集详情API,获取该数据集下的所有资源信息
- 筛选出CSV格式的资源,通过更新时间排序确保拿到最新版本
- 用筛选得到的URL执行下载
完整代码
import requests from datetime import datetime # 数据集API端点,直接用网页URL末尾的标识名即可 DATASET_API_URL = "https://data.chhs.ca.gov/api/3/action/package_show?id=profile-of-enrolled-medi-cal-fee-for-service-ffs-providers" DOWNLOAD_FOLDER = "C:/Users/xxx/Downloads/" def get_latest_csv_url(): # 请求数据集详情 response = requests.get(DATASET_API_URL) response.raise_for_status() dataset_data = response.json() # 筛选所有CSV格式的资源 csv_resources = [ res for res in dataset_data['result']['resources'] if res['format'].lower() == 'csv' ] # 按最后更新时间倒序排序,取最顶部的最新资源 csv_resources.sort( key=lambda x: datetime.strptime(x['last_modified'], "%Y-%m-%dT%H:%M:%S.%f"), reverse=True ) if not csv_resources: raise ValueError("未找到CSV格式的资源") return csv_resources[0]['url'], csv_resources[0]['name'] def download_csv(url, save_path): with requests.get(url, stream=True) as r: r.raise_for_status() with open(save_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) if __name__ == "__main__": try: csv_url, csv_name = get_latest_csv_url() save_path = f"{DOWNLOAD_FOLDER}{csv_name}" download_csv(csv_url, save_path) print(f"已成功下载最新文件到:{save_path}") except Exception as e: print(f"下载失败:{str(e)}")
代码说明
- 无需硬编码数据集/资源ID,直接复用网页URL里的数据集标识名即可
- 通过
last_modified字段排序,确保每次拿到的都是最新的CSV文件 - 保存时保留官方原文件名(带日期),也可自行修改为固定名称
- 加入异常处理,方便排查请求或下载时的问题
定时执行
如果要每周自动运行,可通过Windows任务计划程序或Linux的cron来配置定时触发该Python脚本。
内容的提问来源于stack exchange,提问作者santosh kumar
相关产品推荐
相关产品推荐

