如何制作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'); } } }
使用步骤
- 打开目标Google表格,点击顶部菜单「扩展程序」→「Apps脚本」
- 将上述代码粘贴到脚本编辑器,把
Sheet1修改为你的实际工作表名称 - 保存脚本,运行
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
相关产品推荐
相关产品推荐

