Javascript 在何处调用for循环以遍历值数组
我有一个javascript函数,我正在使用它来抓取。我正在与木偶演员一起使用它。如果我使用一个值,它会工作,但是如果我引入一个Javascript 在何处调用for循环以遍历值数组,javascript,loops,for-loop,web-scraping,puppeteer,Javascript,Loops,For Loop,Web Scraping,Puppeteer,我有一个javascript函数,我正在使用它来抓取。我正在与木偶演员一起使用它。如果我使用一个值,它会工作,但是如果我引入一个for循环,让它遍历一个值数组,它就会失败。我想知道什么是引入for循环的正确位置 这是我的基本工作脚本: const puppeteer = require('puppeteer'); var listOfURLs = [url1, url2,url3,url4,url5] let scrape = async () => { const browser =
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
中。如果我手动引用listOfURLs[0],如上面的示例所示,它工作得很好。现在我想让它在整个数组中循环,并以listofulls[I]的形式访问值,所以我尝试了这个方法,但没有成功。我不知道怎么了
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);
});
}
const puppeter=require('puppeter');
var listOfURLs=[url1、url2、url3、url4、url5]
对于(i=0;i{
const browser=wait puppeter.launch({headless:true});
const page=wait browser.newPage();
等待page.goto(listofulls[i]);
const result=wait page.evaluate(()=>{
让title=document.querySelector('#innerLeft>div.dsppPropertyTitle>h1')。innerText;
返回{
标题
}
});
browser.close();
返回结果;
};
刮取()。然后((值)=>{
console.log(值);
});
}
您的问题可能源于您在for循环中进行异步调用的事实。在进入下一个循环之前,您希望得到一个结果,并且由于它是异步的,所以您的代码不会等待响应并继续进入数组中的下一个url。i
被提升,而刮取
如下所示ync-在一开始的刮取等待后,for
循环将完成,因此i
将变成listOfURLs.length+1
,这意味着以后访问listOfURLs[i]
将不起作用
改用let
,这样每个迭代对i
都有一个单独的绑定
你还应该测试i
,而不是i我建议你改变方法,让asyc/await完成它的工作,然后再进行下一次迭代。你可以将代码放入函数中,然后返回数组,然后对其进行迭代。:-)我认为你的问题是我已经解决了,但我不确定我是否理解你关于“并行请求”的说法。你的意思是,如果我的数组中有5个URL,它将打开5个不同的浏览器实例?如果是这样,那么这可能不是一个可扩展的解决方案。该数组是搜索结果URL的列表。所以他们可能是2,他们可能是100。就内存而言,打开100个并行实例会很难看。我只是想要一个运行平稳的解决方案,尽管它可能会慢一些。如果需要,您可以使用for..of
for(listofulls的consturl){
和在每个迭代中等待
以串行方式运行
for (let i=0; i < listOfURLs.length; i++) {
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);
});
});