Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在何处调用for循环以遍历值数组_Javascript_Loops_For Loop_Web Scraping_Puppeteer - Fatal编程技术网

Javascript 在何处调用for循环以遍历值数组

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 =

我有一个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
中。如果我手动引用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); 
  });
});