我有一个javascript函数,我正在用它来擦除,我正在用它来做木偶。如果我使用一个值,它可以工作,但是如果我为它引入一个for
循环来迭代一个值数组,它就会失败。我想知道引入for循环的正确位置。
这是我的基本工作脚本:
const puppeteer = require('puppeteer');
var listOfURLs = [url1, url2,url3,url4,url5]
let scrape = async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(listOfURLs[0]);
const result = await page.evaluate(() => {
let title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
return {
title
}
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value);
});
我的URL包含在变量listOfURLs
中。如果我手动引用listOfURL,就像上面的例子一样,它工作得很好。现在我希望它循环遍历整个数组,并以listOfURLsi的形式访问值,所以我尝试了一下,但它不起作用。我不知道哪里出了问题。
const puppeteer = require('puppeteer');
var listOfURLs = [url1, url2, url3, url4, url5]
for (i=0; i<=listOfURLs.length; i++) {
let scrape = async () => {
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto(listOfURLs[i]);
const result = await page.evaluate(() => {
let title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
return {
title
}
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value);
});
}
发布于 2018-06-04 08:08:33
i
被提升,并且scrape
是异步的-在一开始的scrape
await
s之后,for
循环将结束,因此i
将变为listOfURLs.length + 1
,这意味着稍后访问listOfURLs[i]
将不起作用。
改为使用let
,这样每次迭代都有一个单独的i
绑定。
您还应该测试i < listOfURLs.length
,而不是i <= listOfURLs.length
,因为i < listOfURLs[listOfURLs.length]
将是未定义的:
for (let i=0; i < listOfURLs.length; i++) {
但是这些类型的for
循环非常丑陋,而且经常会出现这样的问题--你可以考虑forEach
,它有更好的抽象,有函数作用域(可组合),并且不需要手动迭代,如果你可以并行发送请求:
listOfURLs.forEach(async (url) => {
const scrape = async () => {
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto(url);
const result = await page.evaluate(() => {
const title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
return { title };
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value);
});
});
(如果您想以串行方式发出请求,则使用数组方法的另一个选项是reduce
)
发布于 2018-06-04 08:08:30
您的问题可能源于在for循环中进行异步调用的事实。在进入下一个url之前,你想要一个结果,因为它是异步的,所以你的代码不会等待响应并继续到数组中的下一个url。
https://stackoverflow.com/questions/50672049
复制相似问题