Este script es para obtener el título de la página web donde se pasará la URL del sitio web desde un archivo de Excel, verificar si el título contiene la palabra clave y luego almacenar ese dominio en el nuevo archivo de Excel.
No hay problema con el código parcial, pero la comparación de títulos no funciona como se esperaba. ¿Alguien tiene una idea de cómo solucionarlo?
aquí está mi código
var request = require("request"); var cheerio = require("cheerio"); const xlsx = require("xlsx"); jsonData = [{ Domain: "blogger.com" }, { Domain: "stackoverflow.com" }]; function fetchTitle(url, onComplete = null) { request(url, function (error, response, body) { var output = url; // default to URL if (!error && (response && response.statusCode) === 200) { var $ = cheerio.load(body); console.log(`URL = ${url}`); var title = $("head > title").text().trim(); console.log(`Title = ${title}`); output = `[${title}] (${url})`; var keywords = ["Developers", "blog"]; var results = []; var UrlArray = []; for (var i = 0; i < keywords.length; i++) { var match = title.match(new RegExp(keywords.join("|"), "g")); results.push(keywords[i]); } if (match.length > 0) { UrlArray.push({ Domain: url, Keywords: results, Title: output, }); finalJsonData = JSON.stringify(UrlArray); const ws = xlsx.utils.json_to_sheet(UrlArray); const wb = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(wb, ws, "Responses"); xlsx.writeFile(wb, "output.xlsx"); } } else { console.log( `Error = ${error}, code = ${response && response.statusCode}` ); } console.log(`output = ${output} \n\n`); if (onComplete) onComplete(output); }); } jsonData.forEach(function (table) { var tableName = table.Domain; var URL = "http://" + tableName; fetchTitle(URL); });
Cuando ejecuto el script, puedo obtener el título, pero cuando lo comparo con la palabra clave, no funciona como se esperaba. Las palabras clave no se almacenan. Puede ver cómo se ve la salida después de ejecutar el script.
La secuencia de comandos muestra que ambos dominios tienen palabras clave, pero solo Blogger está almacenado en la hoja de cálculo, aunque las palabras clave no se almacenan.
keywords
es una matriz, por lo que no se guarda, además, la columna de palabras clave siempre contendrá todas las palabras clave, no las que coinciden...como las solicitudes son asíncronas, debe realizar un seguimiento de todas ellas y escribir los resultados solo cuando todas las solicitudes hayan finalizado.
prueba esto:
el código:
var request = require("request"); var cheerio = require("cheerio"); const xlsx = require("xlsx"); const jsonData = [{ Domain: "blogger.com" }, { Domain: "stackoverflow.com" }]; var UrlArray = []; function writeResults() { const finalJsonData = JSON.stringify(UrlArray); const ws = xlsx.utils.json_to_sheet(UrlArray); const wb = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(wb, ws, "Responses"); xlsx.writeFile(wb, "output.xlsx"); } function fetchTitle(url, onComplete = null) { request(url, function (error, response, body) { var output = url; // default to URL if (!error && (response && response.statusCode) === 200) { var $ = cheerio.load(body); console.log(`URL = ${url}`); var title = $("head > title").text().trim(); console.log(`Title = ${title}`); output = `[${title}] (${url})`; var keywords = ["Developers", "blog"]; var results = []; for (var i = 0; i < keywords.length; i++) { let match = title.match(new RegExp(keywords[i], "gi")); if (match && match.length > 0) { results.push(keywords[i]); } } UrlArray.push({ Domain: url, Keywords: results.length > 0 ? results.join(', ') : 'no match', Title: output, }); } else { console.log( `Error = ${error}, code = ${response && response.statusCode}` ); } console.log(`output = ${output} \n\n`); if (onComplete) onComplete(output); }); } let counter = 0; jsonData.forEach(function (table) { var tableName = table.Domain; var URL = "http://" + tableName; fetchTitle(URL, ()=>{ counter++; if(counter === jsonData.length) { console.log(`all ${counter} requests done`); writeResults(); } }); });