我正在尝试使用puppeteer抓取不同的网站。由于我使用puppeteer-extra(用于他们的steal- plugin),我决定使用他们的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-agent字符串是随机的(从运行到运行),但在创建浏览器时记录的另一个字符串是实际运行的Chromium版本。
我错过了一些配置吗?或者我不应该像那样查看浏览器用户代理吗?
在深入挖掘了puppeteer-extra和anonymize-ua插件代码之后,我发现:
- 在
page
实例上更改了用户代理,因此尝试查看来自browser
的用户代理不会导致使用实际的用户代理。正确的方法是通过devtools控制台记录navigator.useragent
。 - 在puppeteer上有一个开放的问题,即事件没有足够早地触发侦听器(例如使用
onPageCreated
的插件),以便能够在浏览器请求发生之前修改页面实例(例如user-agent)。似乎他们试图通过首先goto
about:blank来解决这个问题。这个解决方法并没有为我解决这个问题,因为用户代理没有改变。
所以我的解决方案是复制插件中的代码,并在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到假如下例所示,这个问题应该得到解决。
我将存储库的链接附加到解决此问题的特定代码行
https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js力争