【问题标题】:Looping async functions in nodejs在nodejs中循环异步函数
【发布时间】:2019-01-17 17:32:00
【问题描述】:

所以这是我的问题。在以下函数中,我想使用 puppeteerjs 从网站获取一些数据。该函数使用从 mongodb 数据库中获取的名称在网站上搜索产品。所以这是我的问题。我想通过从 mongo 获得的一组名称循环该函数。因此,如果函数完成一次,它会从数组中的下一个名称重新开始,直到数组中没有其他内容。

async function scrape() {
    const browser = await puppeteer.launch({
        headless: false
    });
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
    await page.goto(dealer);
    await page.type('.Search-bar-text-input', arrayOfArticles[i]);
    await page.click('.Embedded-search-button')
    await page.waitFor('.BuyingOptions-total-price');

    const result = await page.evaluate(() => {
        let path = '.BuyingOptions-total-price';
        let price = document.querySelector(path).innerText;

        return price;
    });

}

所以我最初只是想这样做:

for (var i = 0, len = arrayOfArticles.length; i < len; i++){

但从我所读到的内容不适用于异步函数。我将如何为我的函数归档相同的内容?

【问题讨论】:

  • that doesnt work with async functions 没问题,只是await 每次调用scrape
  • 我已经试过了,但还是不行,你会如何编码?
  • (async () =&gt; { for (let i = 0; i &lt; arrayOfArticles.length; i++) await scrape(); })();

标签: node.js mongodb asynchronous web-scraping puppeteer


【解决方案1】:

你可以稍微修改一下

return page.evaluate(() => {
    let path = '.BuyingOptions-total-price';
    let price = document.querySelector(path).innerText;

    return price;
});

//----------------

(async () => {
    for (var i = 0, len = arrayOfArticles.length; i < len; i++){
        const result = await scrape(arrayOfArticles[i]);
    }
})()

【讨论】:

  • 所以我发现了问题,数据库有问题,你提供的代码很有效,非常感谢
猜你喜欢
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多