javascript - Puppeteer 爬行超过 8000 个子页面

标签 javascript node.js puppeteer

因此,我尝试抓取网上商店以获取其所有产品的特定 ID(所谓的 EAM ID)。为此,我使用 Puppeteer。

我创建了以下函数:

async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index++) {
        console.log("Iterating through array " + index +  " Of " +array.length);

        await callback(array[index], index, array)
    }
}

现在我创建了以下脚本:

    await asyncForEach(productsToview, async function (productPage,index, arr) {
    if (productPage.indexOf("url") >= 0) {
        await page.goto(productPage);
        await page.waitForSelector('#site-wrapper');
        await page.click('#product-read-more-specs');
        await page.click('#tab-specs-trigger');
        const productToSave = await page.evaluate(() => {
            const $ = window.$;
            let product = {
                title: $('.product-title').text(),
                EAN: $('.spec-section').last().find('td').last().text(),
                price: $('.product-price-container').text().replace(/\s/g, '')
            };
            return product;
        });
        resultArray.push(productToSave);
    }
});

console.log(resultArray);

现在这确实有效了,但是速度非常慢。每个页面大约需要 3 - 5 秒,由于我有 8000 页,所以我必须等待大约 10 个小时才能完成。

所以我的问题是,当我们讨论这么多页面时,是否有更快的方法?

最佳答案

主观解决方案:使用多个选项卡/页面并将整个列表分成 10 个左右的部分。它会给 CPU/网络等资源带来压力,但抓取应该更快。更不用说,该网站可能会因为您在短时间内浏览 8000 个页面而将您标记为垃圾邮件。

要使其正常工作,您将需要几个不同的部分,

  • Here是将数组分成几个部分的片段。
  • 然后您可以为每个部分或页面使用一个新选项卡。每个都有自己的 Promise 返回结果。
  • 最后是一个数据库,用于异步存储所有数据(首选)或 Promise.all() 在一切完成后返回结果。

这是主观的,我现在无法通过代码一步步分享整个解决方案,但如果您将解决方案付诸实践,那就足够了。

关于javascript - Puppeteer 爬行超过 8000 个子页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49734775/

相关文章:

node.js - NodeJS 0.10.25 (Ubuntu 14.04) 和 NodeJS 4.1 的区别(编译自 NodeJS.org Source)

node.js - 如何使用puppeteer异步从多个html文件生成pdf?

javascript - 使用谷歌脚本自动将 CSV 输出到谷歌表格

javascript - 允许从 Express 中的不同文件访问变量

javascript - 递归创建一个 JSON 树,仅在最深层次添加

javascript - 粒子跟随鼠标移动上的光标(Javascript - Canvas)

javascript - 如何在控制台中获得更好的测试报告?

node.js - lodash _.map 比 Node.js map 快吗?

node.js - Puppeteer,与 Node.js 交换缓冲区

node.js - 使用 Chromeless 和 Puppeteer 或 Selenium 有什么好处?