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:
- A felhasználói ügynök a
pagepéldányon van megváltoztatva, tehát ha megpróbáljuk megnézni abrowser-ből érkezőt, az nem az aktuálisan használt lesz. A helyes módszer, ha anavigator.useragent-et a fejlesztői eszközök konzolján keresztül naplózzuk. - 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örgotoabout: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
