Weboldal keresés

typescript - A user-agent megváltoztatása a puppeteer-extra-ban úgy tűnik, nem érvényesül


Megpróbálok különböző weboldalakat kiradírozni a Puppeteer segítségével. Mivel a puppeteer-extra-t használom ehhez (a stealth-plugin miatt), úgy döntöttem, hogy az anonymize-ua plugint is használom, hogy véletlenszerűen megváltoztassam az alapértelmezett felhasználói ügynököt a felismerés további csökkentése érdekében.

Megpróbáltam követni a magyarázatukat, de amikor a böngésző tényleges felhasználói ügynökét naplózom, úgy tűnik, nem volt hatása.

Az alábbiakban csatolok egy példát arra, amit csinálok:

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

Bár az első felhasználói ügynök karakterlánc véletlenszerű (futtatásonként változik) a user-agents könyvtár segítségével, a másik, amit a böngésző létrehozásakor naplóznak, a tényleges futó Chromium verzió.

Hiányzik valamilyen beállításom? Vagy nem így kellene néznem a böngésző felhasználói ügynökét?

Válasz #1

A puppeteer-extra és az anonymize-ua bővítmény kódjának kicsit történő átvizsgálása után felfedeztem:

  1. A felhasználói ügynök a page példányon van megváltoztatva, tehát ha megpróbáljuk megnézni a browser-ből érkezőt, az nem az aktuálisan használt lesz. A helyes módszer, ha a navigator.useragent-et a fejlesztői eszközök konzolján keresztül naplózzuk.
  2. Van egy nyitott probléma a Puppeteerben, miszerint az események nem kerülnek eléggé korán kiváltásra ahhoz, hogy a hallgatók (például a onPageCreated-et használó bővítmények) képesek legyenek módosítani az oldalpéldányt (például a felhasználói ügynököt) a böngésző kérés előtt. Úgy tűnik, megpróbálták megkerülni ezt azzal, hogy először goto about:blank -ot hívtak. Ez a megoldás nálam nem oldotta meg, mert a felhasználói ügynök nem változott meg.

Tehát a megoldásom az volt, hogy lemásoltam a plugin kódját, és beállítottam a generált user-agent-et a page-en:

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

Remélem, ez segít valakinek!

Válasz #2

Alapértelmezés szerint a 'puppeteer-extra-plugin-anonymize-ua' a makeWindows: true tulajdonsággal van beállítva, amely felülírja a platform beállításaidat 'MacIntel' 'Windows NT 10.0; Win64; x64' értékre.

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

Állítsa a makeWindows-t false-ra az alábbi példa szerint, és a probléma megoldódik.

Csatolok egy linket a tárolóhoz a konkrét kódsorhoz, amely ezt megoldja: https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47

Kapcsolódó cikkek