【问题标题】:Scrape website and create objects using node js使用节点 js 抓取网站并创建对象
【发布时间】:2018-03-23 12:21:35
【问题描述】:

我开始学习 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!');
            });


          }

  )}
})

我想将获得的信息写入对象。 我的问题是,当我运行代码时,它会根据我用来识别数据的类对所有数据进行分组。例如,产品的所有价格都在一个 key:value 字段中。 我想要做的是获取我在页面上找到的每个产品的标题、价格,并在包含所有数据的 json 文件中使用该数据创建单独的对象。

【问题讨论】:

  • 您希望为每个单独的产品选择最近的包含元素,而不是选择“body”。如果您不介意请求哪个 URL?
  • sports.woomie.ro 开头没有“www”
  • 这里有一些东西可以帮助你学习。这个网站有很多很棒的教程。这是一个关于抓取的:scotch.io/tutorials/scraping-the-web-with-node-js

标签: javascript json node.js web-scraping


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多