Сегодня давайте изучим учебник Alsotang и просто ползти Cnode.
Создать проект Craelr-Demo
Сначала мы создаем экспресс -проект, а затем удаляем все содержимое файлов app.js, потому что нам не нужно показывать контент на веб -стороне в настоящее время. Конечно, мы также можем использовать необходимую нам функцию Express с помощью npm install express непосредственно в пустой папке.
Целевой анализ веб -сайта
Как показано на рисунке, это является частью тега Div на домашней странице CNODE. Мы используем эту серию идентификаторов и классов, чтобы найти необходимую нам информацию.
Используйте Superagent, чтобы получить исходные данные
Superagent - это библиотека HTTP, используемая API AJAX. Используется аналогично jQuery , через который мы инициируем запрос GET, выводя результат в функцию обратного вызова.
Кода -копия выглядит следующим образом:
var Express = require ('Express');
var url = require ('url'); // Проанализируйте URL операции
var superagent = require ('superagent'); // не забудьте установить NPM
var cheese = require ('cheerio');
var eventProxy = require ('eventProxy');
var targetUrl = 'https://cnodejs.org/';
Superagent.get (TargetUrl)
.end (function (err, res) {
console.log (res);
});
Результатом его RES является объект, содержащий целевую информацию URL -адреса, а содержимое веб -сайта в основном в своем тексту (строка).
Используйте Cheatio для анализа
Cheerio действует как функция jQuery на стороне сервера. Сначала мы используем его .load () для загрузки HTML, а затем фильтруют элементы через селектор CSS.
Кода -копия выглядит следующим образом:
var $ = cheese.load (res.text);
// фильтровать данные через селектор CSS
$ ('#TOMA_LIST .TOPIC_TITLE'). Каждый (function (idx, element) {
console.log (element);
});
Результатом является объект, и .each(function(index, element))
Результат выходной console.log($element.attr('title'));广州2014年12月06日NodeParty 之UC 场
Для таких названий, output console.log($element.attr('href')); Результатом является URL, подобный /topic/545c395becbcb78265856eb2 . Затем используйте функцию url.resolve () nodejs1, чтобы завершить полный URL.
Кода -копия выглядит следующим образом:
Superagent.get (Turl)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var tomoUrls = [];
var $ = cheese.load (res.text);
// Получить все ссылки на домашней странице
$ ('#TOMA_LIST .TOPIC_TITLE'). Каждый (function (idx, element) {
var $ element = $ (element);
var href = url.resolve (turl, $ element.attr ('href'));
console.log (href);
//topicurls.push(href);
});
});
Используйте EventProxy для одновременного содержимого с каждой темой
В учебном пособии показаны примеры глубоких вложенных (последовательных) методов и встречных методов. EventProxy использует методы события (параллельно) для решения этой проблемы. После того, как все ползание будет завершено, EventProxy автоматически вызовет функцию обработки, когда оно получит сообщение о событии.
Кода -копия выглядит следующим образом:
// Шаг 1: Получите экземпляр EventProxy
var ep = new EventProxy ();
// Шаг 2: Определите функцию обратного вызова, которая слушает события.
// после повторяемого метода прослушивание
// params: eventName (String) Имя события, Times (номер) Номер прослушивания, функция обратного вызова обратного вызова
ep.after ('topic_html', tomourls.length, function (темы) {
// темы - это массив, содержащий 40 пары в ep.emit ('topic_html', пара) 40 раз
//.map
Темы = темы
// Использовать Cheerio
var tomoUrl = topyPair [0];
var topichtml = topicpair [1];
var $ = cheese.load (topichtml);
возвращаться ({
название: $ ('.
href: TopeUrl,
Комментарий1: $ ('. Reply_content'). EQ (0) .Text (). Trim ()
});
});
//исход
console.log ('результат:');
console.log (темы);
});
// Шаг 3: Определите выпуск сообщений событий
topenurls.foreach (function (tomourl) {
Superagent.get (Topicurl)
.end (function (err, res) {
console.log ('fetch' + tomaUrl + 'успешно');
ep.emit ('topic_html', [tomourl, res.text]);
});
});
Результаты следующие
Расширенные упражнения (проблемы)
Получите сообщение имя пользователя и очки
Найдите имя класса пользователя комментария в исходном коде страницы статьи, а классная имени - reply_author. console.log Первый элемент $('.reply_author').get(0) можно увидеть, что нам нужно получить все здесь.
Во -первых, мы можем ползти статью и получить все необходимое сразу.
Кода -копия выглядит следующим образом:
var userHref = url.resolve (turl, $ ('. reply_author'). get (0) .attribs.href);
console.log (userHref);
console.log ($ ('. reply_author'). get (0) .children [0] .data);
Мы можем получить информацию о очках через https://cnodejs.org/user/username
Кода -копия выглядит следующим образом:
$ ('. Reply_author'). Каждый (function (idx, element) {
var $ element = $ (element);
console.log ($ element.attr ('href'));
});
На странице информации пользователя $('.big').text().trim() - это информация о баллах.
Используйте функцию Cheatio.get (0), чтобы получить первый элемент.
Кода -копия выглядит следующим образом:
var userHref = url.resolve (turl, $ ('. reply_author'). get (0) .attribs.href);
console.log (userHref);
Это просто ползание одной статьи, и есть все еще некоторые вещи, которые необходимо изменить для 40 статей.