【发布时间】: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