所以我试图抓取网上商店以获得所有产品的特定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个小时才能完成。
所以我的问题是,当我们谈论这么多页面时,有更快的方法吗?
答案 0 :(得分:1)
主观解决方案:使用多个标签/页面并将整个列表拆分为10个左右的部分。它会对CPU / net等资源造成压力,但抓取速度应该更快。更不用说网站可能会将您标记为垃圾邮件,以便在短时间内浏览8000页。
要实现这一目标,您将需要几个不同的部分,
Promise.all()
,以便在一切都完成后返回结果。这是主观的,我现在不能一步一步地用代码分享整个解决方案,但是如果你把解决方案付诸行动,那就足够了。