typescript - Zmena user-agenta v puppeteer-extra sa zdá, že nemá účinok


Snažím sa zhromažďovať údaje z rôznych webových stránok pomocou Puppeteer. Keďže na to používam puppeteer-extra (kvôli ich stealth-plugin), rozhodol som sa použiť ich anonymize-ua plugin na náhodnú zmenu predvoleného používateľského agenta, aby som ďalej znížil detekciu.

Snažil som sa riadiť ich vysvetlením, ale keď logujem skutočný user-agent prehliadača, zdá sa, že to nebolo účinné.

Nižšie je priložený príklad toho, čo robím:

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));
}

Hoci je prvý reťazec používateľského agenta náhodný (pri každom spustení) cez knižnicu user-agents, ten druhý zaznamenaný pri vytváraní prehliadača je skutočná bežiaca verzia Chromium.

Chýba mi nejaké nastavenie? Alebo by som sa nemal pozerať na používateľský agent prehliadača takto?

Odpoveď č. 1

Po istom kopaní v puppeteer-extra a kóde pluginu anonymize-ua som zistil:

  1. Užívateľský agent je zmenený na inštancii page, takže pokus o pozretie toho, ktorý prichádza z browser, neprinesie skutočne použitý. Správny spôsob je zaznamenať navigator.userAgent cez konzolu nástrojov pre vývojárov.
  2. Na Puppeteer je otvorený problém, že udalosti nie sú vyvolané dostatočne skoro, aby poslucháči (napr. pluginy používajúce onPageCreated) mohli upraviť inštanciu stránky (napr. user-agenta) predtým, než nastane požiadavka prehliadača. Zdá sa, že sa snažili tento problém obísť tým, že najprv použili goto about:blank. Toto riešenie však pre mňa nefungovalo, pretože user-agent sa nezmenil.

Takže moje riešenie bolo skopírovať kód z pluginu a nastaviť generovaný user-agent na page:

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));

Dúfam, že to niekomu pomôže!

Odpoveď č. 2

Predvolene je 'puppeteer-extra-plugin-anonymize-ua' nastavený s vlastnosťou makeWindows: true, ktorá prepíše vaše nastavenia platformy 'MacIntel' na '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));
}

Nastavte makeWindows na false ako v príklade nižšie a problém by mal byť vyriešený.

Pripájam odkaz na úložisko na konkrétny riadok kódu, ktorý to rieši https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47

Súvisiace články