在for循环中访问页面,然后滚动到每个页面的底部,然后继续进行下一个

时间:2020-06-07 19:03:14

标签: javascript node.js web-scraping puppeteer

我正在使用Puppeteer自动化一些网络冲浪。因此,给定一个单词列表,我想对该单词进行Google搜索,随机选择一个搜索结果,打开结果页面并滚动到底部。然后对下一个单词做同样的事情。

到目前为止我所拥有的:

'use strict';

const puppeteer = require('puppeteer');

(async () => {
    try {
        const browser = await puppeteer.launch({
            headless: false,
            args: ['--no-sandbox', '--disable-setuid-sandbox']
        });

        let pages = await browser.pages();
        const page = pages[0];

        var words = ['Aardvark', 'Apple'];
        for (let index = 0; index < words.length; ++index) {

            await page.goto('https://google.com');
            await page.click('[name=q]');
            await page.keyboard.type(`What is ${words[index]}`);
            await page.keyboard.press('Enter');
            await page.waitForSelector('h3.LC20lb', { timeout: 10000 });
            await page.evaluate(() => {
                let elements = document.querySelectorAll('h3.LC20lb');                
                let randomIndex = Math.floor(Math.random() * elements.length) + 1;
                elements[randomIndex].click();
            }).then(() => {
                    page.once('load', () => {
                    autoScroll(page);
                    page.waitFor(3000);
                });
            });

        }
    } catch (e) {
        console.log(e);
    }
})();

async function autoScroll(page) {
    await page.evaluate(async () => {
        await new Promise((resolve, reject) => {
            var totalHeight = 0;
            var distance = 400;
            var timer = setInterval(() => {
                var scrollHeight = document.body.scrollHeight;
                window.scrollBy(0, distance);
                totalHeight += distance;

                if (totalHeight >= scrollHeight) {
                    clearInterval(timer);
                    resolve();
                }
            }, 100);
        });
    });
}

这样可以使导航正常,但不会为第一个单词选择随机搜索结果,而只为第二个单词选择随机搜索结果。因此,在这种情况下,步骤如下:
1.打开Goog​​le
2.搜索“什么是土豚”
3.按Enter
4.打开Goog​​le
5.搜索“什么是苹果”
6.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部

如何使以下步骤有效?
1.打开Goog​​le
2.搜索“什么是土豚”
3.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部
4.打开Goog​​le
5.搜索“什么是苹果”
6.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部

1 个答案:

答案 0 :(得分:2)

似乎then()没有返回承诺,它是用undefined值解析的,不等待其内容功能。另外,似乎您在随机索引计算中遇到了一个错误(代码可能返回太多的elements.length数字。)

尝试一下:

        for (let index = 0; index < words.length; ++index) {

            await page.goto('https://google.com');
            await page.click('[name=q]');
            await page.keyboard.type(`What is ${words[index]}`);
            await page.keyboard.press('Enter');
            await page.waitForSelector('h3.LC20lb', { timeout: 10000 });

            await Promise.all([
              page.evaluate(() => {
                  let elements = document.querySelectorAll('h3.LC20lb');
                  let randomIndex = Math.floor(Math.random() * elements.length);
                  elements[randomIndex].click();
              }),
              page.waitForNavigation(),
            ]);
            await autoScroll(page);
            await page.waitFor(3000);

        }