如何用Google Sheets的IMPORTXML导入Racemap赛事计时表格?
Google Sheets 导入Racemap赛事表格的解决思路
核心问题分析
你用IMPORTXML失败的原因是:目标页面的表格是React动态渲染的内容,IMPORTXML只能抓取页面初始加载的静态HTML,无法获取JS执行后生成的动态DOM元素,所以直接定位ReactVirtualized__Grid这类动态生成的Div肯定拿不到数据。
可行解决方案
1. 抓取页面的API接口(优先推荐)
打开浏览器开发者工具(F12)→ 切换到「Network」标签→ 刷新页面,筛选「XHR/Fetch」类型的请求,查找返回赛事数据的JSON接口(通常路径包含api、timing等关键词)。找到接口后:
- 若接口返回格式清晰,可直接使用Google Sheets的
IMPORTJSON函数(需先在插件商店安装「IMPORTJSON」插件),示例公式:=IMPORTJSON("找到的API接口URL") - 若接口需要参数或验证,可复制请求的完整URL(包含query参数)尝试导入。
2. 使用Google Apps Script爬取动态数据
如果找不到公开API,可通过脚本提取页面预加载的初始数据(很多React站点会把初始数据存在页面的window.__INITIAL_STATE__变量里):
- 打开Google Sheets→ 点击「扩展程序」→「Apps脚本」
- 替换默认代码为以下示例(需根据实际数据结构调整):
function importRacemapTimingData() { const targetUrl = "https://racemap.com/timing/olympus-mythical-trail_2023-03-13"; const pageHtml = UrlFetchApp.fetch(targetUrl).getContentText(); // 提取页面中预加载的初始状态数据 const stateRegex = /window\.__INITIAL_STATE__ = (.*?);/; const matchResult = pageHtml.match(stateRegex); if (!matchResult) return; const timingData = JSON.parse(matchResult[1]); const raceEntries = timingData.timing?.entries || []; // 将数据写入当前工作表 const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); activeSheet.clearContents(); // 写入表头 if (raceEntries.length > 0) { const headers = Object.keys(raceEntries[0]); activeSheet.getRange(1, 1, 1, headers.length).setValues([headers]); // 写入行数据 const dataRows = raceEntries.map(entry => Object.values(entry)); activeSheet.getRange(2, 1, dataRows.length, headers.length).setValues(dataRows); } } - 点击运行按钮授权权限,执行脚本即可将数据导入表格。
3. 改用第三方爬虫工具导出后导入
如果上述方法都无法实现,可使用支持JS渲染的爬虫工具抓取数据后导出为CSV格式,再直接导入Google Sheets。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

