因此,我发现一个网站上的图片非常酷,我想抓取一些数据。该网站大约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
如果我在await
前面添加cluster.execute
,则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();
})();
答案 0 :(得分:0)
我认为问题可能是由let引起的,let仅存在于当前代码块中,请尝试制作一个Function。像这样的东西。
let i = 0; // page index
let n = 0; // number of pages
let c = 0; // category index
let nc = 0; // number of categorys
for(i = 0; i < n; i++)
{
for(c = 0; c < nc; c++)
{
postrequest(i,c)
}
}
postrequest(pageindex,categoryindex)
{
// Do your async call ...
}
对不起,如果我错过了问题的重点。...