在 puppeteer-extra 上更改用户代理似乎没有影响

Changing user-agent on puppeteer-extra doesn't seem to take affect

我正在尝试使用 puppeteer 抓取不同的网站。因为我正在使用 puppeteer-extra for that (for their stealth-plugin), I've decided to use their anonymize-ua plugin 随机更改默认用户代理以进一步减少检测。

我尝试按照他们的解释进行操作,但是当我记录浏览器的实际用户代理时,它似乎没有生效。

下面附上了我正在做的一个例子:

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import UserAgent from 'user-agents';

const scrape = async (url: string) => {
    // Set stealth plugin
    const stealthPlugin = StealthPlugin();
    puppeteer.use(stealthPlugin);

    // Create random user-agent to be set through plugin
    const userAgent = new UserAgent({ platform: 'MacIntel', deviceCategory: 'desktop' });
    const userAgentStr = userAgent.toString();
    console.log(`User Agent: ${userAgentStr}`);

    const anonymizeUserAgentPlugin = require('puppeteer-extra-plugin-anonymize-ua')({
        customFn: () => userAgentStr 
    });
    puppeteer.use(anonymizeUserAgentPlugin);

    puppeteer
        .launch({ headless: false })
        .then(async (browser) => {
            // Different from the one above
            console.log(`User Agent: ${await browser.userAgent()}`);
        })
        .catch((e) => console.log(e));
}

虽然第一个用户代理字符串是随机的(从 运行 运行)到 user-agents library,但创建浏览器时记录的另一个是实际的 运行 ning Chromium 版本。

我是不是遗漏了一些配置?还是我不应该那样查看浏览器用户代理?

在深入研究 puppeteer-extra 和 anonymize-ua 插件代码后,我发现:

  1. user-agent 在 page 实例上发生了变化,因此尝试查看来自 browser 的实例不会得到实际使用的实例。正确的方法是通过devtools控制台登录navigator.useragent
  2. puppeteer 上存在一个未解决的问题,即事件触发的时间不够早,听众(例如使用 onPageCreated 的插件)无法在浏览器请求之前修改页面实例(例如 user-agent)发生。似乎他们首先尝试通过 goto about:blank 来解决它。这个解决方法没有为我解决问题,因为 user-agent 没有改变。

所以我的解决方案是从插件中复制代码并在 page:

上设置生成的 user-agent
puppeteer
    .launch({ headless: false })
    .then(async (browser) => {
        browser
            .pages()
            .then(async ([page]) => {
                await page.setUserAgent(userAgentStr);
            })
            .catch(async (e) => {
                console.log(e);
                await browser.close();
            });
    })
    .catch((e) => console.log(e));

希望这对任何人都有帮助!

默认情况下,'puppeteer-extra-plugin-anonymize-ua'设置为 属性 makeWindows: true,它会覆盖您的平台设置 'MacIntel' 'Windows NT 10.0; Win64; x64'

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import UserAgent from 'user-agents';

const scrape = async (url: string) => {
    // Set stealth plugin
    const stealthPlugin = StealthPlugin();
    puppeteer.use(stealthPlugin);

    // Create random user-agent to be set through plugin
    const userAgent = new UserAgent({ platform: 'MacIntel', deviceCategory: 'desktop' });
    const userAgentStr = userAgent.toString();
    console.log(`User Agent: ${userAgentStr}`);

    const anonymizeUserAgentPlugin = require('puppeteer-extra-plugin-anonymize-ua')({
        customFn: () => userAgentStr,
        stripHeadless: true,
        makeWindows: false,
    });
    puppeteer.use(anonymizeUserAgentPlugin);

    puppeteer
        .launch({ headless: false })
        .then(async (browser) => {
            // Different from the one above
            console.log(`User Agent: ${await browser.userAgent()}`);
        })
        .catch((e) => console.log(e));
}

makeWindows 设置为 false,如下例所示,问题应该已解决。

我将 link 附加到存储库中解决此问题的特定代码行 https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47