puppeteer注入浏览器指纹过CDP

一、背景

通过puppeteer爬取目标网站时,经常会被对方网站检测到,比如原生puppeteerCDP特征非常明显,另外指纹如果一直不变,也会引发风控

二、实现

通过以下几行代码即可轻松过大部分检测点,并且能够切换指纹,我的电脑是windows系统,显卡是AMD 7800XT,先放效果图:

2.1 检测网站

https://bot.sannysoft.com/

在这里插入图片描述
https://www.browserscan.net/
在这里插入图片描述
在这里插入图片描述
Webdriver、CDP等机器人常规检测:
在这里插入图片描述

2.2 代码

使用的是开源工具,代码非常少,首先是依赖安装
其中fingerprint-generator负责生成指纹,fingerprint-injector负责注入指纹,rebrowser-puppeteer是puppeteer的一个补丁库,主要用于绕过CDP检测

npm install fingerprint-generator fingerprint-injector rebrowser-puppeteer

示例js:

const { FingerprintGenerator } = require('fingerprint-generator');
const { FingerprintInjector } = require('fingerprint-injector');
const puppeteer = require('rebrowser-puppeteer');

(async () => {
    const generator = new FingerprintGenerator(
        // {
        //     browsers: [
        //         {
        //             name: 'chrome',
        //             minVersion: 131,
        //             minVersion: 131
        //         }
        //     ]
        // }
    );

    const fingerprint = generator.getFingerprint();

    const browser = await puppeteer.launch({
        // executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
        headless: false,
        args: [
            '--disable-blink-features=AutomationControlled',
            '--disable-web-security'
        ],
        ignoreDefaultArgs: ['--enable-automation']
    });

    const page = await browser.newPage();

    const injector = new FingerprintInjector();

    await injector.attachFingerprintToPuppeteer(page, fingerprint);

    // https://www.browserscan.net
    await page.goto('https://www.browserscan.net/', {
        waitUntil: 'networkidle0',
        timeout: 600000
    });
})();
### 如何使用 Puppeteer 设置浏览器默认下载路径 在 Puppeteer 中,默认情况下无法直接通过 API 配置文件的下载路径,因为 Chromium 的设计不支持直接修改下载目录。然而,可以通过设置实验性的 Chrome 标志 `--download-path` 或者监听页面事件并手动处理下载行为来间接实现这一目标。 以下是具体实现方式: #### 使用实验性标志配置下载路径 可以尝试通过启动选项中的 `args` 参数指定自定义的命令行标志来更改下载路径。虽然这种方法并非完全可靠,但在某些场景下可能有效。 ```javascript const puppeteer = require('puppeteer'); (async () => { const downloadPath = '/custom/path/to/downloads'; // 自定义下载路径 const browser = await puppeteer.launch({ headless: false, args: [ `--download-path=${downloadPath}` // 尝试设置下载路径 ] }); const page = await browser.newPage(); await page.goto('https://example.com/file-to-download'); console.log(`File will be downloaded to ${downloadPath}`); await browser.close(); })(); ``` 需要注意的是,上述方法依赖于特定版本的 Chromium 支持,并且不一定适用于所有环境[^1]。 --- #### 手动捕获下载链接并保存到指定位置 更可靠的解决方案是拦截下载请求并将文件保存到期望的位置。这通常涉及以下几个步骤: 1. 捕获页面上的点击或其他触发下载的行为。 2. 获取下载 URL 并通过 Node.js 文件系统模块 (`fs`) 下载文件。 3. 将文件存储至指定路径。 下面是一个完整的示例代码: ```javascript const fs = require('fs'); const axios = require('axios'); // 用于发起 HTTP 请求 const puppeteer = require('puppeteer'); (async () => { const customDownloadDir = './downloads'; if (!fs.existsSync(customDownloadDir)) { fs.mkdirSync(customDownloadDir); } const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); // 跳转到包含下载按钮的目标网页 await page.goto('https://example.com/page-with-file-link'); // 监听 "response" 事件以检测下载资源 page.on('response', async response => { const url = response.url(); // 判断是否为要下载的内容(可以根据 MIME 类型判断) if (url.includes('.pdf') || url.includes('.zip')) { // 假设我们要下载 PDF 和 ZIP 文件 try { const fileStream = fs.createWriteStream(`${customDownloadDir}/${new Date().getTime()}-${url.split('/').pop()}`); const writer = new Promise((resolve, reject) => { fileStream.on('finish', resolve); fileStream.on('error', reject); }); const responsePromise = axios({ method: 'GET', url, responseType: 'stream' }).then(response => { response.data.pipe(fileStream); return response; }); await Promise.all([writer, responsePromise]); console.log(`File saved successfully at: ${fileStream.path}`); } catch (err) { console.error('Error downloading the file:', err.message); } } }); // 触发下载操作(例如模拟点击某个按钮) await page.click('#downloadButton'); await new Promise(resolve => setTimeout(resolve, 5000)); // 等待几秒确保完成下载 await browser.close(); })(); ``` 在此示例中,通过监听响应事件以及结合 Axios 库实现了对文件的手动管理[^4]。 --- ### 注意事项 - 如果需要更高的兼容性和稳定性,建议采用第二种方案(即手动控制下载流程),因为它不受制于底层浏览器的具体实现细节。 - 对于生产环境中运行的任务,请务必验证所使用的 Chromium 版本及其特性支持情况[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值