Javascript Web Scraping情侣尿液

问题描述 投票:0回答:1

我想从几个urls中获取一些数据并写入csv文件。但结果并不令我满意,因为我没有得到所有的数据(在这种情况下应该是10个),而且获取的数据的顺序也不对,应该是1,2,3等等,但我得到的是随机的,6,10,5,1......。应该是1,2,3等等,但是我得到的是随机的,6,10,5,1......。从这段代码中,我有时得到6个h3值,有时得到5个,这是随机发生的。我的url地址是100%好的。我使用了async await语法,但是没有任何帮助。我是初学者。这是我的代码。

const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const writeSteam = fs.createWriteStream('data.csv');

let data= '';
const numOfFetchData = 10;
const numbers = Array.from(Array(numOfFetchData + 1).keys());

async function getData() {
    for await (const number of numbers) {
        request('randomURL/' + (number+1), (err, res, html) => {
            if(!err && res.statusCode == 200 && (number+1) <= numOfFetchData) {
                const $ = cheerio.load(html);
                const h3Tag = $("h3")[0].children[0].data;
                data += (number + 1) + ' ' + h3Tag + '\n'   
            } else {
                writeSteam.write(`${data}`); 
            }
        });
    };
};

getData();

我的代码有什么需要改进的地方?

谢谢和最好的祝愿

javascript web-scraping request cheerio
1个回答
1
投票

再看了一下你的代码,似乎请求库并不返回承诺,而是通过回调工作(使得asyncawait无法使用)。如果你真的想让你的代码按顺序被获取,你可以

  1. 使用递归,只有在第一个请求完成后才会启动下一个请求。
async function getData(numbers) {
    request('randomURL/' + (numbers[numbers.length - 1] + 1), (err, res, html) => {
        numbers.pop()
        if(!err && res.statusCode == 200 && (number+1) <= numOfFetchData) {
                const $ = cheerio.load(html);
                const h3Tag = $("h3")[0].children[0].data;
                data += (number + 1) + ' ' + h3Tag + '\n'   
        } else {
                writeSteam.write(`${data}`); 
        }
        if (numbers.length > 0) getData(numbers);
    });
};

getData(numbers);
  1. 如果你获取数据的顺序并不重要,只要结果与初始数组的顺序相同,我建议使用fetch(一个承诺库)来代替request。
async function getData() {
    let fetchPromises = numbers.map(number => fetch('randomURL/' + (number+1)));
    const results = await Promise.all(fetchPromises); // results in order
    // Handle results
};
© www.soinside.com 2019 - 2024. All rights reserved.