借助Excel Power Query与API分页机制,自动化抓取多页基金数据 📅 2026/7/15 4:27:19 1. Power Query与API分页机制基础如果你经常需要从网站上抓取基金数据可能会遇到一个头疼的问题数据被分成很多页显示。手动复制粘贴不仅效率低下还容易出错。这时候Excel的Power Query功能配合API分页机制就能派上大用场。Power Query是Excel内置的数据获取和转换工具它最大的优势是可以自动化处理重复性数据任务。我刚开始接触基金数据分析时曾经花了一整天时间手动复制了某只基金3年的历史净值数据结果第二天发现数据源更新了又得重新来过。后来学会了Power Query同样的工作现在只需要点几下鼠标就能完成。API分页是大多数数据接口采用的常见机制。比如一个基金历史数据接口可能这样设计https://api.example.com/fund?code005827page1per_page20这里的page参数表示页码per_page表示每页显示的记录数。要获取全部数据我们需要循环请求所有页面并将结果合并。2. 分析API分页结构在开始之前我们需要先搞清楚目标API的分页机制。以天天基金网为例打开开发者工具(F12)查看网络请求你会发现类似这样的请求{ data: { content: 净值数据表格HTML, records: 650, pages: 33, curpage: 1 } }关键信息包括总记录数(records): 650条总页数(pages): 33页当前页(curpage): 第1页有了这些信息我们就可以设计自动化抓取方案了。在实际操作中我建议先用Postman或浏览器直接访问API链接确认返回的数据结构和分页参数是否如预期。3. 创建基础查询让我们从创建一个基础查询开始打开Excel选择数据选项卡点击获取数据→从其他源→自网站输入API地址例如https://fundf10.eastmoney.com/F10DataApi.aspx?typelsjzcode005827per20page1第一次尝试时我遇到了数据无法正确解析的问题。后来发现是因为返回的数据包含HTML和JSON混合内容。解决方法是在Power Query编辑器中对原始文本进行清洗提取出需要的JSON部分。成功导入第一页数据后建议立即将查询重命名为有意义的名称比如FundData_Page1。良好的命名习惯会让后续工作轻松很多。4. 参数化查询设置要实现自动分页我们需要将查询参数化在Power Query编辑器中点击管理参数新建两个参数fundCode(文本类型默认值005827)pageNumber(数字类型默认值1)修改原始查询将固定值替换为参数let Source Json.Document(Web.Contents(https://fundf10.eastmoney.com/F10DataApi.aspx?typelsjzcode fundCode per20page Number.ToText(pageNumber))), data Source[data], // 后续数据处理步骤... in data参数化过程中最常见的错误是类型不匹配。比如page参数需要字符串但如果你传入的是数字就会导致请求失败。我建议在拼接URL时显式转换数据类型就像上面代码中的Number.ToText那样。5. 创建自定义函数接下来我们将参数化查询转换为可重用的函数在查询编辑器中右键点击你的查询选择创建函数命名为GetFundDataByPage函数将自动继承查询中的参数创建函数后你可以像使用内置函数一样调用它。例如GetFundDataByPage(005827, 2)这将获取易方达蓝筹精选混合(005827)的第2页数据。在实际项目中我建议为函数添加错误处理。因为网络请求可能会失败良好的错误处理能让你的查询更健壮(page) try let Source Json.Document(Web.Contents(https://fundf10.eastmoney.com/F10DataApi.aspx?typelsjzcode005827per20page Number.ToText(page))), data Source[data] in data otherwise null6. 生成页码列表并获取全部数据现在到了最精彩的部分 - 自动获取所有页面数据新建一个空白查询生成页码列表let // 假设总页数为33 PageCount 33, PageList List.Numbers(1, PageCount) in PageList将列表转换为表格在查询编辑器中选择转换→到表将列重命名为Page添加自定义列调用之前创建的函数Table.AddColumn( #转换的表格, FundData, each GetFundDataByPage(005827, [Page]) )展开FundData列获取实际数据这里有个实用技巧你可以先测试前几页确认无误后再获取全部数据。我曾经因为一个小错误导致重复请求了上百页数据不仅浪费时间还可能被API限制访问。7. 数据清洗与整合获取到原始数据后通常需要进一步清洗日期格式转换基金净值日期需要转换为Excel可识别的日期格式数值处理百分比数据(如日增长率)需要去除百分号并转换为小数错误处理处理可能的空值或异常数据类型转换确保每列数据类型正确清洗数据的M代码示例 Table.TransformColumns( #展开的FundData, { {净值日期, each Date.From(DateTimeZone.From(_)), type date}, {单位净值, Number.From, type number}, {日增长率, each Percentage.From(Text.Replace(_, %, )/100), type number} } )8. 构建可复用的数据模板将以上步骤整合我们可以创建一个通用的基金数据获取模板创建一个控制面板工作表用于输入基金代码等参数使用Excel表格存储配置信息如API基础地址、每页记录数等编写一个主查询自动计算总页数并获取所有数据添加刷新按钮方便更新数据进阶技巧你可以使用Excel的Data Model功能将多只基金的数据存储在同一个模型中方便比较分析。我在分析基金组合时这个功能帮了大忙。9. 常见问题与解决方案在实际使用中你可能会遇到以下问题问题1API请求限制解决方案添加延迟 between 请求或分批获取数据问题2数据量太大导致Excel变慢解决方案考虑使用Power Pivot或导入到Data Model问题3API返回结构变化解决方案添加数据验证步骤并在结构变化时发出警告问题4身份验证问题解决方案在查询中正确设置Headers参数我曾经遇到一个棘手的问题某天API突然开始返回错误数据但因为缺乏验证步骤我直到分析结果明显异常才发现。现在我的每个查询都会先检查数据基本完整性。10. 扩展应用场景掌握了这个技巧后你不仅可以获取基金数据还能应用于电商平台商品列表抓取新闻资讯聚合社交媒体数据分析任何支持分页API的数据源比如我曾经用类似方法从某电商平台抓取了上万条商品评论数据用于价格监控分析。整个过程完全自动化每天只需点击一次刷新就能获取最新数据。最后提醒一点在使用公开API时请务必遵守网站的使用条款合理安排请求频率避免对对方服务器造成过大压力。