【发布时间】:2019-11-23 18:36:36
【问题描述】:
所以我发现了一个网站,其中包含非常酷的图片,我想抓取它的一些数据。该网站大约 5 年没有得到任何更新,我试图联系其所有者以获取某种 API,但没有得到任何回复。
无论如何,网站都有分类,每张图片都有自己的页码;所以为了抓取每张图片,我需要转到每个类别,然后转到该特定类别的每个页面。
以下是我的代码,但我无法让for loop 重置。
const {Cluster} = require('puppeteer-cluster');
const puppeteer = require('puppeteer');
let c = 0;
let z = 500;
(async () => {
process.setMaxListeners(5);
const cluster = await Cluster.launch({
maxConcurrency: 3 // max browsers to spawn at the same time
});
let b = 20;
for (let i = 0; i < b; i++) {
cluster.execute({i}, async () => {
let browser = await puppeteer.launch({headless: false});
// scraping code using the i and c values
await browser.close();
console.log(i);
if (i > b - 10) {
i = 0;
c = c + 1;
console.log('c = ' + c);
if (c > z)
process.exit();
}
});
}
await cluster.idle();
await cluster.close();
})();
这是输出(顺序不是必需的):
1
0
2
4
3
5
6
7
8
9
10
11
c = 1
12
c = 2
13
c = 3
14
c = 4
16
c = 5
15
c = 6
17
c = 7
18
c = 8
19
c = 9
Process finished with exit code 0
如果我在cluster.execute 前面添加await,那么for loop 正在重置,但是我不能同时使用多个浏览器。
编辑:
const {Cluster} = require('puppeteer-cluster');
const puppeteer = require('puppeteer');
(async () => {
process.setMaxListeners(5);
const cluster = await Cluster.launch({maxConcurrency: 3});
let b = 15;
let d;
function myLoop() {
let g = 0;
for (g; g <= n; g++) {
console.log(g);
myFunc();
}
return g;
}
d = myLoop();
console.log('d: ' + d);
if (d > 0)
myLoop();
async function myFunc() {
await cluster.execute(async () => {
let browser = await puppeteer.launch({headless: false});
await browser.close();
});
}
await cluster.idle();
await cluster.close();
})();
【问题讨论】:
-
什么是重置
for循环?如果您正处于迭代的中间,并且您找到了一个您想要迭代的类别,您就不能递归地执行此操作吗? -
我认为这不足以满足我的工作流程,因为我必须转到不同的页面才能找到隐藏的类别 - 这些类别基于该页面上显示的图像。我可能会在第 6 页找到该类别,而在其他情况下,它可能在第 40 页。例如,我在“玻璃”类别中。在这个中,我可以找到一张带有“一杯水”的图像。图片下方显示的另一个类别是“水”,然后我继续抓取该类别。这就是为什么我需要重置 for 循环,因为页面如下所示:webpage.com/cat=1/pg=1
-
什么是“重置循环”?这不是一个标准的编程术语。如果你想中止一个循环,你通常会
break或return然后代码可以做一些事情来用正确的配置开始一个新的循环。 -
我想说的是,我希望
i的值回到0,以便for loop可以重新开始。很抱歉用词或解释不好,但英语不是我的母语。 -
看起来你在循环内有一个异步
cluster.execute()循环没有等待,所以循环已经走得很远了。您可能需要承诺并await它使循环等待它,所以如果在它执行时您想将i设置回0,那么循环将不会执行所有其余的循环。
标签: javascript node.js puppeteer puppeteer-cluster