在 puppeteer-extra 上更改用户代理似乎没有影响
Changing user-agent on puppeteer-extra doesn't seem to take affect
我正在尝试使用 puppeteer 抓取不同的网站。因为我正在使用 puppeteer-extra for that (for their stealth-plugin), I've decided to use their anonymize-ua plugin 随机更改默认用户代理以进一步减少检测。
我尝试按照他们的解释进行操作,但是当我记录浏览器的实际用户代理时,它似乎没有生效。
下面附上了我正在做的一个例子:
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 library,但创建浏览器时记录的另一个是实际的 运行 ning Chromium 版本。
我是不是遗漏了一些配置?还是我不应该那样查看浏览器用户代理?
在深入研究 puppeteer-extra 和 anonymize-ua 插件代码后,我发现:
- user-agent 在
page
实例上发生了变化,因此尝试查看来自 browser
的实例不会得到实际使用的实例。正确的方法是通过devtools控制台登录navigator.useragent
。
- puppeteer 上存在一个未解决的问题,即事件触发的时间不够早,听众(例如使用
onPageCreated
的插件)无法在浏览器请求之前修改页面实例(例如 user-agent)发生。似乎他们首先尝试通过 goto
about:blank 来解决它。这个解决方法没有为我解决问题,因为 user-agent 没有改变。
所以我的解决方案是从插件中复制代码并在 page
:
上设置生成的 user-agent
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,如下例所示,问题应该已解决。
我将 link 附加到存储库中解决此问题的特定代码行
https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47
我正在尝试使用 puppeteer 抓取不同的网站。因为我正在使用 puppeteer-extra for that (for their stealth-plugin), I've decided to use their anonymize-ua plugin 随机更改默认用户代理以进一步减少检测。
我尝试按照他们的解释进行操作,但是当我记录浏览器的实际用户代理时,它似乎没有生效。
下面附上了我正在做的一个例子:
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 library,但创建浏览器时记录的另一个是实际的 运行 ning Chromium 版本。
我是不是遗漏了一些配置?还是我不应该那样查看浏览器用户代理?
在深入研究 puppeteer-extra 和 anonymize-ua 插件代码后,我发现:
- user-agent 在
page
实例上发生了变化,因此尝试查看来自browser
的实例不会得到实际使用的实例。正确的方法是通过devtools控制台登录navigator.useragent
。 - puppeteer 上存在一个未解决的问题,即事件触发的时间不够早,听众(例如使用
onPageCreated
的插件)无法在浏览器请求之前修改页面实例(例如 user-agent)发生。似乎他们首先尝试通过goto
about: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,如下例所示,问题应该已解决。
我将 link 附加到存储库中解决此问题的特定代码行 https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-anonymize-ua/index.js#L47