伪造者:遍历URL并等待顺序打印?

时间:2018-08-01 05:44:19

标签: 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);
    });
  } 

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

1 个答案:

答案 0 :(得分:7)

像您这样的声音只需要在每次迭代中nls_Date_Format,以确保await循环在当前for的调用完成之前不会继续。幸运的是,scrape是一个scrape函数,因此它已经返回了async。清除代码中的所有语法错误(括号和括号不匹配,如果代码经过简化并以其原始形式工作,则与此无关),然后:

Promise