Cree un boletín de datos de abastecimiento usando MongoDB

Hay muchos sitios web de entrega de noticias disponibles como ndtv.com . En este artículo, veamos la función muy útil e interesante de cómo obtener los datos de ndtv.com a través de la función de extracción, es decir, extraer los contenidos de ndtv.com y almacenarlos en MongoDB. MongoDB es una base de datos modelo documentum NoSQL.

Usando Mongoose, Node JS, Cheerio, el sitio web de noticias NDTV se extrae y los datos se cargan en la base de datos Mongo DB. Esta es una aplicación de JavaScript de pila completa creada con MongoDB, Mongoose, Node.js, Express.js, Handlebars.js, HTML y CSS. Raspa la página de inicio de [NDTV](https://ndtv.com/) y almacena títulos de artículos y enlaces.

Instalación del módulo: Instale los módulos requeridos usando el siguiente comando.

npm install body-parser
npm install cheerio
npm install express
npm install express-handlebars
npm install mongoose
npm install request

Estructura del proyecto: Se verá así.

Implementación:

Nombre de archivo: server.js: este es el archivo importante necesario para iniciar la ejecución de la aplicación. Para llamar al sitio de ndtv, extraiga los datos y guárdelos en la base de datos de MongoDB.

Javascript

// First specifying the required dependencies
// Express is a minimal and flexible Node.js
// web application framework that provides a 
// robust set of features for web and mobile 
// applications
var express = require("express");
  
// To communicate with mongodb, we require "mongoose"
var mongoose = require("mongoose");
  
// As we need to call ndtv website and access
// the urls, we require "request"
var request = require("request");
  
// Cheerio parses markup and provides an 
// API for traversing/manipulating the
// resulting data structure
var cheerio = require("cheerio");
  
// Node.js body parsing middleware.
// Parse incoming request bodies in a
// middleware before your handlers, 
// available under the req.body property.
var bodyParser = require("body-parser");
var exphbs = require("express-handlebars");
  
// We can explicitly set the port number
// provided no other instances running 
// on that port
var PORT = process.env.PORT || 3000;
  
// Initialize Express
var app = express();
  
// Use body-parser for handling form submissions
app.use(bodyParser.urlencoded({
    extended: false
}));
  
// We are getting the output in the
// form of application/json
app.use(bodyParser.json({
    type: "application/json"
}));
  
// Serve the public directory
app.use(express.static("public"));
  
// Use promises with Mongo and connect to
// the database
// Let us have our mongodb database name
// to be ndtvnews By using Promise, 
// Mongoose async operations, like .save()
// and queries, return thenables. 
mongoose.Promise = Promise;
var MONGODB_URI = process.env.MONGODB_URI 
        || "mongodb://localhost/ndtvnews";
  
mongoose.connect(MONGODB_URI);
  
// Use handlebars
app.engine("handlebars", exphbs({
    defaultLayout: "main"
}));
  
app.set("view engine", "handlebars");
  
// Hook mongojs configuration to the db variable
var db = require("./models");
  
// We need to filter out NdtvArticles from
// the database that are not saved
// It will be called on startup of url
app.get("/", function (req, res) {
  
    db.Article.find({
        saved: false
    },
        function (error, dbArticle) {
            if (error) {
                console.log(error);
            } else {
  
                // We are passing the contents
                // to index.handlebars
                res.render("index", {
                    articles: dbArticle
                });
            }
        })
})
  
// Use cheerio to scrape stories from NDTV
// and store them
// We need to do this on one time basis each day
app.get("/scrape", function (req, res) {
    request("https://ndtv.com/", function (error, response, html) {
  
        // Load the html body from request into cheerio
        var $ = cheerio.load(html);
  
        // By inspecting the web page we know how to get the 
        // title i.e. headlines of news.
        // From view page source also we can able to get it. 
        // It differs in each web page
        $("h2").each(function (i, element) {
  
            // The trim() removes whitespace because the 
            // items return \n and \t before and after the text
            var title = $(element).find("a").text().trim();
            console.log("title", title);
            var link = $(element).find("a").attr("href");
            console.log("link", link);
  
            // If these are present in the scraped data, 
            // create an article in the database collection
            if (title && link) {
                db.Article.create({
                    title: title,
                    link: link
                },
                    function (err, inserted) {
                        if (err) {
  
                            // Log the error if one is 
                            // encountered during the query
                            console.log(err);
                        } else {
  
                            // Otherwise, log the inserted data
                            console.log(inserted);
                        }
                    });
  
                // If there are 10 articles, then 
                // return callback to the frontend
                console.log(i);
                if (i === 10) {
                    return res.sendStatus(200);
                }
            }
        });
    });
});
  
// Route for retrieving all the saved articles. 
// User has the option to save the article.
// Once it is saved, "saved" column in the 
// collection is set to true. 
// Below routine helps to find the articles 
// that are saved
app.get("/saved", function (req, res) {
    db.Article.find({
        saved: true
    })
        .then(function (dbArticle) {
  
            // If successful, then render with
            // the handlebars saved page
            // this time saved.handlebars is 
            // called and that page is rendered
            res.render("saved", {
                articles: dbArticle
            })
        })
        .catch(function (err) {
  
            // If an error occurs, send the
            // error back to the client
            res.json(err);
        })
});
  
// Route for setting an article to saved
// In order to save an article, this routine is used.
// _id column in collection is unique and it will 
// determine the uniqueness of the news
app.put("/saved/:id", function (req, res) {
    db.Article.findByIdAndUpdate(
        req.params.id, {
        $set: req.body
    }, {
        new: true
    })
        .then(function (dbArticle) {
  
            // This time saved.handlebars is 
            // called and that page is rendered
            res.render("saved", {
                articles: dbArticle
            })
        })
        .catch(function (err) {
            res.json(err);
        });
});
  
// Route for saving a new note to the db and
// associating it with an article
app.post("/submit/:id", function (req, res) {
    db.Note.create(req.body)
        .then(function (dbNote) {
            var articleIdFromString = 
                mongoose.Types.ObjectId(req.params.id)
  
            return db.Article.findByIdAndUpdate(
                articleIdFromString, {
                $push: {
                    notes: dbNote._id
                }
            })
        })
        .then(function (dbArticle) {
            res.json(dbNote);
        })
        .catch(function (err) {
  
            // If an error occurs, send it
            // back to the client
            res.json(err);
        });
});
  
// Route to find a note by ID
app.get("/notes/article/:id", function (req, res) {
    db.Article.findOne({ "_id": req.params.id })
        .populate("notes")
        .exec(function (error, data) {
            if (error) {
                console.log(error);
            } else {
                res.json(data);
            }
        });
});
  
  
app.get("/notes/:id", function (req, res) {
    db.Note.findOneAndRemove({ _id: req.params.id }, 
        function (error, data) {
            if (error) {
                console.log(error);
            }
            res.json(data);
    });
});
  
// Listen for the routes
app.listen(PORT, function () {
    console.log("App is running");
});

Pasos para ejecutar la aplicación: Ejecute el archivo server.js con el siguiente comando.

node server.js

Salida: Veremos la siguiente salida en la pantalla del terminal.

App is running

Ahora abra cualquier navegador y vaya a http://localhost:3000/ , obtendremos una página similar a la siguiente.

Para obtener las noticias de ndtv.com, debemos hacer clic en Obtener nuevos artículos . Esto llamará internamente a nuestra ruta /scrape . Una vez realizada esta llamada, en MongoDB, en la base de datos ndtvnews, los artículos denominados colección se llenaron con los datos que se muestran a continuación:

colección de artículos

Aquí, el atributo guardado inicialmente será falso, la identificación se crea automáticamente en MongoDB y esta es la identificación única de un documento en una colección. Este atributo solo ayuda a ver un documento, guardar un documento, etc.

Los artículos extraídos se muestran en este formato

Al hacer clic en Ver artículo en NDTV , navegará al artículo respectivo. Esto es posible solo gracias al atributo id que está presente en la colección de artículos . Entonces, cuando hacemos clic en Ver artículo en NDTV, ya que es un hipervínculo, directamente ese valor _id del documento se selecciona internamente y se muestra el enlace . Cuando se hace clic en Guardar artículo , el valor _Id será la parte de identificación de ese artículo.

Trabajo: Todo el modelo de trabajo del proyecto se explica en el video:

Conclusión: es más fácil y simple raspar cualquier sitio web de noticias y mostrar solo el contenido del título junto con un enlace que sigue para continuar, y podemos guardar el artículo y consultar los artículos guardados fácilmente.

Referencia: https://github.com/raj123raj/NdtvNewsScraperUsingMongoDB

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *