如何用Puppeteer和JS爬取受保护网站?遭反爬检测求助
Puppeteer爬取反爬站点的优化方案(以Nike为例)
针对你遇到的Puppeteer被网站检测、无法完成加购操作的问题,结合你的代码,给出以下具体优化措施:
1. 修复启动参数错误
你的options2中args数组里的disable-gpu缺少前缀--,这会导致该参数无效,正确写法应为--disable-gpu。
2. 补充反检测启动参数
在args中添加更多对抗浏览器指纹检测的核心参数:
--disable-blink-features=AutomationControlled:禁用Chrome的自动化控制标记,避免网站通过window.navigator.webdriver识别出Puppeteer--no-sandbox、--disable-setuid-sandbox:规避沙箱环境带来的特殊特征(部分运行环境需要)--disable-dev-shm-usage:解决部分系统的内存限制问题,避免浏览器意外崩溃
3. 增强指纹伪装
除了已使用的stealth和anonymize-ua插件,在页面创建后手动覆盖关键检测属性:
await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); // 可选:补充伪装浏览器插件列表,模拟真实环境 Object.defineProperty(navigator, 'plugins', { get: () => [1,2,3].map(() => ({ name: 'PDF Viewer', description: '', version: '' })) }); });
4. 优化浏览器启动配置
- 若使用
userDataDir,确保路径正确且未被本地正在运行的Chrome实例占用,否则会导致启动失败;建议避免同时混用--profile-directory和userDataDir,二者选其一即可 - 保留
ignoreDefaultArgs: ['--enable-automation'],该参数会移除Chrome的"正在被自动软件控制"提示,减少暴露风险
5. 模拟真实用户行为
- 在操作节点间增加随机延迟,比如点击加购前延迟1-3秒,模拟用户浏览决策的时间
- 模拟鼠标移动、页面滚动轨迹,避免直接跳转式操作:
// 示例:模拟滚动到商品区域再移动到按钮 await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight / 2)); await delay(Math.random() * 1500); await page.mouse.move(buttonX, buttonY); // 替换为加购按钮的实际坐标 await delay(Math.random() * 800); await page.click(buttonSelector);
修改后的示例代码
const puppeteer = require("puppeteer-extra"); const { executablePath } = require("puppeteer"); const pluginStealth = require("puppeteer-extra-plugin-stealth"); const Ua = require("puppeteer-extra-plugin-anonymize-ua"); puppeteer.use(pluginStealth()); puppeteer.use(Ua()); let browser, page; function log(log) { console.log(log); }; function delay(time) { return new Promise((resolve) => { setTimeout(resolve, time); }); } async function openBrowser() { if (!browser) { const options = { args: [ '--start-maximized', '--disable-gpu', '--disable-infobars', '--disable-extensions', '--ignore-certificate-errors', '--disable-blink-features=AutomationControlled', '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage' ], headless: false, ignoreDefaultArgs: ['--enable-automation'], executablePath: "C:/Program Files/Google/Chrome/Application/chrome.exe", defaultViewport: null, ignoreHTTPSErrors: true }; browser = await puppeteer.launch(options); await delay(Math.random() * 1000); page = await browser.newPage(); // 页面初始化时覆盖检测属性 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); Object.defineProperty(navigator, 'plugins', { get: () => [1,2,3].map(() => ({ name: 'PDF Viewer', description: '', version: '' })) }); }); log("New browser has been booted up"); } else { log("Browser already in existence"); }; }
内容的提问来源于stack exchange,提问作者Bertil Frigaard
相关产品推荐
相关产品推荐

