如何使用Array formula减少大批量数据的importxml请求数
问题说明
- 当前逐行使用的抓取公式:
=index(importxml("https://niftyinvest.com/max-pain/"&A2&"?expiry="&B1,"//h6[@class='center-align padding-10 black darken-2 white-text']"),1,2) - 表格基础配置:
- A列共存储近200个股票名称作为抓取参数
- B1为固定值,对应期权每月最后一周的到期日期,例:2022年6月30日
- 核心需求:寻找适配的
ARRAYFORMULA数组公式实现方案,减少总请求数,提升数据拉取效率,确认可行路径。
可行实现路径
首先明确:直接给原有IMPORTXML公式外层套ARRAYFORMULA无法实现预期效果——Google Sheets原生的IMPORT类函数不支持在数组运算中自动遍历拼接多个URL发起请求,硬套公式只会重复返回第一个URL的抓取结果。
可落地的降请求提速方案有3种:
- 方案1:批量构造XPath实现单请求拉取(请求数最低,提速最明显)
把A列所有有效股票代码拼接为多节点匹配的XPath规则,仅用1次IMPORTXML请求拉取所有标的对应到期日的目标h6节点内容,再通过文本拆分、正则提取函数把结果按行和A列股票对齐。该方案可以把原来200次请求压缩到1次,只要目标站点单标的页面结构统一,就能稳定运行。 - 方案2:自定义Apps Script批量抓取函数(兼容性最好)
写一个自定义数组函数,内部调用UrlFetchApp.fetchAll方法并行发起所有标的的页面请求,相比逐单元格IMPORTXML的串行加载,速度可以提升数倍,还能自定义缓存规则、请求头,降低被站点限流的概率。写完后直接用=自定义函数名(A2:A,B1)的形式,就能一次性返回所有行的抓取结果,不需要逐行填公式。 - 方案3:分批拉取+缓存折中方案(无代码门槛)
如果不想写脚本,可以把A列200个股票分成4-5组,每组搭配一个IMPORTXML拉取组内所有标的数据,同时开启表格的缓存计算规则,设置定时触发器每日/每小时固定刷新数据,避免每次打开表格都重新发起全部请求,也能大幅降低加载等待时间。
注意:所有外部抓取操作需要遵守目标站点的访问规则,不要短时间发起过高频率的请求,避免IP被站点封禁。
内容的提问来源于stack exchange,提问作者Brijesh
相关产品推荐
相关产品推荐

