Puppeteer为相同的URL无头与头目的URL提供不同的页面

问题描述 投票:1回答:1

我不确定为什么会这样,但是,我试图从Google搜索结果中抓取结果,并在向下滚动时动态加载结果。我试图通过向下滚动来模拟,但是当puppeteer在无头模式下运行时,它不会加载所有搜索结果,而在关闭无头时,它将返回正确的结果数。

[我发现我要查找的信息存储在具有'bkWMgd'类的div中,您可以看到总共有7个div:

enter image description here

伪造者代码:

(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

这些是捕获的屏幕截图:

无头模式:enter image description here

无头模式关闭:enter image description here

出于某种原因,似乎正在输出不同的结果。我尝试创建一个IngocnitoContext:

    const context = await browser.createIncognitoBrowserContext();

    const page = await context.newPage();

但是,它仍然会导致不同的结果,因此,我只是想知道是否有一种方法可以确保无头和无头产生相同的结果。我感兴趣的结果是关闭headless时产生的结果

javascript html node.js dom puppeteer
1个回答
1
投票

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的库可能会解决您的问题。您可能想尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.