Nodejs请求Cheerio - 使用for循环抓取网站

时间:2018-05-15 21:58:40

标签: node.js for-loop request cheerio

我抓住了这个网站https://www.alza.sk/cpu-procesory/18842843-p1.htm这是一个带有pc组件的Czecho-Slovakia电子商店,我想获取有关CPU的数据。

我为在代码中使用斯洛伐克语而道歉,但这并不重要。

//代码

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');
                        });
                    }
                }
            });

        });

    }

  }
});

如果我从一个特定的CPU获取数据,这段代码很有用。 (box.eq(some_number))。

首先执行请求,查找名称并链接到CPU。然后使用此链接执行下一个请求,查找其他详细信息。

但是如果我使用循环,因为我想获取页面上所有CPU的数据。我总是只从最后一个CPU获取数据。 我在开始循环和结束时让增量写入控制台。在循环开始时,我有0到23之间的数字,这很好。但是在控制台的最后,我得到24次24号。我不明白为什么。

谢谢你的帮助。

0 个答案:

没有答案