【问题标题】:Puppeter Save returned value from page evaluate as a csvPuppeteer 将页面评估的返回值保存为 csv
【发布时间】:2020-10-28 03:57:33
【问题描述】:

我目前有一个 puppeteer 脚本,它通过获取页​​面上所有 href 的数组、遍历每个 href 链接,然后从每个相应的 href 链接获取数据来从网站获取信息。

使用 page.evaluate 函数后,我能够通过 return 返回所有想要的值。

如何将 return 的值写入 csv?

这是我的脚本:

const stealth = require('puppeteer-extra-plugin-stealth')();
 


const hrefsCategoriesDeduped = new Set(await page.evaluate(
    () => Array.from(
      document.querySelectorAll('.b-shared-linked-pharmacy__box a[href].b-shared-linked-pharmacy__details'),
      a => a.href
    )
  ));


  let pages = [];

console.log (hrefsCategoriesDeduped)

for (const url of hrefsCategoriesDeduped) {

    await page.goto(url);
   // await page.waitFor(10000)
    let telusData = {   
      name: "",
      address: "",
      city: "",
      province: "",
      postal: "",
      fax: "",
      pharmacyphone: "",
      pharmacyfax: "",
      pharmacyemail: "",
      pharmacywebsite: ""
    };
    await page.waitForSelector('.b-pharmacy-detail__details');
    //let pharmacycomplete = []

    telusData =  await page.evaluate(() => {
 let pharmacyname  = document.querySelector('h2[class="b-pharmacy-detail__name"]').innerText
 let pharmacystreet = Array.from(document.querySelectorAll(".b-pharmacy-detail__info"), element => element.textContent)
 let pharmacyphoneandfax = Array.from(document.querySelectorAll(".b-pharmacy-detail__contact"), element => element.textContent)

var variable_names = {};
for(var i = 0; i< pharmacystreet.length; i++){
  variable_names['na_'+i] = pharmacystreet[i];
}


return {
  name: pharmacyname,
  address: pharmacyaddress,
  city1: city[1],
 province: province[1],
 postal: postal[1],
 pharmacyphone: pharmacyphone,
 pharmacyfax: pharmacyfax,
 pharmacyemail: pharmacyemail,
 pharmacywebsite: pharmacywebsite,

 }
});

console.log(telusData)

  }



    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

现在,我使用 csv 的所有标头声明变量 TelusData,然后执行页面评估以接收标头的值和相应的值。 我回来了:

return {
  name: pharmacyname,
  address: pharmacyaddress,
  city1: city[1],
 province: province[1],
 postal: postal[1],
 pharmacyphone: pharmacyphone,
 pharmacyfax: pharmacyfax,
 pharmacyemail: pharmacyemail,
 pharmacywebsite: pharmacywebsite,

 }

对于每个“telusdata”,如何将数据的值也保存到带有标题的 csv 中?非常感谢任何帮助。

【问题讨论】:

  • 您只是停留在创建实际的 csv 吗?看看:csv.js.org/project/examples
  • 我坚持以所需格式生成 CSV(我希望它发布所有值作为回报)
  • 如果我对您的理解正确,您想为每个 URL 构建一个 TelusData 对象,然后为每个 URL 的数据生成一个 csv。如果是这样,您只需在构建它们时将每个对象推入一个数组,然后使用该数组生成您的 csv。
  • 没错,是的,但它希望来自 url 的每个数据与 telusdata 在 1 个 csv 中。你能用一些测试数据展示一个例子吗?
  • 我将添加一个答案,为您指明正确的方向,因为 cmets 中的代码块是有限的......一秒钟......

标签: javascript node.js csv puppeteer


【解决方案1】:

我已经稍微减少了您的代码,因为有很多与您的具体问题无关。希望这可以为您指明正确的方向。


(async function main() {
    try {
        // create array to store all the data
        let telusDataArray = [];

        for (const url of hrefsCategoriesDeduped) {
            telusData = await page.evaluate(() => {
                return {
                    name: pharmacyname,
                    address: pharmacyaddress,
                    city1: city[1],
                    province: province[1],
                    postal: postal[1],
                    pharmacyphone: pharmacyphone,
                    pharmacyfax: pharmacyfax,
                    pharmacyemail: pharmacyemail,
                    pharmacywebsite: pharmacywebsite,
                }
            });
            telusDataArray.push(telusData); // add each url's data to the array
        }

        // at this point telusDataArray should be filled and ready for CSV generation

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

【讨论】:

  • 它现在似乎工作得更好了,谢谢。快速提问,当我尝试导出到 CSV 时,结果只是输出 [object Object]。我怎样才能得到对象的价值。我怀疑这是因为我将对象转换为字符串。有什么想法吗?
  • 如果您尝试在 js 中记录几乎任何通用对象,这就是输出。如果您尝试输出 JSON,您可以使用 JSON.prettify(data, null 2);,或者如果您使用的是 csv 库,则需要检查 api 的输出功能。
  • 感谢您抽出宝贵时间提供帮助!我能够 JSON.Stringify 对象,并派生数据。现在一切都像魅力一样 :-)
猜你喜欢
  • 2018-03-13
  • 2020-08-12
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多