You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整现有代码通过API抓取晨星网其他标签页的表格数据

晨星基金tab=1页数据抓取调整方案

核心调整逻辑

你原有代码的鉴权、批量遍历ID、Excel导出框架都可以直接复用,只需要修改for循环内的接口地址和数据解析规则即可,因为你之前拿到的MaaS token是全站通用的,不需要重新做鉴权逻辑。
tab=1页对应晨星的持仓接口,不需要解析HTML页面,直接请求对应后端API就能拿到结构化的JSON数据,比爬HTML表格更稳定。

具体修改步骤

  1. 原有代码的导入包、Excel初始化、ids列表、headers定义部分完全保留不用改
  2. 把原来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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:45:00