使用节点js刮取网站并创建对象

时间:2018-03-23 12:21:36

标签: javascript json node.js web-scraping

我开始学习node.js,并试图抓取一些网站数据。 这是我的代码。

request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body,{
ignoreWhitespace: false
});

var produsGasit =[];

    $('body').each(function(i, elem){

        produsGasit[i]={};

            //produsGasit[i]['name'] = $(elem).find('.fn').text();
            produsGasit[i]['produs'] = $(elem).find('.product').text();
            produsGasit[i]['reducere'] = $(elem).find('.product-badge').text();
            produsGasit[i]['linkProdus'] = $(elem).find('.product_link').attr('href');
            //imagineProdus = $(elem).find('.ProductImage').text();
            produsGasit[i]['descriereProdus'] = $(elem).find('.ProductDetails').text();
            produsGasit[i]['pretProdus'] = $(elem).find('.price').text();
            //console.log(name+"±"+produs+"±"+reducere+"+"+linkProdus+"+"+descriereProdus+"+"+pretProdus);
            console.log(produsGasit[i]);

            fs.appendFile('produse.json', JSON.stringify(produsGasit,null,8), function (err) {
              if (err) throw err;
              console.log('Saved!');
            });


          }

  )}
})

我想写下我进入对象的信息。 我的问题是,当我运行代码时,它会根据我用来识别数据的类对所有数据进行分组。例如,产品的所有价格都在一个关键字:值字段中。 我想要做的是让我在页面上找到每个产品的标题,价格,并在json文件中创建与所有数据相对应的数据的单独对象。

1 个答案:

答案 0 :(得分:0)

Cheerios有一个map API method用于映射匹配的元素。 它接受一个回调函数,它接收索引和匹配的元素并返回结果。

此回调可用于将匹配的元素转换为产品对象(参见 Product函数。)

必须调用get API method来检索映射值。

通过选择产品的最近包含元素,您可以一次匹配产品列表。 例如 Noutati 部分中的产品位于无序列表中,其中每个列表项都有 .new_product 类。

const Product = (el, $) => {
    return {
        name: $(el).find('.fn').text(),
        produs: $(el).find('.product').text(),
        reducere: $(el).find('.product-badge').text(),
        linkProdus: $(el).find('.product_link').attr('href'),
        imagineProdus: $(el).find('.ProductImage img').attr('src'),
        descriereProdus: $(el).find('.ProductDetails').text(),
        pretProdus: $(el).find('.price').text()
    };
};

request(url, (err, response, body) => {
    if (!err) {
        const $ = cheerio.load(body, {ignoreWhitespace: false});
        const newProdusGasit = $('.new_product')
            .map((i, el) => ProductObject(el, $))
            .get();

        fs.appendFile(
            'produse.json', 
            JSON.stringify(newProdusGasit,null, 4), 
            function (err) {
                if (err) throw err;
                console.log('Saved!');
            }
        );
    }
})