Nodejs Request Cheerio - выскабливание сайта с помощью цикла - PullRequest
0 голосов
/ 16 мая 2018

Я просмотрел этот сайт https://www.alza.sk/cpu-procesory/18842843-p1.htm Это большой интернет-магазин Чехословакии с компьютерными компонентами, я хочу получить данные о процессоре.

Я прошу прощения за использование словацких слов в коде, но это не имеет значения.

// CODE

url = 'https://www.alza.sk/cpu-procesory/18842843-p1.htm';

var allCpu = new Array;

request(url, function(error, response, html) {
    if(error) {
        console.log(error);
    } else {
        var $ = cheerio.load(html);
        var box = $('#boxc .box');

    for(i = 0; i < box.length; i++) {
       console.log(i) // Output is numbers from 0 to 23

        var cpu = {
            meno: '',
            link: '',
            socket: '',
            radaCpu: '',
            xJadier: '',
            frekvenciaCpu: '',
            maxFrekvenciaCpu: ''
        }

        box.eq(i).filter(function() {
            cpu.meno = $(this).find('.fb a').text();
            cpu.link = $(this).find('.fb a').attr('href');

            request('https://www.alza.sk/' + cpu.link, function(error, response, html) {
                if(error) {
                    console.log(error);
                } else {
                    var $socket = cheerio.load(html);
                    var params = $socket('#popis .params .groupValues .row a');

                    params.filter(function() {
                        if($(this).text() == 'Socket') cpu.socket = $(this).parents('.row').find('.value').text();
                        if($(this).text() == 'Rad procesora') cpu.radaCpu = $(this).parents('.row').find('.value').text();
                        if($(this).text() == 'Počet jadier procesora') cpu.xJadier = $(this).parents('.row').find('.value').text();
                        if($(this).text() == 'Frekvencie procesora') cpu.frekvenciaCpu = $(this).parents('.row').find('.value').text();
                        if($(this).text() == 'Maximálna frekvencia (OC)') cpu.maxFrekvenciaCpu = $(this).parents('.row').find('.value').text();
                    });

                    allCpu.push(cpu);

                    console.log(i); // Output is 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24

                    if(i == box.length - 1) {

                        fs.writeFile('output.json', JSON.stringify(allCpu, null, 4), function(err){
                            console.log('File successfully written! - Check your project directory for the output.json file');
                        });
                    }
                }
            });

        });

    }

  }
});

Этот код отлично работает, если я получаю данные с одного конкретного процессора.(box.eq (some_number)).

Сначала он выполняет запрос, находит имя и ссылку на процессор.Далее он с помощью этой ссылки выполняет следующий запрос, который находит другую подробную информацию.

Но если я использую цикл, потому что я хочу получить данные всех процессоров на странице.Я всегда получаю данные только с последнего процессора.Я позволил инкременту записи в консоль при запуске моего цикла и в конце.В начале цикла у меня были цифры от 0 до 23, это хорошо.Но в конце в консоли я получил число 24 раза. Я не понимаю, почему.

Спасибо за помощь.

...