Python爬虫实战:逆向解析东方财富网API批量获取基金持仓数据
1. 项目缘起为什么需要自己动手抓取基金持仓在金融数据分析和量化投资领域基金持仓数据是块“硬骨头”也是块“香饽饽”。无论是个人投资者想分析自己持仓基金的调仓动向还是研究员在做行业配置研究抑或是量化策略开发者需要构建因子基金定期报告季报、半年报、年报中披露的前十大重仓股明细都是极其宝贵的一手信息。市面上当然有现成的数据服务比如Wind、Choice等专业金融终端但它们价格不菲对于个人或小团队来说是一笔不小的开销。而像东方财富网这样的财经门户其基金数据中心页面提供了免费、相对及时的数据查询服务。问题在于当你需要批量获取成百上千只基金的持仓数据或者需要回溯历史数据时手动一页页复制粘贴就变得完全不现实效率低下且容易出错。这时Python爬虫技术就成了一个自然而然的解决方案。它能够模拟浏览器行为自动、批量地从东方财富网的基金页面中提取结构化的持仓数据将我们从重复的体力劳动中解放出来把精力集中在更有价值的分析和策略构建上。这个项目就是一次典型的“用技术解决具体业务需求”的实战。2. 目标分析与技术路线规划我们的核心目标是编写一个稳定、高效的Python爬虫程序能够根据给定的基金代码从东方财富网抓取其最新报告期或指定报告期的前十大重仓股数据。要实现这个目标我们需要拆解几个关键问题数据在哪里我们需要找到东方财富网展示基金持仓的准确URL地址和页面结构。数据怎么拿东方财富网对爬虫有何反爬措施我们如何模拟合法请求稳定获取数据。数据怎么提获取到的原始页面通常是HTML或JSON中我们如何精准地定位并提取出股票名称、代码、持仓占比等关键字段。数据怎么存提取后的结构化数据以何种格式如CSV、Excel、数据库保存方便后续使用。基于对东方财富网这类现代网站的分析直接请求HTML页面然后解析如用BeautifulSoup往往不是最优解。因为页面的数据很可能是通过Ajax技术动态加载的真正的数据源是一个返回JSON格式的API接口。我们的技术路线将围绕“寻找并调用这个隐藏的API”来展开。核心工具选型请求库requests。简单易用是发送HTTP请求的首选。需要配合headers模拟浏览器。数据处理库pandas。提取到数据后用pandas进行清洗、转换和保存为表格文件如CSV非常方便。可选异步库aiohttpasyncio。如果需要批量抓取大量基金同步请求会非常慢。使用异步IO可以极大提升效率但这会引入额外的复杂度。对于初学者或数据量不大的情况可以先用同步方案。3. 逆向工程定位东方财富基金持仓API这是整个项目的核心和难点所在。我们不能蛮干需要像侦探一样通过浏览器的开发者工具按F12打开来找到数据真正的来源。操作步骤如下打开目标页面在浏览器中访问一只基金的持仓页面。例如在东方财富网搜索“易方达蓝筹精选混合(005827)”进入其“基金持仓”页面。URL模式通常是http://fundf10.eastmoney.com/ccmx_005827.html。打开开发者工具按F12切换到“Network” (网络)选项卡。刷新页面并捕获请求刷新页面F5观察Network面板中出现的所有网络请求。寻找数据请求在请求列表中重点关注类型Type为XHR或Fetch的请求这些通常是Ajax数据请求。同时在筛选框Filter中输入关键词如ccmx持仓明细的拼音缩写、stock、Position等。分析请求与响应很快你会发现一个名称类似ccmx的请求。点击它查看其“Headers” (请求头)和“Response” (响应)。请求头我们需要复制关键的User-Agent以及可能需要的Referer、Cookie等信息用于在我们的爬虫代码中模拟请求。响应如果响应是JSON格式预览窗口能看到结构化数据并且内容包含股票列表、持仓比例等信息那么恭喜你找到了目标API通过分析多个基金我们可以总结出东方财富基金持仓API的通用模式。一个典型的API URL可能长这样http://fundf10.eastmoney.com/FundArchivesDatas.aspx?typejjcccode005827topline10yearmonthrt0.123456789参数解析typejjcc固定参数表示获取基金持仓。code005827基金代码。topline10获取前N大重仓股通常为10。yearmonth报告期年份和月份留空可能表示最新报告期。指定后可以获取历史持仓。rt一个随机数或时间戳用于防止缓存。注意网站的API接口和参数可能会发生变化。本文描述的URL和参数基于当前知识截止日期前的观察实际开发时务必以你当时在开发者工具中看到的最新信息为准。这是爬虫项目需要长期维护的常态。4. 爬虫核心代码实现与详解找到了API编写爬虫代码就水到渠成了。我们将分步实现一个完整的、健壮的爬虫。4.1 环境准备与请求模拟首先安装必要的库并设置请求头来伪装成浏览器。import requests import pandas as pd import time import json # 定义请求头这是绕过基础反爬的关键 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Referer: http://fundf10.eastmoney.com/, # 表明请求来源有时必须 } def fetch_fund_holding(fund_code): 根据基金代码获取前十大重仓股数据 :param fund_code: 基金代码字符串如 005827 :return: 包含持仓数据的DataFrame如果失败返回None # 构建API URL这里使用了常见的参数格式 url fhttp://fundf10.eastmoney.com/FundArchivesDatas.aspx params { type: jjcc, code: fund_code, topline: 10, year: , month: , rt: str(time.time()) # 添加时间戳防止缓存 } try: response requests.get(url, paramsparams, headersheaders, timeout10) response.raise_for_status() # 检查请求是否成功状态码200 # 东方财富的API返回的数据有时会被一个JavaScript函数包裹需要处理 data_text response.text # 常见格式var apidata{ ... } 或直接就是JSON if apidata in data_text: # 剥离掉 var apidata 和可能末尾的分号 json_str data_text.split(apidata)[1].rstrip(;) data json.loads(json_str) else: # 尝试直接解析为JSON data response.json() except requests.exceptions.RequestException as e: print(f请求失败基金代码 {fund_code}: {e}) return None except json.JSONDecodeError as e: print(f解析JSON失败基金代码 {fund_code} 原始文本: {data_text[:200]}...) return None # 接下来从data中提取股票列表 return data为什么这样设置请求头User-Agent告诉服务器我们是一个“正常的Chrome浏览器”而不是脚本。Referer告诉服务器这个请求是从哪个页面发起的对于一些检查严格的网站是必要的。不加这些很可能直接收到一个错误页面或空数据。4.2 解析数据结构与数据提取上一步我们拿到了data对象现在需要从中找到持仓数据。我们需要仔细分析这个JSON的结构。def parse_holding_data(data, fund_code): 解析从API获取的原始数据提取持仓信息 :param data: API返回的JSON数据 :param fund_code: 基金代码用于标识 :return: 清洗后的DataFrame holding_list [] # 关键需要观察data的实际结构。通常持仓数据在某个深层路径下。 # 例如可能是 data[stock][stockList] 或 data[Datas][fundStocks] # 这里是一个示例路径实际路径需要根据你的调试结果修改 try: # 假设路径是 data[stock][stockList]这是常见情况之一 stocks data.get(stock, {}).get(stockList, []) if not stocks: # 尝试其他可能的路径 stocks data.get(Datas, {}).get(fundStocks, []) if not stocks: print(f基金代码 {fund_code}: 未在常见路径下找到持仓数据) return pd.DataFrame() for stock in stocks: # 提取每个股票的信息字段名也需要根据实际JSON调整 stock_info { 基金代码: fund_code, 报告期: data.get(report, {}).get(name, 未知), # 报告期可能在根目录 股票代码: stock.get(股票代码, stock.get(code, )), 股票名称: stock.get(股票名称, stock.get(name, )), 持仓占比(%): stock.get(持仓占比, stock.get(zdf, stock.get(比例, 0))), # 注意字段名和单位 持股数(万股): stock.get(持股数, stock.get(holdShares, 0)), 持仓市值(万元): stock.get(持仓市值, stock.get(holdMarketValue, 0)), } # 注意东方财富返回的持仓占比可能是字符串如 9.85%需要转换为浮点数 try: pct_str str(stock_info[持仓占比(%)]).replace(%, ) stock_info[持仓占比(%)] float(pct_str) except: stock_info[持仓占比(%)] 0.0 holding_list.append(stock_info) df pd.DataFrame(holding_list) return df except Exception as e: print(f解析数据时发生异常基金代码 {fund_code}: {e}) return pd.DataFrame()调试技巧在编写parse_holding_data函数时最稳妥的方法是先用一只基金测试。在获取到data后使用print(json.dumps(data, indent2, ensure_asciiFalse))将整个JSON结构漂亮地打印出来。然后像在文件管理器中找文件一样一层层地找到包含股票数组的那个键Key。这个步骤无法省略是爬虫开发的基本功。4.3 数据保存与批量抓取框架单只基金的数据抓取解析完成后我们需要保存它并扩展到批量处理。def save_to_csv(df, filenamefund_holdings.csv): 将DataFrame保存到CSV文件采用追加模式 if df.empty: print(数据为空不保存。) return try: # 如果文件不存在写入表头如果存在追加数据且不写表头 df.to_csv(filename, modea, headernot pd.io.common.file_exists(filename), indexFalse, encodingutf-8-sig) print(f数据已保存至 {filename}) except Exception as e: print(f保存文件失败: {e}) def batch_fetch_fund_holdings(fund_code_list, delay1): 批量抓取多只基金的持仓数据 :param fund_code_list: 基金代码列表 :param delay: 每次请求之间的延迟秒防止请求过快被封IP all_holdings [] for i, fund_code in enumerate(fund_code_list): print(f正在处理 ({i1}/{len(fund_code_list)}): {fund_code}) data fetch_fund_holding(fund_code) if data: df parse_holding_data(data, fund_code) if not df.empty: all_holdings.append(df) # 每处理完一只就保存一次防止程序中途出错丢失所有数据 save_to_csv(df, fund_holdings_batch.csv) # 礼貌等待避免给服务器造成压力 time.sleep(delay) # 也可以最后一次性合并保存 # if all_holdings: # final_df pd.concat(all_holdings, ignore_indexTrue) # final_df.to_csv(all_fund_holdings.csv, indexFalse, encodingutf-8-sig) print(批量抓取完成。) # 使用示例 if __name__ __main__: # 测试单只基金 test_code 005827 # 易方达蓝筹精选混合 data fetch_fund_holding(test_code) if data: df parse_holding_data(data, test_code) print(df) save_to_csv(df, single_fund_holding.csv) # 批量抓取示例 my_fund_list [005827, 110022, 000961] # 可以替换成你自己的基金列表 batch_fetch_fund_holdings(my_fund_list, delay2)关于延迟delay的考量设置time.sleep(delay)是网络爬虫的“道德”和“生存”准则。过于频繁的请求会被网站识别为攻击行为导致IP被暂时或永久封禁。对于东方财富这类大型网站建议延迟设置在1到3秒之间。如果需要抓取的数据量极大考虑使用代理IP池来分散请求。5. 实战中的高级问题与应对策略一个能跑起来的爬虫只是开始一个能在生产环境稳定运行的爬虫需要考虑更多。5.1 反爬虫机制与应对东方财富网作为重要财经网站具备一定的反爬能力。除了基础的User-Agent检查还可能包括IP频率限制单位时间内来自同一IP的请求过多会被限制。应对策略除了增加请求间隔delay最有效的方法是使用高质量的代理IP服务并实现IP轮询。请求参数校验API的rt参数可能包含加密逻辑简单的随机数可能失效。应对策略仔细分析网页前端JavaScript看这个参数是如何生成的可能是一个加密函数的结果。如果比较复杂可以考虑使用selenium或playwright这类浏览器自动化工具来渲染完整页面后再提取数据但这会牺牲大量速度。Cookie/Session验证某些关键请求需要携带有效的登录后Cookie。应对策略如果数据需要登录才能查看则需要模拟登录流程获取并维护会话Cookie。对于东方财富的公开持仓数据目前通常不需要。5.2 数据完整性校验与异常处理网络请求充满不确定性必须做好异常处理和数据校验。网络异常使用try...except捕获requests库可能抛出的超时、连接错误等异常并记录日志便于后续重试。数据格式异常API返回的数据结构可能微调。在解析函数中使用.get()方法并提供默认值避免因某个字段缺失导致整个程序崩溃。空数据检查基金可能处于封闭期或刚成立没有持仓数据。解析后要检查DataFrame是否为空。重试机制对于失败的请求可以实现一个简单的重试逻辑例如重试3次。def fetch_with_retry(url, params, headers, max_retries3): for attempt in range(max_retries): try: resp requests.get(url, paramsparams, headersheaders, timeout10) resp.raise_for_status() return resp except requests.exceptions.RequestException as e: print(f请求失败第{attempt1}次重试。错误: {e}) time.sleep(2 ** attempt) # 指数退避延迟 print(f请求失败已重试{max_retries}次。) return None5.3 性能优化从同步到异步当基金列表很长时同步请求一次等一个的总耗时将是请求数 * 单次耗时。使用异步IO可以将等待网络响应的时间利用起来同时发起多个请求。import aiohttp import asyncio async def async_fetch_fund(session, fund_code, semaphore): 异步获取单只基金数据 url http://fundf10.eastmoney.com/FundArchivesDatas.aspx params {type: jjcc, code: fund_code, topline: 10, rt: str(time.time())} async with semaphore: # 使用信号量控制并发数避免瞬间请求过多 try: async with session.get(url, paramsparams, headersheaders, timeoutaiohttp.ClientTimeout(total10)) as response: data_text await response.text() # ... 后续解析逻辑与同步版本类似需要调整为异步函数 ... # 这里简化为返回基金代码和原始文本 return fund_code, data_text except Exception as e: print(f异步请求失败 {fund_code}: {e}) return fund_code, None async def main_async(fund_list): 主异步函数 connector aiohttp.TCPConnector(limit10) # 限制总连接数 semaphore asyncio.Semaphore(5) # 控制每秒并发数 async with aiohttp.ClientSession(headersheaders, connectorconnector) as session: tasks [async_fetch_fund(session, code, semaphore) for code in fund_list] results await asyncio.gather(*tasks) # 处理所有results for code, text in results: if text: # 调用解析函数 pass # 运行异步主函数 # asyncio.run(main_async(your_fund_list))使用异步的注意事项异步编程模型比同步复杂错误处理也更麻烦。对于新手建议先完成并理解同步版本的爬虫在确实面临性能瓶颈时再考虑升级为异步。同时即使使用异步也必须设置合理的并发限制如信号量否则对目标服务器是致命的你的IP也会迅速被封。6. 数据应用与项目扩展思路拿到干净的基金持仓数据只是第一步它的价值在于应用。基础应用个人持仓分析定期运行脚本抓取你持有基金的持仓观察基金经理的调仓动向判断其风格是否漂移。行业/主题监控将持仓股票映射到行业需要额外的股票-行业数据库可以统计某只基金或某类基金如“科技主题基金”对特定行业的配置比例变化。进阶扩展构建因子库对于量化研究可以计算基金的持仓集中度前十大持仓占比之和、持仓换手率比较相邻报告期的股票变化、风格因子暴露基于持仓股票的财务指标等。基金经理行为分析跟踪某位基金经理管理的所有基金分析其整体的选股偏好和行业观点。历史数据回溯修改API的year和month参数系统性地抓取历史所有季度的持仓数据构建一个面板数据集用于学术研究或策略回测。系统化与自动化将爬虫脚本部署到服务器使用cronLinux或任务计划程序Windows定时执行将数据自动存入MySQL、PostgreSQL或MongoDB数据库并连接BI工具如Metabase进行可视化。最后一点个人心得财经数据爬虫稳定比炫技更重要。网站前端一个微小的改版就可能导致你的爬虫失效。因此代码的健壮性异常处理、日志记录和可维护性将URL、解析规则等配置化至关重要。建议将关键参数如API基础URL、请求头、JSON解析路径放在配置文件或常量模块中一旦需要修改只需调整一个地方。此外尊重网站的robots.txt规则合理控制抓取速度是保证项目能长期运行下去的基础。

