如何调整现有代码通过API抓取晨星网其他标签页的表格数据
晨星基金tab=1页数据抓取调整方案
核心调整逻辑
你原有代码的鉴权、批量遍历ID、Excel导出框架都可以直接复用,只需要修改for循环内的接口地址和数据解析规则即可,因为你之前拿到的MaaS token是全站通用的,不需要重新做鉴权逻辑。
tab=1页对应晨星的持仓接口,不需要解析HTML页面,直接请求对应后端API就能拿到结构化的JSON数据,比爬HTML表格更稳定。
具体修改步骤
- 原有代码的导入包、Excel初始化、ids列表、headers定义部分完全保留不用改
- 把原来for循环内的接口请求和解析代码替换为下面的内容即可
for api_id in ids: payload = { 'Site': 'dk', 'FC': '%s' % api_id, 'IT': 'FO', 'LANG': 'da-DK',} response = requests.get(auth, params=payload) search = re.search('(tokenMaaS:[\w\s]*\")(.*)(\")', response.text, re.IGNORECASE) bearer = 'Bearer ' + search.group(2) headers.update({'Authorization': bearer}) # 仅修改这里的接口地址为持仓接口 url = f'https://www.us-api.morningstar.com/sal/sal-service/fund/holding/{api_id}/data' jsonData = requests.get(url, headers=headers, params=payload).json() # 提取第一个表格(资产配置表格)的数据 rows = [] # 第一个表格对应holdingStatList下的assetAllocation数据 for item in jsonData.get('holdingStatList', {}).get('assetAllocation', []): row = { '资产类别': item.get('name'), '占比': item.get('value'), '基准占比': item.get('benchmarkValue') } rows.append(row) df = pd.DataFrame(rows) # 给sheet加后缀避免覆盖你之前抓取的因子数据 sheetName = f"{jsonData['id']}_持仓" df.to_excel(writer, sheet_name=sheetName, index=False) print('Finished: %s' % sheetName)
可选补充说明
- 如果需要抓取tab=1下的其他表格,只需要修改解析部分的字段即可,比如股票持仓对应
equityHoldingList、债券持仓对应bondHoldingList - 如果需要同时保留原有因子数据和新的持仓数据,可以写两个for循环,或者在同一个循环里请求两个接口分别存到不同的sheet,不会冲突
内容的提问来源于stack exchange,提问作者Karl Emil Thulstrup
相关产品推荐
相关产品推荐

