我有一个用于抓取的javascript函数。我正在Puppeteer中使用它。如果我使用一个值,它可以工作,但是如果我引入一个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);});我的网址包含在变量listOfURLs中。如果像上面的示例一样手动引用listOfURLs [0],它就可以正常工作。现在,我希望它遍历整个数组并以listOfURLs [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); });} 最佳答案 i被吊起,scrape是异步的-在最开始的scrape await之后,for循环将结束,因此i将变为listOfURLs.length + 1,这意味着访问以后将无法使用。请改用listOfURLs[i],以便每个迭代都具有针对let的单独绑定。您还应该测试i,而不是i < listOfURLs.length,因为i <= listOfURLs.length是不确定的:for (let i=0; i < listOfURLs.length; i++) {但是这些i < listOfURLs[listOfURLs.length]循环非常丑陋,并且经常是类似问题的根源-您可以考虑使用for,它具有更好的抽象性,具有函数范围(可组合),并且不需要手动迭代(如果需要)可以并行发送请求: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); });});(如果要串行请求,则使用数组方法的另一个选项是forEach)
07-24 14:38