Hoy, aprendamos el tutorial de Crawler de Alsotang y simplemente rastree Cnode.
Crea un proyecto Craelr-Demo
Primero creamos un proyecto expreso y luego eliminamos todos los contenidos de los archivos App.js, porque no necesitamos mostrar contenido en el lado web por el momento. Por supuesto, también podemos usar la función Express que necesitamos por npm install express directamente en una carpeta vacía.
Análisis de sitios web objetivo
Como se muestra en la figura, esta es una parte de la etiqueta DIV en la página de inicio de CNODE. Utilizamos esta serie de ID y clases para localizar la información que necesitamos.
Use Superagent para obtener datos de origen
Superagent es la biblioteca HTTP utilizada por la API AJAX. Se usa de manera similar a jQuery , a través de la cual iniciamos una solicitud GET, generando el resultado en la función de devolución de llamada.
La copia del código es la siguiente:
var express = request ('express');
var url = require ('url'); // analiza la URL de operación
var superagent = request ('supergent'); // No olvide la instalación de NPM
var queseusio = request ('Cheerio');
var eventProxy = request ('EventProxy');
var TargetUrl = 'https://cnodejs.org/';
Superagent.get (TargetUrl)
.end (function (err, res) {
console.log (res);
});
Su resultado RES es un objeto que contiene la información de URL de destino, y el contenido del sitio web está principalmente en su texto (cadena).
Use truco para analizar
Cheerio actúa como una función jQuery del lado del servidor. Primero usamos su .Load () para cargar HTML y luego filtrar elementos a través del selector CSS.
La copia del código es la siguiente:
var $ = Cheese.load (res.text);
// Filtrar datos a través del selector CSS
$ ('#topic_list .Topic_title'). Cada (función (idx, elemento) {
console.log (elemento);
});
El resultado es un objeto, y la función .each(function(index, element)) se llama a iterar a través de cada objeto, y se devuelve los elementos HTML DOM.
El resultado de la salida console.log($element.attr('title')); es广州2014年12月06日NodeParty 之UC 场
Para títulos como este, Output console.log($element.attr('href')); El resultado es una URL como /topic/545c395becbcb78265856eb2 . Luego use la función url.resolve () de NodeJS1 para completar la URL completa.
La copia del código es la siguiente:
Superagent.get (Turl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var topicUrls = [];
var $ = Cheese.load (res.text);
// Obtener todos los enlaces en la página de inicio
$ ('#topic_list .Topic_title'). Cada (función (idx, elemento) {
var $ element = $ (elemento);
var href = url.resolve (turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Use EventProxy para rastrear simultáneamente desde cada tema
El tutorial muestra ejemplos de métodos anidados (en serie) profundos y contadores. EventProxy utiliza métodos de eventos (paralelos) para resolver este problema. Después de completar todo el rastreo, EventProxy llamará automáticamente la función de procesamiento cuando reciba el mensaje del evento.
La copia del código es la siguiente:
// Paso 1: Obtenga una instancia de EventProxy
var ep = new EventProxy ();
// Paso 2: Defina la función de devolución de llamada que escucha los eventos.
// después del método se repite escuchar
// params: eventname (string) Nombre del evento, Times (Número) Número de Listens, Función de devolución de llamada de devolución de llamada
ep.After ('topic_html', topicUrls.length, function (temas) {
// temas es una matriz que contiene los 40 pares en ep.emit ('topic_html', par) 40 veces
//.mapa
topics = topics.map (function (topicpair) {
// Usa Cheerio
var topicUrl = topicpair [0];
var topichtml = topicpair [1];
var $ = quese.load (topichtml);
devolver ({
Título: $ ('. Topic_full_title'). Text (). Trim (),
href: topicurl,
Comentario1: $ ('.
});
});
//resultado
console.log ('resultado:');
console.log (temas);
});
// Paso 3: determinar la versión de mensajes de eventos
topicUrls.forEach (function (topicUrl) {
Superagent.get (TopicUrl)
.end (function (err, res) {
console.log ('fetch' + topicUrl + 'exitoso');
ep.emit ('topic_html', [topicUrl, res.text]);
});
});
Los resultados son los siguientes
Ejercicios extendidos (desafíos)
Obtenga el nombre de usuario y puntos de usuario
Encuentre el nombre de la clase de usuario del comentario en el código fuente de la página del artículo, y el nombre de clase es responder_author. console.log primer elemento $('.reply_author').get(0)
Primero, podemos rastrear un artículo y obtener todo lo que necesitamos a la vez.
La copia del código es la siguiente:
var userHref = url.resolve (turl, $ ('.
console.log (userhref);
console.log ($ ('.
Podemos obtener información de puntos a través de https://cnodejs.org/user/username
La copia del código es la siguiente:
$ ('.
var $ element = $ (elemento);
console.log ($ element.attr ('href'));
});
En la página de información del usuario $('.big').text().trim() es la información de puntos.
Use la función de truce.get (0) para obtener el primer elemento.
La copia del código es la siguiente:
var userHref = url.resolve (turl, $ ('.
console.log (userhref);
Esto es solo un gateo de un solo artículo, y todavía hay algunas cosas que deben modificarse para 40 artículos.