如何在Google Sheet单工作表中抓取424页共4231行数据
解决Google Sheets批量抓取多页数据的方案
方法1:数组公式结合分页URL(快速实现,适合小批量页数)
IMPORTHTML本身不支持自动分页抓取,我们可以通过构造带分页参数的URL,结合MAP函数批量调用该公式。
目标网站的分页参数为page,例如第2页的URL是https://www.screener.in/screens/41109/all-stocks/?page=2。使用以下公式生成全量页码的抓取请求:
=MAP(SEQUENCE(424), LAMBDA(page, IMPORTHTML("https://www.screener.in/screens/41109/all-stocks/?page="&page, "table")))
注意事项:
- 一次性发起424次
IMPORTHTML请求可能触发Google Sheets性能限制,建议分批执行(例如先抓取1-100页,再处理后续页码)。 - 若返回结果出现错位或空行,可手动调整公式范围或分批合并数据。
方法2:Google Apps Script(稳定高效,适合大规模页数)
针对424页的海量数据,脚本方案能避免公式的性能瓶颈,同时灵活处理反爬限制。
操作步骤:
- 打开目标Google Sheet,点击顶部菜单栏扩展程序 > Apps 脚本。
- 删除默认代码,粘贴以下脚本:
function fetchAllStockData() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); const baseUrl = "https://www.screener.in/screens/41109/all-stocks/?page="; const totalPages = 424; // 可选:清空现有数据,按需注释或保留 sheet.clearContents(); for (let page = 1; page <= totalPages; page++) { const url = baseUrl + page; try { const response = UrlFetchApp.fetch(url); const html = response.getContentText(); const doc = HtmlService.createHtmlOutput(html).getContent(); // 定位目标表格(若页面有多个表格,需调整选择器,如"table.table-name") const table = doc.querySelector("table"); if (!table) { console.log(`第${page}页未找到表格,跳过`); continue; } const rows = table.querySelectorAll("tr"); const data = []; rows.forEach((row, index) => { // 第一页保留表头,后续页面跳过重复表头 if (page > 1 && index === 0) return; const cells = row.querySelectorAll("td, th"); const rowData = Array.from(cells).map(cell => cell.textContent.trim()); data.push(rowData); }); // 将数据追加到工作表末尾 if (data.length > 0) { const lastRow = sheet.getLastRow(); sheet.getRange(lastRow + 1, 1, data.length, data[0].length).setValues(data); } // 延迟1秒,避免触发网站反爬机制 Utilities.sleep(1000); } catch (error) { console.log(`抓取第${page}页失败:${error.message}`); // 遇错暂停5秒后继续 Utilities.sleep(5000); } } SpreadsheetApp.getUi().alert("数据抓取完成!"); }
- 点击脚本编辑器顶部保存,命名项目(如"StockDataFetcher")。
- 点击运行,首次运行需完成权限授权,按提示操作即可。
- 等待脚本执行完成,完成后会弹出提示,工作表将填充所有页面的数据。
注意事项:
- 可根据网站反爬强度调整延迟时间(如将
1000改为2000,即2秒)。 - 若页面表格结构变更,需修改
querySelector的参数(指定表格类名或ID)。 - 若数据量过大,可拆分
totalPages为多个批次(如先跑1-100页,再跑101-200页),避免脚本超时。
内容的提问来源于stack exchange,提问作者Solanki Rajesh
相关产品推荐
相关产品推荐

