typescript - تغییر user-agent در puppeteer-extra به نظر نمیرسد تأثیر داشته باشد
من در تلاش هستم تا با استفاده از Puppeteer وبسایتهای مختلف را استخراج کنم. از آنجایی که من برای این کار از puppeteer-extra استفاده میکنم (برای پلاگین stealth آنها)، تصمیم گرفتم از پلاگین anonymize-ua آنها برای تغییر تصادفی User-Agent پیشفرض استفاده کنم تا احتمال شناسایی بیشتر کاهش یابد.
من سعی کردم توضیحات آنها را دنبال کنم، اما وقتی شناسه کاربری واقعی مرورگر را ثبت میکنم به نظر میرسد تأثیری نداشته است.
مثالی از کاری که من انجام میدهم در زیر پیوست شده است:
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 به صورت تصادفی (از اجرا به اجرا) تغییر میکند، رشته دیگری که هنگام ایجاد مرورگر ثبت میشود، نسخه واقعی Chromium در حال اجرا است.
آیا من یک پیکربندی را از دست دادهام؟ یا نباید اینطور به user-agent مرورگر نگاه کنم؟
پاسخ شماره ۱
بعد از کمی جستجو درون puppeteer-extra و کد افزونه anonymize-ua، متوجه شدم:
- عامل کاربر در نمونه
pageتغییر داده شده است، بنابراین تلاش برای نگاه کردن به آنچه ازbrowserمیآید، منجر به مشاهده عامل واقعی استفاده شده نخواهد شد. راه درست این است کهnavigator.userAgentرا از طریق کنسول ابزار توسعه ثبت کنید. - یک مسئله باز در puppeteer وجود دارد که رویدادها به اندازه کافی زود برای شنوندهها (مثلاً افزونههایی که از
onPageCreatedاستفاده میکنند) فعال نمیشوند تا بتوانند نمونه صفحه را (مثلاً user-agent) قبل از رخ دادن درخواست مرورگر، تغییر دهند. به نظر میرسد آنها تلاش کردهاند با ابتداgotoabout:blank آن را دور بزنند. این راهحل برای من مشکل را حل نکرد، زیرا user-agent تغییر نکرد.
بنابراین راهحل من این بود که کد افزونه را تکثیر کنم و عامل کاربر تولید شده را روی 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));
امیدوارم این به کسی کمک کند!
پاسخ شماره ۲
به طور پیشفرض '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 قرار دهید تا مشکل برطرف شود.
من لینکی به مخزن را به خط خاصی از کد که این مشکل را حل میکند پیوست میکنم https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47
