Google Sheets抓取finviz带分页表格 实现全量数据拉取的方案咨询
该需求可在Google Sheets中完全实现,具体操作步骤如下:
1 构造全部分页请求URL
finviz分页的r参数默认步长为20,代表当前页第一条数据的序号,你可以通过函数批量生成所有分页URL:
- 先提取你现有URL中固定的基础部分(去掉末尾的
r参数),存放在任意空白单元格,例如A1 - 用
SEQUENCE函数生成r参数序列:=SEQUENCE(10,1,1,20),可根据你需要的最大分页数量调整第一个参数(示例为10页共200条数据) - 批量拼接URL:
=A1&"&r="&B1(B1为生成的r参数值),下拉即可得到全部分页请求地址
2 批量拉取合并多页数据
推荐两种实现方案,可根据分页数量选择:
2.1 公式方案(适合分页≤10的轻量场景)
直接用VSTACK+BYROW组合批量拉取合并,无需编写代码,示例公式如下:
=LET( base_url, "https://finviz.com/screener.ashx?v=111&f=cap_smallover,earningsdate_thismonth,fa_epsqoq_o15,fa_grossmargin_o20,sh_avgvol_o750,sh_curvol_o1000,ta_perf_52w10o,ta_rsi_nob50&ft=4&o=perfytd&ar=180", r_list, SEQUENCE(10,1,1,20), page_queries, BYROW(r_list, LAMBDA(r, QUERY(IMPORTHTML(base_url&"&r="&r, "Table", 19), "SELECT Col1,Col2,Col7,Col8,Col9,Col10,Col11 OFFSET 1", 0))), VSTACK({"序号","代码","行业","市值","市盈率","市净率","收益率"}, REDUCE("", page_queries, LAMBDA(acc,cur, IF(acc="", cur, VSTACK(acc,cur))))) )
OFFSET 1作用是去掉每页重复的表头,最后统一添加一次全局表头
2.2 Apps Script方案(更稳定,支持大量分页)
公式拉取多页容易触发Google Sheets请求限制,分页数量多的场景推荐用脚本实现:
- 打开Google Sheets顶部菜单「扩展程序」-「Apps Script」
- 替换默认代码为以下内容:
function pullFinvizData() { const baseUrl = "https://finviz.com/screener.ashx?v=111&f=cap_smallover,earningsdate_thismonth,fa_epsqoq_o15,fa_grossmargin_o20,sh_avgvol_o750,sh_curvol_o1000,ta_perf_52w10o,ta_rsi_nob50&ft=4&o=perfytd&ar=180"; const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("数据汇总"); // 提前新建名为「数据汇总」的工作表 let allData = [["序号","代码","行业","市值","市盈率","市净率","收益率"]]; // 表头和你需要的列对应 let r = 1; while(true) { const url = `${baseUrl}&r=${r}`; const response = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); if (response.getResponseCode() !== 200) break; const tables = response.getContentText().match(/<table[^>]*>[\s\S]*?<\/table>/g); if (!tables || tables.length < 19) break; // 第19个table为筛选结果表 const rows = tables[18].match(/<tr[^>]*>[\s\S]*?<\/tr>/g); if (!rows || rows.length <= 1) break; // 只有表头说明无更多数据 // 提取需要的列 for (let i = 1; i < rows.length; i++) { const cols = rows[i].match(/<td[^>]*>[\s\S]*?<\/td>/g)?.map(c => c.replace(/<[^>]+>/g, '').trim()); if (!cols || cols.length < 11) continue; allData.push([cols[0], cols[1], cols[6], cols[7], cols[8], cols[9], cols[10]]); } r += 20; Utilities.sleep(1000); // 避免请求过快被站点限制 } // 写入数据到工作表 sheet.clearContents(); sheet.getRange(1, 1, allData.length, allData[0].length).setValues(allData); }
- 保存项目,首次运行时按照提示授权权限即可。
3 配置3分钟自动更新
- 公式方案:Google Sheets默认外部数据更新间隔为1小时,要缩短到3分钟可添加一个辅助单元格写入
=NOW(),然后进入「文件-设置-计算」,将「重新计算」设置为「每分钟更改和更新」,公式中引用该辅助单元格即可触发高频更新 - Apps Script方案:在Apps Script左侧菜单点击「触发器」-「添加触发器」,选择
pullFinvizData函数,事件源选择「时间驱动」,类型选择「分钟计时器」,间隔设置为每3分钟,保存即可生效
4 对接Notion集成
直接使用Notion自带的Google Sheets同步功能即可:打开Notion目标数据库,点击右上角「...」-「同步」-「选择Google Sheets」,选中你存放finviz数据的表格和对应工作表,设置同步频率即可完成数据对接。
内容的提问来源于stack exchange,提问作者james williams
相关产品推荐
相关产品推荐

