使用Puppeteer爬虫时遭遇403 Forbidden错误的解决方法
解决Puppeteer提交表单后跳转403 Forbidden的问题
403错误通常是网站的反爬机制识别出了自动化工具,以下是针对性的解决方案:
必要依赖安装
首先安装用于绕过指纹检测的插件:
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
修改后的代码示例
const puppeteer = require('puppeteer'); const puppeteerExtra = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); // 启用stealth插件隐藏自动化特征 puppeteerExtra.use(StealthPlugin()); (async () => { const browser = await puppeteerExtra.launch({ headless: false, defaultViewport: null, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' // 禁用自动化控制标记 ] }); const page = await browser.newPage(); // 设置真实浏览器的请求头,避免被识别为爬虫 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); await page.setExtraHTTPHeaders({ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://registrantsearch.reco.on.ca/' }); // 导航到表单页面,等待网络完全空闲 await page.goto('https://registrantsearch.reco.on.ca/', { waitUntil: 'networkidle2' }); // 模拟人类输入节奏,添加延迟 await page.type('#l-name', 'Malik', { delay: 100 }); // 短暂等待后再点击提交,模拟真实操作间隔 await page.waitForTimeout(500); // 点击提交并等待页面跳转,指定等待网络空闲 await Promise.all([ page.click('#searchSalesperson'), page.waitForNavigation({ waitUntil: 'networkidle2' }) ]); // 获取跳转后页面内容 const nextPageContent = await page.content(); console.log('跳转后页面内容:', nextPageContent); await browser.close(); })();
关键修改说明
- 隐藏自动化特征:通过
stealth插件和禁用AutomationControlled标记,避免网站检测到Puppeteer的自动化属性。 - 模拟真实请求头:替换默认的Puppeteer用户代理,补充常见请求头,让请求更接近真实浏览器行为。
- 调整操作节奏:添加输入延迟和点击前等待,模拟人类操作的间隔,避免触发频率检测。
- 优化页面等待策略:使用
networkidle2确保页面和资源完全加载后再执行下一步操作。
内容的提问来源于stack exchange,提问作者Shahzad Malik Shaikh
相关产品推荐
相关产品推荐

