Google Sheets 不仅仅是一个电子表格,与 Google Apps Script(JavaScript 运行时)相结合,它还可以成为一个轻量级的刮擦平台,用于收集公共网络数据、监控价格变化、提取表格和提供仪表盘。
本指南将逐步指导您使用 JavaScript 构建可靠的 Google Sheets 网络刮擦工作流、使其自动化、避免常见障碍并集成代理(包括使用以下提供商的实用方法 OkeyProxy),以减少 403 个错误,提高成功率。
快速说明注意:始终尊重网站的 robots.txt、服务条款和当地法律。将刮擦用于合法的公共数据和研究/监控目的。
什么是使用 Javascript 进行 Google Sheets 网络抓取?
Google Sheets Web scraping JavaScript 是指将 Google Sheets 与 Google Apps Script(一种 JavaScript 环境)结合使用,以编程方式获取网页、提取结构化数据并将数据插入到工作表中。应用脚本提供 UrlFetchApp 来检索内容,而 电子表格应用程序 API 来写入结果。对于许多快速用例来说,这是一种快速、无服务器和免费的方法(在应用程序脚本配额范围内)。
为什么使用谷歌应用脚本(Urlfetchapp)?
- 熟悉的环境:JavaScript 语法,易于上手。
- 没有基础设施:在 Google 服务器上运行,无需管理服务器。
- 整合功能:直接写入 Google Sheets、发送电子邮件、触发器等。
- 日程安排时间驱动触发器:自动进行定期刮擦。
应注意的局限性Apps Script 在 Google 的基础架构上运行(因此请求来自 Google IP 范围),它有执行/时间配额,而且缺乏像 Cheerio 这样强大的内置 HTML 解析库(你可以解决这个问题,或者使用外部代理/中继来完成更繁重的任务)。
- 超越 IMPORTXML:如果您曾尝试在电子表格中抓取数据,您可能会遇到
=IMPORTXML功能。
什么是 IMPORTXML?这是一个内置的 Google Sheets 公式,通过提供 URL 和 XPath(数据 "地图"),可以从特定网站获取数据。例如 =IMPORTXML("https://example.com", "//h1") 会拉出页面的主标题。
虽然这听起来很容易,但在现实世界中却经常失败,主要原因在于。例如,许多现代网站都是 "单页应用"(使用 React 或 Vue 构建)。IMPORTXML 只能读取初始源代码,无法 "等待" JavaScript 加载实际数据。
简单抓取示例:获取 HTML 并写入工作表
一个最小的应用程序脚本,用于获取页面并将标题写入工作表:
function fetchPageTitle() {
const url = 'https://example.com';
const resp = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
const html = resp.getContentText();
const titleMatch = html.match(/([^<]*)/i);
const title = titleMatch ? titleMatch[1].trim() : 'No title found';
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
sheet.appendRow([new Date(), url, title]);
}
这适用于简单的静态页面。对于结构性较强的内容(表格、列表),则需要解析逻辑。
解析 HTML:策略与实例
选项 A - 轻量级 regex/字符串解析
适用于可预测的小型页面。对畸形的 HTML 不适用。
function parseTable(html) {
// 粗糙的示例 - 不要依赖 regex 来处理复杂的 HTML
const rows = html.match(/]*>([\s\S]*?)/gi)|| [];
return rows.map(r => {
const cols = (r.match(/]*>([\s\S]*?)/gi)|| [])
.map(c => c.replace(/]+>/g, '').trim());
返回 cols;
});
}
选项 B - 用于格式良好的 HTML/XML 的 XmlService
XmlService 可以解析 XHTML 或转换为 XML 的整齐 HTML,但许多页面都不是有效的 XML。
选项 C - 将解析工作卸载到外部服务
对于复杂页面,最好的方法是在 Cloud Run 或 Cloud Functions 上运行一个小型解析微服务(Node.js + Cheerio/Puppeteer)。您的应用程序脚本会调用该服务(返回 JSON),而该服务会处理 HTML 解析和反僵尸工作。
处理动态(JS 渲染)内容
许多现代网站通过 JavaScript(AJAX)在客户端呈现内容。UrlFetchApp 仅获取服务器 HTML,不执行页面 JavaScript。
选项:
- 查找 JSON/XHR 端点 并直接调用它(检查 DevTools 中的 "网络 "选项卡)。
- 使用无头浏览器 (Puppeteer 或 Playwright)托管在 Cloud Run/Cloud Functions 上,用于渲染页面并返回 HTML 或 JSON。从应用程序脚本中调用该渲染器。
- 使用第三方渲染服务 (paid) that return fully rendered HTML; ensure compliance.
利用触发器和错误处理实现自动搜索
- 时间驱动触发器:安排每日/每小时的刮擦。
- 指数后退:在 HTTP 429/5xx 上,后退并重试。
- 日志和通知:记录故障并就持续性错误发送电子邮件。
示例创建每日触发器:
函数 createDailyTrigger() {
ScriptApp.newTrigger('fetchPageTitle')
.timeBased()
.everyDays(1)
.atHour(6)
.create();
}
常见封堵问题:IP 信誉、速率限制、验证码
网站会主动阻止通过以下方式进行刮擦
- 知识产权声誉注意:来自已知云提供商 IP(如 Google 的应用程序脚本 IP)的许多请求可能会受到速率限制或阻止。
- 费率限制:短时间内请求过多会触发节流。
- 验证码当行为看起来是自动的或可疑时,就会显示。
主要防御措施
- 尊重
robots.txt 和法律/ToS 限制。
- 在请求之间增加类似人类的延迟。
- 保持请求标头合法 (
用户代理, 接受).
- 使用代理来分散请求来源(更多内容见下文)。
- 避免尝试绕过验证码--在符合要求的情况下,使用官方 API 或人工解析。
利用代理克服障碍--设计与限制
代理可以更改请求的源 IP,这样目标网站就能看到来自不同地址的请求。对于 Google Sheets:
- 重要制约因素:
UrlFetchApp 在谷歌服务器上运行,不提供本地代理主机:端口配置。你不能在 UrlFetchApp 选项中直接设置 SOCKS5 或 HTTP 代理主机。
变通方法:
- 代理中继器/获取器:部署一个小型代理/中继服务(云运行/云功能/VPS),接受来自应用程序脚本的请求,并通过配置的代理(例如 OkeyProxy).应用程序脚本调用中继端点 (
https://your-relay.example.com/fetch?url=...),中继执行代理获取并返回 HTML/JSON。这是最可靠、最灵活的方法。
- 提供商 HTTP 转发 API:有些代理提供商会公开一个 HTTP API 端点,可以代表你获取任意 URL。如果 OkeyProxy 或其他提供商提供认证转发器 API,你可以直接从 Apps Script 调用它(无需中继)。请查阅提供商文档。
安全说明:使用中继时,请确保其安全性(API 密钥、HTTPS),这样只有您的应用程序脚本才能使用它。
Captchas:遇到这些问题时该怎么办
除非获得明确许可,否则不要尝试以编程方式绕过验证码。绕过验证码以逃避保护可能是非法的,而且违反了许多网站的条款。
如果您经常遇到验证码:
- 放慢请求速度。
- 提高 IP 信任度(使用 轮换居民代理 或 静态 ISP 代理 如 OkeyProxy 提供)。
- 对于合法的大规模研究,请联系网站所有者获取访问权限或 API 端点。
- 对于业务工作流程中不可避免的验证码,可使用人工交互服务或官方合作伙伴,并确保合规。
最佳实践(速度、标题、配额、道德规范)
建立一个能正常工作的刮板是一回事,但要确保它保持可靠、受人尊重和不受阻挡,就需要采用更严谨、"像人一样 "的自动化方法。
📜 尊重 robots.txt 和网站 ToS
在提取任何一个字节的数据之前,请务必检查目标网站的规则,只有这样才能确保项目的长期可持续性。
🎭 使用逼真的标题
在 UrlFetchApp 选项中加入标准的 User-Agent、Accept-Language 和 Referer 标头,这样你的请求看起来就像一个标准的浏览器,而不是一个脚本。
⏳ 实施速率限制和抖动
不要一秒钟向服务器发出上千个请求。在获取请求之间实施 "抖动"(随机睡眠间隔),以保持自然的流量模式。
🚦 监控响应和回退
设置逻辑以捕捉 429(请求过多)或 5xx(服务器错误)响应。如果网站提示您放慢速度,请立即听取。
⚖️ 避免侵犯版权
将搜刮到的数据用于内部分析、研究或价格监控,但切勿搜刮受版权保护的资料用于再分发或公共商业用途。
📝 记录和审计触发器
由于 Google Apps 脚本是在后台运行的,因此请保留一份简单的执行时间和错误代码日志,以便快速调试 "静默 "故障。
结论
使用 JavaScript(Apps Script + UrlFetchApp)进行 Google Sheets 网络刮擦是一种实用的解决方案,可用于许多轻量级刮擦和监控任务。
对于阻止数据中心 IP 或经常触发验证码的页面,采用受控代理策略--最好是通过安全中继,使用 OkeyProxy 等信誉良好的供应商提供的住宅/静态 ISP 代理--可显著提高成功率,同时保持工作流程无服务器并与 Sheets 集成。
常见问题
问:Apps Script 能否直接使用代理?
答:否 - UrlFetchApp 不提供内置代理主机/端口设置。请使用中继站或提供商的服务器端 API。
问:搜索网站是否合法?
答:视情况而定。公共数据通常可用于研究和监控,但一定要尊重网站的 ToS 和法律(版权、隐私、反窃取规则)。如有疑问,请联系网站所有者。
问:那验证码呢?
答:使用合法方法:减缓请求速度、提高 IP 信誉(住宅代理)或获取 API 访问权限。避免在未获得明确许可的情况下,尝试通过编程来破解验证码。
滚动到顶部






