Javascript 在运行结束时导出到CSV
刮取第一页数据的原始代码可以工作,但我创建了一个循环,单击“加载更多”按钮,然后刮取数据,直到没有更多的“加载更多”按钮。在我的跑步结束时,它没有输出任何东西。我导出到CSV的代码是否不正确?这件事我哪里做错了Javascript 在运行结束时导出到CSV,javascript,while-loop,puppeteer,export-to-csv,do-while,Javascript,While Loop,Puppeteer,Export To Csv,Do While,刮取第一页数据的原始代码可以工作,但我创建了一个循环,单击“加载更多”按钮,然后刮取数据,直到没有更多的“加载更多”按钮。在我的跑步结束时,它没有输出任何东西。我导出到CSV的代码是否不正确?这件事我哪里做错了 const puppeteer = require('puppeteer'); const jsonexport = require('jsonexport'); (async () => { const browser = await puppeteer.launch({
const puppeteer = require('puppeteer');
const jsonexport = require('jsonexport');
(async () => {
const browser = await puppeteer.launch({ headless: false }); // default is true
const page = await browser.newPage();
await page.goto('https://www.Website.com/exercises/finder', {
waitUntil: 'domcontentloaded',
});
//load more CSS to be targeted
const LoadMoreButton =
'#js-ex-content > #js-ex-category-body > .ExCategory-results > .ExLoadMore > .bb-flat-btn';
do {
// clicking load more button and waiting 1sec
await page.click(LoadMoreButton);
await page.waitFor(1000);
const loadMore = true;
const rowsCounts = await page.$eval(
'.ExCategory-results > .ExResult-row',
(rows) => rows.length
);
//scraping the data
const exerciseNames = [];
for (let i = 2; i < rowsCounts + 1; i++) {
const exerciseName = await page.$eval(
`.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,
(el) => el.innerText
);
exerciseNames.push(exerciseName);
}
console.log({exerciseNames});
} while (10000);
const allData = [
{
exercise: exerciseNames,
},
];
// exporting data to CSV
const options = [exercise];
//json export error part
jsonexport(allData, options, function (err, csv) {
if (err) return console.error(err);
console.log(csv);
});
await browser.close();
})().catch((e) => {
console.error(e);
});
编辑2
这是我目前的全部代码。它正在输出allData预填充信息,但不再输出新数据
const puppeteer = require('puppeteer');
const jsonexport = require('jsonexport');
const fs = require('fs');
(async () => {
const browser = await puppeteer.launch({ headless: false }); // default is true
const page = await browser.newPage();
await page.goto('https://www.website.com/exercises/finder', {
waitUntil: 'domcontentloaded',
});
const loadMore = true;
const rowsCounts = await page.$$eval(
'.ExCategory-results > .ExResult-row',
(rows) => rows.length
);
let allData = [];
for (let i = 2; i < rowsCounts + 1; i++) {
const exerciseName = await page.$eval(
`.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExHeading > a`,
(el) => el.innerText
);
const muscleGroupName = await page.$eval(
`.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExResult-muscleTargeted > a`,
(el) => el.innerHTML
);
const equipmentName = await page.$eval(
`.ExCategory-results > .ExResult-row:nth-child(${i}) > .ExResult-cell > .ExResult-equipmentType > a`,
(el) => el.innerHTML
);
let obj = {
exercise: exerciseName,
muscleGroup: muscleGroupName,
equipment: equipmentName,
};
allData.push(obj);
}
console.log(allData);
async function fn() {
const allData = [
{
exercise: 'Rickshaw Carry',
muscleGroup: 'Forearms',
equipment: 'Other',
},
{
exercise: 'Single-Leg Press',
muscleGroup: 'Quadriceps',
equipment: 'Machine',
},
{
exercise: 'Landmine twist',
muscleGroup: 'Forearms',
equipment: 'Other',
},
{
exercise: 'Weighted pull-up',
muscleGroup: 'Forearms',
equipment: 'Other',
},
];
// json export error part
jsonexport(allData, function (err, csv) {
if (err) return console.error(err);
console.log(csv);
fs.writeFileSync('output.csv', csv);
});
}
fn();
await browser.close();
})().catch((e) => {
console.error(e);
});
const puppeter=require('puppeter');
const jsonexport=require('jsonexport');
常数fs=要求('fs');
(异步()=>{
const browser=wait puppeter.launch({headless:false});//默认值为true
const page=wait browser.newPage();
等待页面。转到('https://www.website.com/exercises/finder', {
waitUntil:'domcontentloaded',
});
const loadMore=true;
const rowsconts=等待页面。$$eval(
“.ExCategory results>.ExResult行”,
(行)=>rows.length
);
让allData=[];
for(设i=2;i.ExResult行:第n个子(${i})>.ExResult单元格>.ExHeading>a`,
(el)=>el.innerText
);
const muscleGroupName=等待页面。$eval(
`.ExCategory results>.ExResult行:第n个子(${i})>.ExResult单元格>.ExResult muscleTargeted>a`,
(el)=>el.innerHTML
);
const equipmentName=等待页面。$eval(
`.ExCategory results>.ExResult行:第n个子(${i})>.ExResult单元格>.ExResult设备类型>a`,
(el)=>el.innerHTML
);
设obj={
练习:练习名称,
muscleGroup:muscleGroup名称,
设备:设备名称,
};
allData.push(obj);
}
console.log(allData);
异步函数fn(){
常数allData=[
{
练习:"人力车",,
肌肉群:“前臂”,
设备:“其他”,
},
{
练习:“单腿按压”,
肌肉群:“股四头肌”,
设备:“机器”,
},
{
练习:“地雷扭曲”,
肌肉群:“前臂”,
设备:“其他”,
},
{
练习:“负重引体向上”,
肌肉群:“前臂”,
设备:“其他”,
},
];
//json导出错误部分
jsonexport(所有数据,函数(err,csv){
if(err)返回控制台。error(err);
console.log(csv);
fs.writeFileSync('output.csv',csv);
});
}
fn();
等待浏览器关闭();
})()捕获((e)=>{
控制台错误(e);
});
我在这里看到两个问题
I.)其中一个带有选项
声明:
const options = [exercise]; // ❌
您试图访问allData
对象的exercise
属性,但没有正确的符号。如果确实需要在新数组中提取它,可以使用index[0]
进入allData
数组的第一个元素,然后使用访问练习
属性
const options = [allData[0].exercise]; // ✅
注意:我建议只保留选项allData[0]。练习
(不使用换行数组),因为allData
对象已经是一个数组了,我看不到使结构更深的好处
第二个问题是npm包的使用。我想您意外地将
allData
留在了这一行:
jsonexport(allData, options, function (err, csv) // ❌
您只需要此处的选项
(根据,您只能提供一个对象作为输入):
编辑 根据更新的答案,如果稍微重新构造
allData
对象,那么问题就可以得到解决,因此jsonexport将正确识别每一列和每一行
const jsonexport=require('jsonexport')
常量fs=require('fs')
异步函数fn(){
常数allData=[
{
练习:"人力车",,
肌肉群:“前臂”,
设备:“其他”
},
{
练习:“单腿按压”,
肌肉群:“股四头肌”,
设备:“机器”
},
{
练习:“地雷扭曲”,
肌肉群:“前臂”,
设备:“其他”
},
{
练习:“负重引体向上”,
肌肉群:“前臂”,
设备:“其他”
}
]
//json导出错误部分
jsonexport(所有数据,函数(err,csv){
如果(错误)返回控制台。错误(错误)
console.log(csv)
fs.writeFileSync('output.csv',csv)
})
}
fn()
要实现这样的结构,您应该在每次迭代中扩展所有数据
,如下所示:
let allData=[]
for(设i=2;iel.textContent.trim()
const muscleGroupName=wait page.$eval(`……行:第n个子(${i}))…`,
el=>el.textContent.trim()
const equipmentName=wait page.$eval(`…行:第n个子(${i}))…`,
el=>el.textContent.trim()
设obj={
练习:练习名称,
muscleGroup:muscleGroup名称,
设备:设备名称
}
allData.push(obj)
}
console.log(所有数据)
我们需要更多信息。到底发生了什么?代码是否记录了错误?突出的一行是“const options=[exercise];“什么是exercise?”?你好像没有申报。正如一个疯狂的建议,您可以尝试删除options参数,因为它似乎没有必要,而且可能会导致问题。虽然是IDK。对于选项,我认为这是因为它会导出一个列练习,而每一行都是exerciseNames。我也不明白它如何将其导出为CSV文件。但在研究了更多内容之后,我是否需要导入fs以便创建CSV文件?对所有的问题我都很抱歉,我对这个问题还不熟悉,而且很困惑。和往常一样,谢谢你的帮助。我花了一整天的时间想弄明白,但现在我真的被卡住了。我更新了网站并发布了我用于导出的当前代码。让我们一起来。嗨@Br
jsonexport(allData, options, function (err, csv) // ❌
jsonexport(options, function (err, csv) // ✅