如何用Google Script(结合Google Spreadsheet)正确抓取HTML页面?
使用Google Script + Google表格抓取HTML页面的正确方法
嘿,我来给你捋清楚怎么用Google Script结合Google表格抓取HTML页面,尤其是你给出的这种带特定class的表格结构的情况~
核心思路
先通过UrlFetchApp获取目标页面的HTML内容,然后解析出你需要的表格数据,最后把清洗好的数据写入Google表格。下面分步骤给你讲,还有现成的代码可以直接用。
步骤1:获取HTML内容
首先得用UrlFetchApp请求目标页面,这里要注意设置请求头模拟浏览器,不然很多网站会直接拦截你的请求(毕竟没人喜欢机器人乱爬)。
步骤2:解析目标表格
你给出的HTML里有个class="table table--decorated"的表格,我们可以用两种方法解析:
方法1:正则表达式(适合结构稳定的简单页面)
如果目标页面的表格结构不会经常变,正则是最直接的方式,不用额外依赖。直接匹配表格、行、单元格,然后清洗掉HTML标签。
方法2:XmlService解析(适合规范的HTML)
如果HTML是标准的XML格式(或者你能简单修复不规范的地方),用Google原生的XmlService会更健壮,不容易因为小的结构变动失效。
完整代码示例
下面是把两种方法结合的完整脚本,直接复制到Google Script编辑器里就能用,记得替换成你的目标URL和表格ID:
function fetchCurrencyRates() { // 替换成你的目标页面URL和Google表格ID const targetUrl = "这里填你要抓取的页面URL"; const spreadsheetId = "你的Google表格ID"; const activeSheet = SpreadsheetApp.openById(spreadsheetId).getActiveSheet(); try { // 1. 发送请求获取HTML,模拟浏览器UA避免被拦截 const requestOptions = { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } }; const response = UrlFetchApp.fetch(targetUrl, requestOptions); const rawHtml = response.getContentText(); // 2. 解析表格数据(这里用正则方法,你也可以换成XmlService方法) const tableData = parseTableWithRegex(rawHtml); // 3. 将数据写入表格 if (tableData.length > 0) { activeSheet.clear(); // 清空原有内容 const writeRange = activeSheet.getRange(1, 1, tableData.length, tableData[0].length); writeRange.setValues(tableData); SpreadsheetApp.getUi().alert("数据抓取成功,已经写入表格啦!"); } else { activeSheet.getRange(1, 1).setValue("没找到目标表格或者有效数据哦"); } } catch (error) { activeSheet.getRange(1, 1).setValue(`抓取出错啦:${error.message}`); console.error("错误详情:", error); } } // 用正则解析表格的辅助函数 function parseTableWithRegex(html) { // 匹配目标表格 const tablePattern = /<table class="table table--decorated">([\s\S]*?)<\/table>/i; const tableMatch = html.match(tablePattern); if (!tableMatch) return []; const tableContent = tableMatch[1]; const rows = []; // 匹配所有行 const rowPattern = /<tr>([\s\S]*?)<\/tr>/gi; let rowMatch; while ((rowMatch = rowPattern.exec(tableContent)) !== null) { const cells = []; // 匹配每行的单元格(th或td) const cellPattern = /<(th|td)[^>]*>([\s\S]*?)<\/\1>/gi; let cellMatch; while ((cellMatch = cellPattern.exec(rowMatch[1])) !== null) { // 清洗单元格内容:去掉HTML标签,修剪空白 const cleanText = cellMatch[2].replace(/<[^>]+>/g, "").trim(); if (cleanText) cells.push(cleanText); } if (cells.length > 0) rows.push(cells); } return rows; } // 用XmlService解析表格的辅助函数(可选) function parseTableWithXmlService(html) { // 简单修复不规范的HTML,转换成合法XML const cleanedHtml = html.replace(/<br>/g, "<br/>") .replace(/<img([^>]+)>/g, "<img$1/>") .replace(/<input([^>]+)>/g, "<input$1/>"); try { const xmlDoc = XmlService.parse(cleanedHtml); const rootElement = xmlDoc.getRootElement(); // 找到class匹配的表格 const targetTables = rootElement.getDescendants().filter(node => { const element = node.getElement(); return element && element.getAttribute("class")?.getValue() === "table table--decorated"; }); if (targetTables.length === 0) return []; // 提取tbody里的行和单元格 const tbody = targetTables[0].getElement().getChildren("tbody")[0]; return tbody.getChildren("tr").map(row => { return row.getChildren().map(cell => cell.getText().trim()); }); } catch (xmlError) { console.error("XML解析出错:", xmlError); return []; } }
关键注意事项
- 请求权限:第一次运行脚本时,需要授权允许脚本访问你的Google表格和发送网络请求,放心,这是Google的安全流程。
- 反爬限制:不要频繁抓取同一个网站,建议用Google Script的时间触发器设置每天/每周抓取一次,避免被网站封禁IP。
- 结构变动:如果目标网站更新了HTML结构(比如改了表格的class),记得及时调整正则或者XmlService的筛选条件。
- 数据清洗:如果单元格里有特殊字符或者多余的空白,记得在清洗步骤里再加处理逻辑。
内容的提问来源于stack exchange,提问作者TSR
相关产品推荐
相关产品推荐

