Веб-скребки — это части программного обеспечения, которые программно посещают веб-страницы и извлекают из них данные. Веб соскоб является немного спорной тема, из-за проблемы дублирования контента. Вместо этого большинство владельцев веб-сайтов предпочитают, чтобы их данные были доступны через общедоступные API. К сожалению, многие сайты предоставляют слабые API-интерфейсы или их вообще нет. Это заставляет многих разработчиков обращаться к веб-поиску. Эта статья научит вас, как реализовать свой собственный веб-скребок в Node.js.
Первым шагом к поиску в сети является загрузка исходного кода с удаленных серверов. В разделе « Создание HTTP-запросов в Node.js » читатели узнали, как загружать страницы с помощью модуля request
В следующем примере показано, как быстро GET
var request = require("request");
request({
uri: "http://www.sitepoint.com",
}, function(error, response, body) {
console.log(body);
});
cheerio
Второй и более сложный шаг к поиску в сети — это извлечение данных из загруженного исходного кода. На стороне клиента это было бы тривиальной задачей с использованием селекторного API или библиотеки, подобной jQuery . К сожалению, эти решения основаны на предположении, что DOM доступен для запросов. К сожалению, Node.js не предоставляет DOM. Или это?
Модуль Cheerio
Хотя Node.js не предоставляет встроенный DOM, есть несколько модулей, которые могут создавать DOM из строки исходного кода HTML. Два популярных модуля DOM — это jsdom
и cheerio
. В этой статье основное внимание уделяется cheerio
Npm установить Cheerio
Модуль cheerio
На самом деле, cheerio
cheerio
В следующем примере показано, как cheerio
Первая строка импортирует html
Переменная cheerio
В строке 3 HTML анализируется с помощью $
Результат присваивается переменной <ul>
Знак доллара был выбран потому, что он традиционно используется в jQuery. Строка 4 выбирает элемент html()
Наконец, внутренний HTML-список выводится с использованием метода var cheerio = require("cheerio");
var html = "<ul><li>foo</li><li>bar</li></ul>";
var $ = cheerio.load(html);
var list = $("ul");
console.log(list.html());
cheerio
Ограничения
cheerio
Тем не менее, он все еще имеет ряд ограничений. Самый неприятный аспект cheerio
Синтаксический анализ HTML — это сложная проблема, и существует множество страниц, которые содержат плохой HTML. Хотя на этих страницах не произойдет сбой cheerio, вы можете оказаться не в состоянии выбрать элементы. Это может затруднить определение, лежит ли ошибка в вашем селекторе или на самой странице.
Выскабливание JSPro
В следующем примере комбинируется request
cheerio
Пример скребка извлекает заголовки и URL-адреса всех статей на домашней странице JSPro. Первые две строки импортируют необходимые модули в пример. Строки с 3 по 5 загружают исходный код домашней страницы JSPro. Затем источник передается в cheerio
var request = require("request");
var cheerio = require("cheerio");
request({
uri: "http://www.sitepoint.com",
}, function(error, response, body) {
var $ = cheerio.load(body);
$(".entry-title > a").each(function() {
var link = $(this);
var text = link.text();
var href = link.attr("href");
console.log(text + " -> " + href);
});
});
Если вы посмотрите исходный код JSPro, вы заметите, что каждый заголовок статьи является ссылкой, содержащейся в элементе <h1>
entry-title
Селектор в строке 7 выбирает все ссылки на статьи. Затем функция each()
Наконец, заголовок статьи и URL взяты из атрибута text и href
Вывод
В этой статье показано, как создать простую программу очистки веб-страниц в Node.js. Обратите внимание, что это не единственный способ очистить веб-страницу. Существуют и другие методы, такие как использование безголового браузера, которые являются более мощными, но могут поставить под угрозу простоту и / или скорость. Ищите готовящуюся статью, посвященную браузеру без головы PhantomJS .