本地Puppeteer爬取含reCaptcha v2页面正常,生产环境被识别为机器人
解决reCaptcha v2服务器环境验证拦截问题
问题场景
本地Windows 10+Chrome环境下可正常完成目标网页的reCaptcha v2验证,但部署到CentOS 7服务器或GCP Ubuntu 20计算实例时,点击reCaptcha复选框会触发拦截提示:
Your computer or network may be sending automated queries To protect our users, we can't process your request right now For more detaile vigit pur_heWppge.
即使在服务器上通过Xvfb设置headless: false,问题仍未解决。当前使用的Puppeteer配置如下:
browser = await puppeteer.launch({ args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-blinkfeatures=AutomationControlled", "--no-first-run", "--no-proxy-server"], //headless: false headless: 'new' }); let page = await browser.newPage(); await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'); const customHeaders = { 'Accept-Language': 'es,es-ES;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', 'Sec-Ch-UA-Platform': '"Windows"', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0' }; await page.setExtraHTTPHeaders(customHeaders); await page.goto(url);
可实施的Puppeteer配置优化
1. 补充浏览器启动参数
在args数组中添加更多模拟真实浏览器环境的参数,减少自动化特征暴露:
args: [ "--no-sandbox", "--disable-setuid-sandbox", "--disable-blinkfeatures=AutomationControlled", "--no-first-run", "--no-proxy-server", "--start-maximized", // 模拟窗口最大化状态 "--disable-web-security", // 降低安全限制导致的异常检测 "--disable-features=VizDisplayCompositor", // 消除无头模式下的渲染差异 "--disable-dev-shm-usage", // 解决服务器共享内存不足问题 "--disable-extensions", // 禁用扩展,避免特征识别 "--disable-plugins-discovery", // 跳过插件扫描流程 "--disable-background-timer-throttling", // 禁用后台定时器节流,匹配真实用户环境 "--disable-backgrounding-occluded-windows", // 禁止后台窗口挂起 "--disable-renderer-backgrounding" // 禁止渲染进程后台化 ]
2. 深度隐藏自动化特征
通过页面脚本覆盖浏览器的自动化检测变量,让环境更接近真实用户:
await page.evaluateOnNewDocument(() => { // 覆盖navigator.webdriver属性 Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); // 模拟真实Chrome的runtime对象 window.chrome = { runtime: {} }; // 模拟多个浏览器插件 Object.defineProperty(navigator, 'plugins', { get: () => Array.from({ length: 5 }, () => ({ name: 'Plugin' })), }); // 匹配Accept-Language设置的语言列表 Object.defineProperty(navigator, 'languages', { get: () => ['es-ES', 'es', 'en'], }); });
3. 优化页面加载与用户行为模拟
- 调整页面加载策略,等待网络稳定后再操作:
await page.goto(url, { waitUntil: 'networkidle2', // 等待网络空闲(仅2个以下请求) timeout: 60000 // 延长超时时间,避免加载不完整 }); - 添加随机延迟和真实用户交互动作,避免机械操作:
// 随机鼠标移动 await page.mouse.move(Math.random() * 200, Math.random() * 200); // 随机延迟500-1500ms await page.waitForTimeout(Math.floor(Math.random() * 1000) + 500); // 滚动到reCaptcha元素并hover const recaptchaBox = await page.$('.g-recaptcha'); await recaptchaBox.scrollIntoView(); await page.waitForTimeout(300); await recaptchaBox.hover(); // 点击复选框 await recaptchaBox.click();
4. 统一HTTP头与用户代理
移除重复的User-Agent配置,修正请求头中的转义引号问题:
const customHeaders = { 'Accept-Language': 'es,es-ES;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', 'Sec-Ch-UA-Platform': '"Windows"', 'Sec-Fetch-Site': 'same-origin' }; // 仅在一处设置User-Agent,避免冲突 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'); await page.setExtraHTTPHeaders(customHeaders);
5. 切换无头模式类型
新版headless: 'new'的自动化特征更易被识别,尝试切换到旧版无头模式或非无头模式(配合Xvfb):
browser = await puppeteer.launch({ args: [...], headless: true, // 旧版无头模式 // 或使用非无头:headless: false(需Xvfb支持) defaultViewport: null // 使用系统默认视口,模拟真实窗口尺寸 });
内容的提问来源于stack exchange,提问作者nelson mundaca
相关产品推荐
相关产品推荐

