Google Apps Script中UrlFetchApp请求网站返回403错误的解决咨询
使用Google Apps Script的UrlFetchApp抓取https://www.financecharts.com/stocks/AAPL/all-metrics/时遭遇403错误,代码如下:
try { var content4 = UrlFetchApp.fetch("https://www.financecharts.com/stocks/" + ticker + "/all-metrics/").getContentText(); //other code here } catch (error) { Logger.log('Error fetching data: ' + error); return null; }
收到的错误提示:
Error fetching data: Exception: Request failed for https://www.financecharts.com returned code 403. Truncated server response: Just a moment...<meta htt... (use muteHttpExceptions option to examine full response)
403错误意味着服务器拒绝了你的请求,大概率是因为请求没有模拟正常浏览器行为,或者触发了网站的反爬机制。可以尝试以下几个方案:
- 添加浏览器请求头:服务器会校验请求的
User-Agent等标识,添加这些字段让请求更贴近真实浏览器的请求。修改后的代码示例:
try { const options = { 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", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5" } }; const content4 = UrlFetchApp.fetch(`https://www.financecharts.com/stocks/${ticker}/all-metrics/`, options).getContentText(); // 后续代码 } catch (error) { Logger.log('Error fetching data: ' + error); return null; }
- 启用
muteHttpExceptions查看完整响应:按照错误提示开启这个参数,能获取服务器返回的全部内容,判断是否需要处理人机验证:
try { const options = { muteHttpExceptions: true, 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(`https://www.financecharts.com/stocks/${ticker}/all-metrics/`, options); Logger.log(response.getResponseCode()); Logger.log(response.getContentText()); // 打印完整响应内容,排查问题 const content4 = response.getContentText(); // 后续代码 } catch (error) { Logger.log('Error fetching data: ' + error); return null; }
如果完整响应是Cloudflare这类人机验证页面,仅靠UrlFetchApp基本无法绕过——因为这类验证需要执行JavaScript或用户交互,而Google Apps Script的环境不支持。这种情况下可以考虑:
使用支持JavaScript渲染的爬虫工具(比如Puppeteer),但需要部署在Node.js环境中,不在Google Apps Script的能力范围内。
查看该网站是否提供官方API,通过合法途径获取数据。
添加有效Cookie(若适用):如果之前手动访问网站时有未过期的有效Cookie,可以在请求头中加入
Cookie字段,但Cookie通常会定期失效,需要手动更新。
内容的提问来源于stack exchange,提问作者Can Celik

