基于Google Apps Script的带OAuth与reCAPTCHA的会员页面爬取问题
解决Google Apps Script爬取升级后会员页面的OAuth与登录问题
嘿,我之前碰到过类似网站升级后原有爬虫失效的情况,你的问题核心在于网站从简单的表单登录切换到了OAuth授权流程,还可能加了reCAPTCHA验证,咱们一步步来拆解解决:
先搞清楚为啥原有代码失效了
原来的代码靠提交用户名密码+传递Cookie维持会话,但网站升级后:
- 表单登录接口不再返回有效会话Cookie,转而要求通过OAuth流程获取access token来授权
- 你现在拿到的
html_text其实是未登录状态的页面,自然找不到"Member Summary",所以分割后和原内容一致
解决方案一:手动获取有效Cookie(适合个人快速复用)
如果只是个人用途,最简单的方法是手动登录后提取浏览器的有效Cookie,直接在GAS里用这个Cookie请求会员页面:
- 打开Chrome,正常登录目标网站的会员页面
- 按F12打开开发者工具,切换到「Application」标签 → 左侧「Cookies」→ 选中网站域名
- 复制所有Cookie的键值对,拼接成
key1=value1; key2=value2; ...的字符串 - 修改GAS代码,直接用这个Cookie请求:
var url = "https://ww2.metroplex.com.hk/en/member/login/profile"; // 替换成你复制的完整Cookie字符串 var dataHeaders = { 'Cookie': '你的完整Cookie字符串' }; // 建议加上User-Agent模拟浏览器,避免被反爬拦截 dataHeaders['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'; var options = { "method": "get", "headers": dataHeaders, "muteHttpExceptions": true }; var dataResponse = UrlFetchApp.fetch(url, options); var html_text = dataResponse.getContentText(); var table_array = html_text.split("Member Summary"); // 现在table_array应该能正确分割出会员摘要内容了
这个方法的好处是不用处理复杂的OAuth和reCAPTCHA,缺点是Cookie过期后需要重新复制一次。
解决方案二:模拟OAuth授权流程(适合长期自动化)
如果想实现完全自动化,就得跟着网站的OAuth流程走:
第一步:解析OAuth流程参数
用Chrome开发者工具的「Network」标签,从头走一遍登录流程:
- 访问登录页,找初始请求里的OAuth配置(比如
client_id、授权端点authorization_endpoint) - 点击登录按钮后,追踪跳转的授权页面,记录请求参数:
response_type、redirect_uri、scope等 - 完成授权后,看回调请求里的
code参数,以及后续交换access token的接口地址
第二步:用授权码交换access token
先手动完成一次授权获取code(因为reCAPTCHA大概率需要人工验证),然后用GAS请求token接口:
// 替换成你从开发者工具里拿到的真实参数 var tokenUrl = "https://ww2.metroplex.com.hk/oauth/token"; var tokenPayload = { 'grant_type': 'authorization_code', 'client_id': '网站的client_id', 'client_secret': '网站的client_secret', // 部分网站可能不需要,看实际请求 'code': '你手动获取的授权码', 'redirect_uri': '网站的回调地址' // 比如https://ww2.metroplex.com.hk/en/member/login/callback }; var tokenOptions = { "method": "post", 'contentType': 'application/x-www-form-urlencoded', // OAuth通常用这个类型,不是JSON 'payload': tokenPayload, "muteHttpExceptions": true }; var tokenResponse = UrlFetchApp.fetch(tokenUrl, tokenOptions); var tokenData = JSON.parse(tokenResponse.getContentText()); var accessToken = tokenData.access_token; var refreshToken = tokenData.refresh_token; // 用来刷新过期的access token
第三步:用access token请求会员页面
之后每次请求都把access token放在请求头里:
var url = "https://ww2.metroplex.com.hk/en/member/login/profile"; var dataHeaders = { 'Authorization': `Bearer ${accessToken}`, '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' }; var options = { "method": "get", "headers": dataHeaders, "muteHttpExceptions": true }; var dataResponse = UrlFetchApp.fetch(url, options); var html_text = dataResponse.getContentText(); var table_array = html_text.split("Member Summary");
第四步:自动刷新access token
access token通常会过期,用refresh token可以自动获取新的token:
var refreshPayload = { 'grant_type': 'refresh_token', 'client_id': '网站的client_id', 'client_secret': '网站的client_secret', 'refresh_token': refreshToken }; var refreshResponse = UrlFetchApp.fetch(tokenUrl, refreshPayload, tokenOptions); var newTokenData = JSON.parse(refreshResponse.getContentText()); accessToken = newTokenData.access_token;
注意事项
- 个人用途使用,不要频繁发送请求,避免被网站封禁IP
- 网站的OAuth配置可能会更新,定期检查流程参数是否变化
- 如果碰到reCAPTCHA强制验证,优先用手动提取Cookie的方法,自动化绕开reCAPTCHA不仅复杂,还可能违反网站服务条款
内容的提问来源于stack exchange,提问作者developer g
相关产品推荐
相关产品推荐

