Кукловод, обслуживающий разные страницы по одному и тому же URL - PullRequest
1 голос
/ 21 января 2020

Я не совсем уверен, почему это происходит, но я пытаюсь почистить результаты из результатов поиска Google, и результаты динамически загружаются при прокрутке вниз. Я пытаюсь смоделировать это с помощью прокрутки вниз, однако, когда кукловод работает в режиме без головы, он не загружает все результаты поиска, тогда как при отключении без головы он возвращает правильное количество результатов.

I обнаружил, что информация, которую я ищу, хранится в div с классом 'bkWMgd', как вы можете видеть, есть всего 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();

Тем не менее, это все еще приводит к другим результатам, поэтому мне было просто интересно, есть ли способ гарантировать, что и безголовый и напыщенный дают одинаковые результаты. Интересующие меня результаты - это те результаты, которые получаются при отключении безголового

1 Ответ

0 голосов
/ 21 января 2020

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"'
    ]
});

Настройка User Agent

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 , которая, скорее всего, решит ваши проблемы. Возможно, вы захотите попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...