因此,我尝试抓取网上商店以获取其所有产品的特定 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/