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:
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.
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