相关新闻

户外门禁雨天失灵?从IP防护到软件韧性的完整解决方案

户外门禁雨天失灵?从IP防护到软件韧性的完整解决方案

最近在做一个智慧社区项目时,遇到了一个让人头疼的问题:部署在单元楼门口的户外门禁设备,一到下雨天就频繁失灵,要么是屏幕失灵、识别失败,要么是直接断电重启。业主抱怨连连,运维同事更是疲于奔命。经过一…

2026/8/10 2:46:45 阅读更多 →
通行密钥虽好,但新型攻击面不可不防!

通行密钥虽好,但新型攻击面不可不防!

传递通行密钥:无密码认证中的新型攻击面本文分析了针对无密码认证的新型攻击类型,重点关注 Google 的同步通行密钥生态系统以及桌面客户端使用的云端身份验证器。这些攻击展示了受感染端点上的恶意软件如何滥用注册、恢复和设备信任流程,从而…

2026/8/10 19:45:17 阅读更多 →
2026 年程序员就业:Agent 项目能跑 Demo 不难,真正卡住的是权限和日志

2026 年程序员就业:Agent 项目能跑 Demo 不难,真正卡住的是权限和日志

如果你正准备往大模型方向转,《证书、项目和实习,程序员就业到底该先补哪一个?》这类问题别只看热度。更重要的是判断自己该补哪块能力,以及怎么证明你真的会。 摘要 摘要:2026 年的程序员就业市场,大模型…

