Cheerio легкий, быстрый, гибкий и простой в использовании, если вы
Требования:
Я предполагаю, что вы уже знакомы с node.js, jQuery и
Если вы не знакомы с node.js или еще не установили его,
Код:
Чтобы установить необходимые модули с помощью NPM, просто введите следующее
запрос на установку npm приветствие
Это установит модули в ваш текущий рабочий каталог.
Чтобы установить модули глобально, запустите:
Создайте файл с именем scrape.js
и добавьте следующие строки:
var request = require('request');
var cheerio = require('cheerio');
Это загрузит все зависимости нашего модуля.
Теперь загрузите первую страницу Hacker News простым запросом и
Добавьте эти строки в файл:
request('https://news.ycombinator.com', function (error, response, html) {
if (!error && response.statusCode == 200) {
console.log(html);
}
});
Попробуйте запустить скрипт с помощью node scrape.js
, и вы
Чтобы знать, как извлечь желаемые метаданные, нам нужно знать
В этом примере я открыл Hacker News в Chrome, щелкнул правой кнопкой мыши и
Бегло взглянув на консоль веб-разработчика, я пришел к
Мы можем проверить мое предположение, изменив наш код запроса на это:
request('https://news.ycombinator.com', function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('span.comhead').each(function(i, element){
var a = $(this).prev();
console.log(a.text());
});
}
});
Как и ожидалось, запустив код, мы получим список из 30 наименований. Давайте
request('https://news.ycombinator.com', function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('span.comhead').each(function(i, element){
var a = $(this).prev();
var rank = a.parent().parent().text();
var title = a.text();
var url = a.attr('href');
var subtext = a.parent().parent().next().children('.subtext').children();
var points = $(subtext).eq(0).text();
var username = $(subtext).eq(1).text();
var comments = $(subtext).eq(2).text();
// Our parsed meta data object
var metadata = {
rank: parseInt(rank),
title: title,
url: url,
points: parseInt(points),
username: username,
comments: parseInt(comments)
};
console.log(metadata);
});
}
});
Вот обзор того, что делает добавленный код:
Выберите предыдущий элемент:
var a = $(this).prev();
Получите ранг, проанализировав элемент на два уровня выше элемента \a\:
var rank = a.parent().parent().text();
Разберите заголовок ссылки:
var title = a.text();
Разберите атрибут href из элемента \a\:
var url = a.attr('href');
Получите дочерние элементы подтекста из следующей строки в таблице HTML:
var subtext = a.parent().parent().next().children('.subtext').children();
Извлеките соответствующие данные из детей:
var points = $(subtext).eq(0).text();
var username = $(subtext).eq(1).text();
var comments = $(subtext).eq(2).text();
Запуск модифицированного скрипта должен вывести массив таких объектов:
[ { rank: 1,
title: 'The Meteoric Rise of DigitalOcean ',
url: 'http://news.netcraft.com/archives/2013/06/13/the-meteoric-rise-of-digitalocean.html',
points: 240,
username: 'beigeotter',
comments: 163 },
{ rank: 2,
title: 'Introducing Private Networking',
url: 'https://linux-console.net/blog_posts/introducing-private-networking',
points: 172,
username: 'Goranek',
comments: 75 },
...
Вот и все! Теперь вы можете сохранить извлеченные данные
var request = require('request');
var cheerio = require('cheerio');
request('https://news.ycombinator.com', function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
var parsedResults = [];
$('span.comhead').each(function(i, element){
// Select the previous element
var a = $(this).prev();
// Get the rank by parsing the element two levels above the "a" element
var rank = a.parent().parent().text();
// Parse the link title
var title = a.text();
// Parse the href attribute from the "a" element
var url = a.attr('href');
// Get the subtext children from the next row in the HTML table.
var subtext = a.parent().parent().next().children('.subtext').children();
// Extract the relevant data from the children
var points = $(subtext).eq(0).text();
var username = $(subtext).eq(1).text();
var comments = $(subtext).eq(2).text();
// Our parsed meta data object
var metadata = {
rank: parseInt(rank),
title: title,
url: url,
points: parseInt(points),
username: username,
comments: parseInt(comments)
};
// Push meta-data into parsedResults array
parsedResults.push(metadata);
});
// Log our finished parse results in the terminal
console.log(parsedResults);
}
});