You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作Google Apps Script实现链接与XPath批量抓取网站数据

替代批量IMPORTXML的Google Apps Script实现

之前使用约300个IMPORTXML函数时,表格运行速度严重变慢。下面是一个Google Apps Script解决方案,可逐行遍历表格,通过第1列的链接和第2列的XPath抓取目标数据,并写入第3列。

示例数据

链接XPath
https://cbcmustangs.com/sports/mbkb/2023-24/schedule/html/body/main/div/div[1]/div[3]/div[1]/div[2]
https://columbiacougars.com/sports/mens-basketball/schedule/2023-24/html/body/form/main/article/div[3]/div/div[2]/ul/li[1]/span[2]

实现脚本

function customImportXML() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('Sheet1'); // 替换为你的工作表名称

  // 获取表格所有数据范围
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();
  
  // 从第2行开始遍历(假设第1行是表头)
  for (var i = 1; i < values.length; i++) {
    var url = values[i][0]; // 第1列的目标链接
    var xpath = values[i][1]; // 第2列的XPath规则
    
    if (url && xpath) {
      try {
        // 请求目标网页内容
        var response = UrlFetchApp.fetch(url);
        var content = response.getContentText();

        // 解析内容为XML格式(注:仅支持规范XML,不规范HTML可能解析失败)
        var document = XmlService.parse(content);
        var root = document.getRootElement();
        
        // 通过XPath提取文本内容
        var result = XmlService.get(xpath, root).getText();
        
        // 将结果写入当前行的第3列
        sheet.getRange(i + 1, 3).setValue(result);
      } catch (e) {
        // 捕获错误并记录提示信息
        sheet.getRange(i + 1, 3).setValue('错误:' + e.toString());
      }
    } else {
      // 若链接或XPath为空,标记提示
      sheet.getRange(i + 1, 3).setValue('缺少链接或XPath');
    }
  }
}

使用步骤

  1. 打开目标Google表格,点击顶部菜单「扩展程序」→「Apps脚本」
  2. 将上述代码粘贴到脚本编辑器,把Sheet1修改为你的实际工作表名称
  3. 保存脚本,运行customImportXML函数(首次运行需完成权限授权)

优化建议

  • HTML解析问题:XmlService仅支持严格XML,多数网页是不规范HTML,会导致解析失败。可改用HtmlService配合DOM解析,示例如下:
    // 替换原解析和XPath部分
    var doc = HtmlService.createHtmlOutput(content).getContent();
    var element = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    var result = element ? element.textContent : '未找到匹配内容';
    
  • 批量写入提升速度:避免循环中逐个调用setValue,可先将所有结果存入数组,最后一次性写入表格:
    // 初始化结果数组
    var results = Array(values.length).fill(['']);
    // 在循环中赋值:results[i] = [result];
    // 最后批量写入:sheet.getRange(1, 3, results.length, 1).setValues(results);
    
  • 配额限制:注意UrlFetchApp的每日请求配额,避免因批量请求触发限制。

内容的提问来源于stack exchange,提问作者jarmoc07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:54