如何用Python通过SODA API获取NASA陨石数据集全部45716行数据?
获取完整的NASA陨石着陆数据集
你遇到的情况其实是因为data.nasa.gov底层使用的Socrata API有默认返回限制:它只会返回前1000条记录,这是平台为平衡服务器负载设置的规则。要拿到全部45716行数据,这里有几种靠谱的解决方法:
方法1:直接设置$limit参数一次性获取
Socrata API支持用$limit参数指定返回的最大记录数,你可以直接把它设为数据集的总条数(45716),这样就能一次性拿到所有数据:
import requests import pandas as pd # 直接指定limit为总记录数 response = requests.get('https://data.nasa.gov/resource/gh4g-9sfh.json?$limit=45716') meteor_data = response.json() df = pd.DataFrame(meteor_data) print(df.shape) # 输出应该是 (45716, 13) 左右
如果你不确定总条数,还可以先请求一次基础URL,从响应头的X-Total-Count字段里拿到准确的总记录数,再动态设置limit:
import requests import pandas as pd base_url = 'https://data.nasa.gov/resource/gh4g-9sfh.json' # 先获取总记录数 response = requests.get(base_url) total_count = int(response.headers['X-Total-Count']) # 请求全部数据 full_response = requests.get(f'{base_url}?$limit={total_count}') meteor_data = full_response.json() df = pd.DataFrame(meteor_data)
方法2:分页获取(适合超大规模数据集)
如果数据集特别大,一次性请求可能会超时或者触发速率限制,你可以用$offset参数分页获取,每次请求1000条,循环直到拿到所有数据:
import requests import pandas as pd import time base_url = 'https://data.nasa.gov/resource/gh4g-9sfh.json' limit_per_page = 1000 current_offset = 0 all_meteor_data = [] # 先获取总记录数 response = requests.get(base_url) total_count = int(response.headers['X-Total-Count']) while current_offset < total_count: # 构造分页请求URL page_url = f'{base_url}?$limit={limit_per_page}&$offset={current_offset}' page_response = requests.get(page_url) page_data = page_response.json() all_meteor_data.extend(page_data) # 更新偏移量,加个小延迟避免触发速率限制 current_offset += limit_per_page time.sleep(0.5) df = pd.DataFrame(all_meteor_data) print(df.shape)
方法3:直接读取CSV版本(最简单)
其实还有更省心的方法:直接用pandas读取数据集的CSV下载链接,这个链接没有1000行的限制,能直接拿到完整数据:
import pandas as pd # 直接读取完整CSV文件 df = pd.read_csv('https://data.nasa.gov/api/views/gh4g-9sfh/rows.csv?accessType=DOWNLOAD') print(df.shape)
这个方法不需要处理API的参数,代码最简洁,推荐优先尝试。
内容的提问来源于stack exchange,提问作者Dhruv Chaudhary
相关产品推荐
相关产品推荐

