Google表格脚本正常运行失败但调试正常,请求信息异常求助
解决Google Sheets脚本随机触发网站验证的问题
嘿,这个随机触发验证的问题我之前做类似的Google Sheets数据爬取时也碰到过——大概率是网站的反爬机制把你的批量请求当成机器人了。毕竟60个连续请求加上Google Apps Script默认的请求特征太“规整”,很容易被识别。下面是几个亲测有效的解决思路:
1. 给请求加随机延迟,模拟人类操作节奏
网站对短时间内的高频请求特别敏感,你可以在每个请求之间加个1-3秒的随机延迟,别用固定间隔,不然还是容易被抓。代码示例:
tokens.forEach((token) => { // 随机延迟1000-3000毫秒(1-3秒) Utilities.sleep(Math.floor(Math.random() * 2000) + 1000); // 你的请求逻辑写在这里... });
注意:Google Apps Script单脚本运行时间不能超过6分钟,所以要算好总延迟时间,别超了。
2. 自定义请求头,伪装成真实浏览器
默认的Google Apps Script请求头里的User-Agent是一眼就能认出的机器人标识,你可以换成主流浏览器的UA,甚至每次请求随机换一个:
// 准备几个真实浏览器的User-Agent列表 const userAgents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0" ]; // 每次请求随机选一个UA const randomUA = userAgents[Math.floor(Math.random() * userAgents.length)]; // 发起请求时带上自定义headers const response = UrlFetchApp.fetch(yourRequestUrl, { headers: { "User-Agent": randomUA, "Accept-Language": "en-US,en;q=0.9", // 加个语言头更真实 "Referer": "https://目标网站域名.com/" // 如果有需要,设置请求来源页 } });
3. 拆分请求批次,避免一次性跑完60个
如果一次性处理60个请求压力太大,可以分成多个小批次,比如每次处理10个,用Google Sheets的时间驱动触发器分批次执行。具体步骤:
- 把你的tokens数组存在Sheet的某一列里,比如A列,同时用B列标记是否已成功获取数据
- 写一个脚本,每次只处理B列标记为“未完成”的前10个token
- 设置触发器,每10分钟运行一次这个脚本
这样既避免了单脚本超时,也大幅降低了短时间内的请求密度,不容易被拦截。
4. 加重试机制,应对偶尔的验证触发
如果还是偶尔会碰到验证,可以在代码里加个重试逻辑,当返回"Error!"时,重试1-2次(记得重试前加延迟):
function fetchWithRetry(requestUrl, options, maxRetries = 2) { let attempt = 0; while (attempt < maxRetries) { try { const response = UrlFetchApp.fetch(requestUrl, options); // 这里可以根据网站的验证页面特征判断是否触发了验证 const content = response.getContentText(); if (!content.includes("验证") && !content.includes("Error!")) { return response; } } catch (e) { // 捕获请求异常,比如网络错误 console.log(`请求失败:${e.message}`); } attempt++; Utilities.sleep(3000); // 重试前先等3秒 } return "Error!"; // 多次重试失败再返回错误 }
另外补充一点:如果以上方法都没用,可能是网站对谷歌服务器的IP做了限制(因为Google Apps Script的请求IP是谷歌的),这种情况可以考虑用第三方中转服务,或者换成自己部署的云函数来转发请求,不过操作起来会复杂一点。
内容的提问来源于stack exchange,提问作者5ive8ight
相关产品推荐
相关产品推荐