2026/8/6 22:24:18 阅读更多 →

最新新闻

如何开始使用Potatis:NES模拟器新手入门教程

如何开始使用Potatis:NES模拟器新手入门教程

如何开始使用Potatis:NES模拟器新手入门教程 【免费下载链接】potatis 🥔 MOS-6502 and NES emulator in Rust (SDL/WebAssembly/Android/Embedded/Cloud) 项目地址: https://gitcode.com/gh_mirrors/po/potatis Potatis是一款用Rust语言开发的NE…

2026/8/12 22:33:01 阅读更多 →
Audacity音频编辑器完整指南:从零开始掌握免费音频处理技巧

Audacity音频编辑器完整指南:从零开始掌握免费音频处理技巧

Audacity音频编辑器完整指南:从零开始掌握免费音频处理技巧 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 在数字音频创作的世界里,寻找一款既专业又免费的音频编辑软件常常让新手望而却步…

2026/8/12 22:33:01 阅读更多 →
石家庄网站建设培训班:零基础到实战接单,普通人如何通过技术逆袭实现财富自由

石家庄网站建设培训班:零基础到实战接单,普通人如何通过技术逆袭实现财富自由

说实话,写下这些文字的时候,我脑子里蹦出来的第一个念头就是:这世道变了。真的,太变了。以前我们总听长辈说,“学一门手艺饿不着”,那时候手艺是捏泥人、打铁、做木工,那是真金白银熬出来的硬功夫。现在呢?时代的大轮子滚滚向前,把你我不留情的碾过,再吐出来的时候,…

