我不确定为什么会这样,但是,我试图从Google搜索结果中抓取结果,并在向下滚动时动态加载结果。我试图通过向下滚动来模拟,但是当puppeteer在无头模式下运行时,它不会加载所有搜索结果,而在关闭无头时,它将返回正确的结果数。
[我发现我要查找的信息存储在具有'bkWMgd'类的div中,您可以看到总共有7个div:
伪造者代码:
(async (searchQuery) => {
const browser = await puppeteer.launch({
//headless: false
});
const page = await browser.newPage();
await page.goto('https://google.com/search?q='+searchQuery, { waitUntil: 'networkidle2' });
//Wait for one of the div classes to load
await page.waitForSelector('div[class=bkWMgd]');
//Scroll all the way down
await page.evaluate(() => window.scrollTo(0,document.body.scrollHeight));
//Counts how many div with class 'bkWMgd' there are
const resp = await page.evaluate(() => document.querySelectorAll('div[class=bkWMgd]').length);
console.log(resp);
await page.screenshot({path: 'example.png'});
await browser.close();
})('cats')
在无头模式console.logs 3
中运行此代码并在无头模式关闭的情况下运行它会输出正确的数字7
这些是捕获的屏幕截图:
出于某种原因,似乎正在输出不同的结果。我尝试创建一个IngocnitoContext:
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
但是,它仍然会导致不同的结果,因此,我只是想知道是否有一种方法可以确保无头和无头产生相同的结果。我感兴趣的结果是关闭headless时产生的结果
Google(和其他网站)可能会根据您的用户代理和屏幕尺寸为您提供不同的内容。尝试显式设置它们,以便获得一致的结果:
设置窗口大小
const browser = await puppeteer.launch({
headless: true,
args: [
'--window-size=1920,1080',
'--user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"'
]
});
设置用户代理
await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36');
完整示例
(async (searchQuery) => {
const userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36';
const browser = await puppeteer.launch({
headless: true,
args: [
'--window-size=1920,1080',
`--user-agent="{userAgent}"`
]
});
const page = await browser.newPage();
await page.setUserAgent(userAgent);
await page.goto('https://google.com/search?q='+searchQuery, { waitUntil: 'networkidle2' });
//Wait for one of the div classes to load
await page.waitForSelector('div[class=bkWMgd]');
//Scroll all the way down
await page.evaluate(() => window.scrollTo(0,document.body.scrollHeight));
//Counts how many div with class 'bkWMgd' there are
const resp = await page.evaluate(() => document.querySelectorAll('div[class=bkWMgd]').length);
console.log(resp);
await page.screenshot({path: 'example.png'});
await browser.close();
})('cats')
更新
我很惊讶设置用户代理无效。我已经更新了示例,以通过--user-agent
命令行开关指定用户代理。尝试一下不会感到受伤。
[有一个名为Puppeteer Stealth的库可能会解决您的问题。您可能想尝试一下。