Hoje, vamos aprender o tutorial de rastreador de Alsotang e simplesmente rastejar CNODE.
Crie um projeto Craelr-Demo
Primeiro, criamos um projeto expresso e excluímos todo o conteúdo dos arquivos app.js, porque não precisamos exibir conteúdo no lado da web por enquanto. Obviamente, também podemos usar a função expressa de que precisamos por npm install express diretamente em uma pasta vazia.
Análise do site de destino
Como mostrado na figura, isso faz parte da tag Div na página inicial do CNODE. Utilizamos esta série de IDs e classes para localizar as informações de que precisamos.
Use SuperAgente para obter dados de origem
SuperAgent é a biblioteca HTTP usada pela API AJAX. É usado de maneira semelhante ao jQuery , através do qual iniciamos uma solicitação GET, emitindo o resultado na função de retorno de chamada.
A cópia do código é a seguinte:
var express = requer ('expresso');
var url = requer ('url'); // Analisar o URL da operação
var superAGENT = requer ('SuperAgent'); // Não se esqueça da instalação do NPM
Var Cheeseio = requer ('Cheerio');
var eventproxy = requer ('EventProxy');
var Targeturl = 'https://cnodejs.org/';
SuperaGent.get (TargetUrl)
.nd (function (err, res) {
console.log (res);
});
Seu resultado RES é um objeto que contém as informações de URL de destino e o conteúdo do site está principalmente em seu texto (string).
Use Cheatio para analisar
Cheerio atua como uma função jQuery do lado do servidor. Primeiro, usamos seu .load () para carregar HTML e depois filtrar elementos através do seletor CSS.
A cópia do código é a seguinte:
var $ = Cheeseio.load (res.text);
// filtra os dados através do seletor CSS
$ ('#tópico_list .topic_title'). cada (função (idx, elemento) {
console.log (elemento);
});
O resultado é um objeto, e a função .each(function(index, element)) é chamada para iterar através de cada objeto, e os elementos HTML DOM são retornados.
O resultado do console.log($element.attr('title')); é广州2014年12月06日NodeParty 之UC 场
Para títulos como este, o output console.log($element.attr('href')); O resultado é um URL como /topic/545c395becbcb78265856eb2 . Em seguida, use a função url.resolve () de nodejs1 para concluir o URL completo.
A cópia do código é a seguinte:
SuperaGent.get (Turl)
.nd (function (err, res) {
if (err) {
retornar console.error (err);
}
var tapsUrls = [];
var $ = Cheeseio.load (res.text);
// Obtenha todos os links na página inicial
$ ('#tópico_list .topic_title'). cada (função (idx, elemento) {
var $ elemento = $ (elemento);
var href = url.resolve (turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Use o EventProxy para rastejar conteúdo simultaneamente de cada tópico
O tutorial mostra exemplos de métodos de aninhado profundo (serial) e métodos contra -contadores. O EventProxy usa métodos de evento (paralelo) para resolver esse problema. Depois que todo o rastreamento é concluído, o EventProxy chamará automaticamente a função de processamento quando receber a mensagem do evento.
A cópia do código é a seguinte:
// Etapa 1: Obtenha uma instância do EventProxy
var ep = new EventProxy ();
// Etapa 2: defina a função de retorno de chamada que ouve os eventos.
// após o método é repetido ouvindo
// params: EventName (String) Nome do evento, Times (número) Número de escutas, função de retorno de chamada
ep.after ('tópico_html', tópicos.length, função (tópicos) {
// Tópicos é uma matriz que contém os 40 pares no ep.emit ('tópico_html', par) 40 vezes
//.mapa
tópicos = tópicos.map (function (tippair) {
// Use Cheerio
var tipaturl = tópico [0];
var topichtml = tópico [1];
var $ = cheeseio.load (topichtml);
retornar ({
Título: $ ('. tópico_full_title'). text (). TRIM (),
href: tópico,
Comentário1: $ ('. Responder_content'). Eq (0) .Text (). Trim ()
});
});
//resultado
console.log ('Resultado:');
console.log (tópicos);
});
// Etapa 3: determine a liberação de mensagens de evento
tópicos
SuperAgent.get (Topicurl)
.nd (function (err, res) {
console.log ('busca' + tipuls + 'bem -sucedido');
ep.emit ('tópico_html', [tapsurl, res.text]);
});
});
Os resultados são os seguintes
Exercícios estendidos (desafios)
Obtenha o nome de usuário e pontos da mensagem
Encontre o nome da classe do usuário do comentário no código -fonte da página do artigo e o nome da classe é Responder_Author. console.log primeiro elemento $('.reply_author').get(0) pode ser visto que precisamos obter as coisas aqui.
Primeiro, podemos rastejar um artigo e obter tudo o que precisamos de uma vez.
A cópia do código é a seguinte:
var userHref = url.resolve (turl, $ ('. Responder_author'). get (0) .attribs.href);
console.log (userHref);
console.log ($ ('. Responder_author'). Get (0) .Children [0] .Data);
Podemos capturar informações de pontos através de https://cnodejs.org/user/username
A cópia do código é a seguinte:
$ ('. Reply_author'). Cada (função (idx, elemento) {
var $ elemento = $ (elemento);
console.log ($ element.attr ('href'));
});
Na página de informações do usuário $('.big').text().trim() são as informações dos pontos.
Use o FUNCTION.GETION (0) Use o primeiro elemento.
A cópia do código é a seguinte:
var userHref = url.resolve (turl, $ ('. Responder_author'). get (0) .attribs.href);
console.log (userHref);
Este é apenas um rastreamento de um único artigo, e ainda há algumas coisas que precisam ser modificadas para 40 artigos.