如何使用request模块处理Cloudflare连接安全验证(403错误)
解决Cloudflare人机验证导致的403状态码问题
你用request模块请求目标站点时返回403,是因为触发了Cloudflare的安全验证——站点要求完成复选框验证后才能继续访问。request是纯HTTP请求库,没法处理这类需要浏览器交互的人机验证,得换用无头浏览器工具来模拟真实用户操作,下面是具体方案:
方案:使用Puppeteer模拟浏览器行为
Puppeteer是Chrome官方的无头浏览器工具,能完整模拟浏览器的渲染、交互行为,自动处理Cloudflare的基础复选框验证。
步骤1:安装Puppeteer
先在项目里安装依赖:
npm install puppeteer
步骤2:替换原有代码
把你的request代码换成以下Puppeteer实现:
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { // 启动无头浏览器,设置模拟真实浏览器的UA const browser = await puppeteer.launch({ headless: 'new', // 新版无头模式,更接近真实浏览器 defaultViewport: null, args: ['--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 page = await browser.newPage(); const url = 'https://www.url.net/'; try { // 访问目标站点,等待页面加载完成(包括验证流程) await page.goto(url, { waitUntil: 'networkidle2' }); // 检查是否有Cloudflare验证框,自动点击(基础复选框验证) const checkboxSelector = '#cf-challenge'; if (await page.$(checkboxSelector)) { await page.click(checkboxSelector); // 等待验证完成,页面跳转 await page.waitForNavigation({ waitUntil: 'networkidle2' }); } // 获取页面内容 const body = await page.content(); console.log('当前页面URL:', page.url()); // 可通过URL判断是否验证成功 // 保存页面到文件 fs.writeFile('index.html', body, (err) => { if (err) console.log(err); else { console.log('文件写入成功'); console.log('文件内容:'); console.log(fs.readFileSync('index.html', 'utf8')); } }); console.log(body); } catch (error) { console.error('请求出错:', error); } finally { // 关闭浏览器 await browser.close(); } })();
关键说明
- Puppeteer会自动管理Cookie和会话,无需手动处理,能保持验证后的访问状态
- 若遇到更复杂的验证(如滑块、验证码),可能需要额外处理,但基础复选框验证用上面的代码就能解决
- 不要频繁请求目标站点,避免触发Cloudflare更严格的安全限制
内容的提问来源于stack exchange,提问作者C.Unbay
相关产品推荐
相关产品推荐

