Статьи

Web Scraping в Node.js

Веб-скребки — это части программного обеспечения, которые программно посещают веб-страницы и извлекают из них данные. Веб соскоб является немного спорной тема, из-за проблемы дублирования контента. Вместо этого большинство владельцев веб-сайтов предпочитают, чтобы их данные были доступны через общедоступные API. К сожалению, многие сайты предоставляют слабые API-интерфейсы или их вообще нет. Это заставляет многих разработчиков обращаться к веб-поиску. Эта статья научит вас, как реализовать свой собственный веб-скребок в Node.js.

Первым шагом к поиску в сети является загрузка исходного кода с удаленных серверов. В разделе « Создание HTTP-запросов в Node.js » читатели узнали, как загружать страницы с помощью модуля request В следующем примере показано, как быстро GETvar 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 На самом деле, cheeriocheerio

В следующем примере показано, как 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

В следующем примере комбинируется requestcheerio Пример скребка извлекает заголовки и 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 .