2026/8/12 22:33:01 阅读更多 →
3步搞定!智能文档处理如何让扫描件变身可编辑文档?

3步搞定!智能文档处理如何让扫描件变身可编辑文档?

3步搞定!智能文档处理如何让扫描件变身可编辑文档? 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置…

2026/8/12 22:33:01 阅读更多 →
Vue3 AI对话项目状态管理:从Pinia到TanStack Query的架构演进

Vue3 AI对话项目状态管理:从Pinia到TanStack Query的架构演进

1. 项目概述:当Vue3遇见AI对话,状态管理的“坑”与“路”最近在折腾一个基于Vue3的AI对话应用,从原型到迭代,状态管理这块着实让我踩了不少坑,最后才算是从Pinia的“泥潭”里走了出来,找到了一条相对清晰的…

2026/8/12 22:33:01 阅读更多 →
从监控到治理:构建APM体系驱动平台稳定性与架构演进

从监控到治理:构建APM体系驱动平台稳定性与架构演进

1. 项目概述:当平台治理遇见应用性能在今天的数字化世界里,无论是支撑亿万级交易的后台系统,还是服务千万用户的移动应用,其稳定与流畅都直接关系到业务的生死存亡。我们常常听到“平台治理”这个词,它听起来宏大而抽象…

2026/8/12 22:32:00 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →