【问题标题】:puppeteer - export JSON file from looppuppeteer - 从循环中导出 JSON 文件
【发布时间】:2022-07-22 02:47:55
【问题描述】:

导出的文件只包含一个 url。在导出的文件中找不到其余的 url。如何生成包含循环中所有条目的文件?

const puppeteer = require("puppeteer");
const fs = require('fs');

let browser;
(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox']
});
  const [page] = await browser.pages();

  await page.goto('https://old.reddit.com/',{"waitUntil" : "networkidle0"});
  const a_elems = await page.$$('.thumbnail');

  for (var i=0; i<a_elems.length && i<3; i++) {            
     const elem = a_elems[i];
     const href = await page.evaluate(e => e.href, elem); 
     const newPage = await browser.newPage();
     await newPage.goto(href,{"waitUntil" : "networkidle0"});
     
        const url = await newPage.evaluate(() => document.location.href);
        console.log(url);

        fs.writeFileSync('export.json', JSON.stringify(url));
    }

    await browser.close();
})()
;

谢谢!

【问题讨论】:

    标签: javascript node.js json web-scraping puppeteer


    【解决方案1】:

    创建一个数组,将每个 url 推入循环中,然后将您的 writeFile 调用移至末尾。

    const puppeteer = require("puppeteer");
    const fs = require('fs').promises;
    
    let browser;
    (async() => {
      const browser = await puppeteer.launch({
        headless: true,
        args: ['--no-sandbox']
      });
      const [page] = await browser.pages();
    
      await page.goto('https://old.reddit.com/', {
        "waitUntil": "networkidle0"
      });
      const aElems = await page.$$('.thumbnail');
      const urls = [];
    
      for (let i = 0; i < aElems.length && i < 3; i++) {
        const elem = aElems[i];
        const href = await page.evaluate(e => e.href, elem);
        const newPage = await browser.newPage();
        await newPage.goto(href, {
          "waitUntil": "networkidle0"
        });
    
        const url = await newPage.evaluate(() => document.location.href);
        console.log(url);
        urls.push(url);
      }
    
      await fs.writeFile('export.json', JSON.stringify(urls));
      await browser.close();
    })();
    

    提示:

    • 您已经在使用异步代码,因此 writeFileSync 相对于异步版本而言似乎不是最佳选择。
    • 使用let 而不是var,这样您就不会被i 破坏范围并在循环块外部(或内部)弹出一个陈旧的值。
    • 在循环结束时考虑newPage.close();。你现在只写了 3 页,但如果这是暂时的并且你打算让它变成 800 页,那么这是一个好主意。
    • "waitUntil": "networkidle0" 真的很慢。由于您所做的只是访问document.location.href,因此您可以使用waitUntil: "domcontentloaded" 加快速度。
    • JS 使用camelCase,而不是snake_case

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2021-06-17
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2021-01-22
      相关资源
      最近更新 更多