Puppeteer爬行超过8000个子页面

时间:2018-04-09 13:58:20

标签: 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个小时才能完成。

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

1 个答案:

答案 0 :(得分:1)

主观解决方案:使用多个标签/页面并将整个列表拆分为10个左右的部分。它会对CPU / net等资源造成压力,但抓取速度应该更快。更不用说网站可能会将您标记为垃圾邮件,以便在短时间内浏览8000页。

要实现这一目标,您将需要几个不同的部分,

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

这是主观的,我现在不能一步一步地用代码分享整个解决方案,但是如果你把解决方案付诸行动,那就足够了。