Puppeteer:遍历URL并等待按顺序打印?

D-H*_*D-H 1 javascript node.js web-scraping puppeteer

因此,我正在尝试使用puppeteer迭代一些URL,从HTML内容中获取数据,然后打印出CSV.

我被困在你打印数据的那一部分.现在我只是测试并尝试为每个数据做一个console.log().

我遇到的主要问题是循环运行非常快,打开了大量的浏览器窗口,并且日志全部乱序.

这是我的代码:

const puppeteer = require('puppeteer');

let scrape = async (i) => {
  const browser = await puppeteer.launch({
    headless: false
  });
  const page = await browser.newPage();

  await page.goto(`https://webPageURL.org/list/objects/${i}/`);
  await page.waitFor(1000);

  const result = await page.evaluate(() => {
    let data = document.querySelector('.someClass')
    if (data !== null) {
      data = data.innerText;
    }
    return {
      data
    }
  });
  await browser.close();
  return result;
};
for (var i = 0; i < 10; i++{
    scrape(i).then((value) => {
      console.log(i, ': ', value);
    });
  } 
Run Code Online (Sandbox Code Playgroud)

我想要的是循环暂停直到打印出来的东西,但是当我运行这个特定代码时会发生十个浏览器窗口打开并立即加载,并且它们都以任意随机顺序打印到控制台.另外,理想情况下,我希望刮刀暂停加载下一页,直到当前循环迭代完成打印.这是因为我需要为大约5000页进行此过程,理想情况下我不想打开5000个浏览器.

Cer*_*nce 7

听起来你只需要await每次迭代,以确保for循环不会继续,直到当前调用scrape结束.幸运的是,它scrape是一个async函数,所以它Promise已经返回了.清除代码中的所有语法错误(不匹配的括号和括号等等,如果代码被简化并以原始形式工作,这是不相关的),然后:

(async () => {
  for(let i = 0; i < 10; i++){
    await scrape(i).then((value) => {
      console.log(i, ': ', value);
    });
  }
})();
Run Code Online (Sandbox Code Playgroud)