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:
- Užívateľský agent je zmenený na inštancii
page, takže pokus o pozretie toho, ktorý prichádza zbrowser, neprinesie skutočne použitý. Správny spôsob je zaznamenaťnavigator.userAgentcez konzolu nástrojov pre vývojárov. - 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žiligotoabout: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
