Web Automation to go to next page - Invoking method that returns Promise within await block) - await is only valid in async

Web Automation to go to the next page - Invoking method that returns Promise within await block) - await is only valid in async

背景:

我正在用 puppeteer 编写一个 Nodejs 脚本来从网页中抓取数据。我不熟悉 Nodejs、promises 或 puppeteer。我已经尝试了很多东西并做了几天的研究。

申请流程:

  1. 通过自动化,转到网站
  2. 从页面抓取数据,推送到数组
  3. 如果有"next page"点击下一页按钮
  4. 从页面抓取数据,推送到同一个数组
  5. 重复

问题:

我的问题是#3。使用 Web 自动化,单击下一页按钮。 我想要的只是在 puppeteer 中使用 .click() 方法,单击按钮选择器。但是,.click() returns 一个承诺。因为这是一个承诺,我需要关键字 await,但你不能在 for 循环(或 async 以外的任何块)中使用 await

我尝试了什么:

我已经尝试创建另一个 async 函数,使用 await page.click(); 的语句并在问题区域调用该函数。我尝试使用 page.click() 创建一个常规函数并在问题区域调用它。重构一切以使其无法正常工作。即使在阅读了几天后,我也不是很了解 Promises 和 Async/Await。

我需要什么帮助:

帮助调用问题区域内的 .click() 方法或帮助选择 'Next Page' 使用 Web 自动化。

伪代码:

let scrape = async () => {
    await //do.some.automation;

    const result = await page.evaluate(() => {
        for (looping each page) {
            if (there is a next page) {
                for (loop through data) {
                    array.push(data);
                    //----PROBLEM----
                    //use automation to click the selector of the next page button
                    //--------------   
                }
            }
        }
        return data;
    });
    //close browser
    return result;
};
scrape().then((value) => {
    //output data here;
    });
});

所有代码:

let scrape = async () => {
    const browser = await puppeteer.launch({
        headless: false 
    });
    const page = await browser.newPage();
    await page.goto("GO TO A WEBSITE");
    await page.click("CLICK A BUTTON");
    await page.waitFor(2000);

    //Scraping
    const result = await page.evaluate(() => {
        let pages = document.getElementsByClassName("results-paging")[2];
        let allPages = pages.getElementsByClassName("pagerLink");
        let allJobs = [];
        //Loop through each page
        for (var j = 0; j < allPages.length; j++) {
            let eachPage = pages.getElementsByClassName("pagerLink")[j].innerHTML;
            if (eachPage) {
                //Scrape jobs on single page
                let listSection = document.getElementsByTagName("ul")[2];
                let allList = listSection.getElementsByTagName("li");
                for (var i = 0; i < allList.length; i++) {
                    let eachList = listSection.getElementsByTagName("li")[i].innerText;
                    allJobs.push(eachList);

                    //--------PROBLEM-------------
                    await page.click('#selector_of_next_page');
                    //----------------------------  
                }
            }
            else {
                window.alert("Fail");
            }
        }
        return allJobs;
    });
    browser.close();
    return result;
};

scrape().then((value) => {
    let data = value.join("\r\n");
    console.log(data);
    fs.writeFile("RESULTS.txt", data, function (err) {
        console.log("SUCCESS MESSAGE");
    });
});

错误信息:

SyntaxError: await is only valid in async function

您不能在 page.evaluate 函数中使用 page 方法。

根据您的示例,您应该更改

await page.click('#selector_of_next_page');

相当于原生 JS

document.getElementById('selector_of_next_page').click();