Практический online-курс

Web scraping с Node.js

data

Web scraping – это процесс программного извлечения информации из интернета. Так как объем данных в интернете увеличился, эта практика становится все более распространенной, и для упрощения ее появилось много сервисов. К сожалению, большинство из них являются дорогостоящими, имеют ограничения или другие недостатки. Вместо использования одного из сторонних ресурсов, вы можете использовать Node.js для создания мощного web scraper, который как универсален, так и абсолютно бесплатен.

В этой статье я расскажу о следующем:

  • два Node.js модуля, Request и Cheerio, которые упрощают web scraping;
  • простое приложение, которое получает и отображает некоторые выборочные сведения;
  • более сложное приложение, которое находит ключевые слова в результатах поиска в Google.

Кроме того, стоит отметить несколько вещей: для этой статьи рекомендуется иметь базовое представление о Node.js; поэтому, если вы еще не знаете о нем, почитайте, прежде чем продолжить. Кроме того, web scraping может нарушать условия предоставления услуг для некоторых веб-сайтов, так что просто убедитесь, что вы “чисты”, прежде чем начать scraping.

Модули

Чтобы ввести Node.js модули, которые я упоминал ранее, мы используем NPM – Node Package Manager (если вы слышали о Bower, это почти одно и то же – если вы не используете NPM, чтобы установить Bower). NPM это утилита менеджера пакетов, которая автоматически устанавливается с Node.js, чтобы сделать процесс использования модулей наиболее простым. По умолчанию NPM устанавливает модули в папку node_modules в директории, в которой вы выполняете команду, поэтому убедитесь, что команда выполняется в папке проекта.

И перейдем к модулям, которые мы будем использовать.

Request

В то время как Node.js предусматривает простые методы скачивания данных из интернета с помощью HTTP и HTTPS интерфейсов, вы должны управлять ими по отдельности, не говоря уже о редиректах и других задачах, которые появляются, когда вы начинаете работу с web scraping. Модуль Request соединяет эти методы, удаляет трудности и представляет вам единый интерфейс для создания запросов. Мы будем использовать этот модуль для скачивания веб-страниц непосредственно в память. Чтобы установить его, запустите npm install request в терминале в директории, где будет находиться ваш главный файл Node.js.

Cheerio

Cheerio позволяет работать со скачанными веб-данными, используя тот же синтаксис, что и в jQuery. Цитата с его домашней страницы – “Cheerio является быстрой, гибкой и надежной реализацией jQuery, разработанной специально для сервера”. Cheerio позволяет нам сосредоточиться на скачанных данных, нежели на их анализе. Чтобы установить его, запустите npm install cheerioв терминале в директории, где будет находиться ваш главный файл Node.js.

Использование

Код ниже – быстрое небольшое приложение, которое узнает температуру с веб-сайта погоды. Я вставил код моего города в конце URL, который мы скачиваем, но если вы хотите попробовать, вы можете вставить ваш код (просто установите два модуля, которые мы пытаемся запросить, вы можете узнать, как это сделать с помощью ссылок, приведенных выше).

var request = require("request"),
	cheerio = require("cheerio"),
	url = "//www.wunderground.com/cgi-bin/findweather/getForecast?&query=" + 02888;
	
request(url, function (error, response, body) {
	if (!error) {
		var $ = cheerio.load(body),
			temperature = $("[data-variable='temperature'] .wx-value").html();
			
		console.log("It’s " + temperature + " degrees Fahrenheit.");
	} else {
		console.log("We’ve encountered an error: " + error);
	}
});

web-scraping
Web scraping с Node.js 0
ИЮЛЬ 3, 2015 РАЗНОЕ
Web scraping – это процесс программного извлечения информации из интернета. Так как объем данных в интернете увеличился, эта практика становится все более распространенной, и для упрощения ее появилось много сервисов. К сожалению, большинство из них являются дорогостоящими, имеют ограничения или другие недостатки. Вместо использования одного из сторонних ресурсов, вы можете использовать Node.js для создания мощного web scraper, который как универсален, так и абсолютно бесплатен.

В этой статье я расскажу о следующем:

два Node.js модуля, Request и Cheerio, которые упрощают web scraping;
простое приложение, которое получает и отображает некоторые выборочные сведения;
более сложное приложение, которое находит ключевые слова в результатах поиска в Google.
Кроме того, стоит отметить несколько вещей: для этой статьи рекомендуется иметь базовое представление о Node.js; поэтому, если вы еще не знаете о нем, почитайте, прежде чем продолжить. Кроме того, web scraping может нарушать условия предоставления услуг для некоторых веб-сайтов, так что просто убедитесь, что вы “чисты”, прежде чем начать scraping.

Модули

Чтобы ввести Node.js модули, которые я упоминал ранее, мы используем NPM – Node Package Manager (если вы слышали о Bower, это почти одно и то же – если вы не используете NPM, чтобы установить Bower). NPM это утилита менеджера пакетов, которая автоматически устанавливается с Node.js, чтобы сделать процесс использования модулей наиболее простым. По умолчанию NPM устанавливает модули в папку node_modules в директории, в которой вы выполняете команду, поэтому убедитесь, что команда выполняется в папке проекта.

И перейдем к модулям, которые мы будем использовать.

Request

В то время как Node.js предусматривает простые методы скачивания данных из интернета с помощью HTTP и HTTPS интерфейсов, вы должны управлять ими по отдельности, не говоря уже о редиректах и других задачах, которые появляются, когда вы начинаете работу с web scraping. Модуль Request соединяет эти методы, удаляет трудности и представляет вам единый интерфейс для создания запросов. Мы будем использовать этот модуль для скачивания веб-страниц непосредственно в память. Чтобы установить его, запустите npm install request в терминале в директории, где будет находиться ваш главный файл Node.js.

Cheerio

Cheerio позволяет работать со скачанными веб-данными, используя тот же синтаксис, что и в jQuery. Цитата с его домашней страницы – “Cheerio является быстрой, гибкой и надежной реализацией jQuery, разработанной специально для сервера”. Cheerio позволяет нам сосредоточиться на скачанных данных, нежели на их анализе. Чтобы установить его, запустите npm install cheerioв терминале в директории, где будет находиться ваш главный файл Node.js.

Использование

Код ниже – быстрое небольшое приложение, которое узнает температуру с веб-сайта погоды. Я вставил код моего города в конце URL, который мы скачиваем, но если вы хотите попробовать, вы можете вставить ваш код (просто установите два модуля, которые мы пытаемся запросить, вы можете узнать, как это сделать с помощью ссылок, приведенных выше).


var request = require("request"),
 cheerio = require("cheerio"),
 url = "//www.wunderground.com/cgi-bin/findweather/getForecast?&query=" + 02888;

request(url, function (error, response, body) {
 if (!error) {
  var $ = cheerio.load(body),
   temperature = $("[data-variable='temperature'] .wx-value").html();

  console.log("It’s " + temperature + " degrees Fahrenheit.");
 } else {
  console.log("We’ve encountered an error: " + error);
 }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var request = require("request"),
 cheerio = require("cheerio"),
 url = "//www.wunderground.com/cgi-bin/findweather/getForecast?&query=" + 02888;

request(url, function (error, response, body) {
 if (!error) {
  var $ = cheerio.load(body),
   temperature = $("[data-variable='temperature'] .wx-value").html();

  console.log("It’s " + temperature + " degrees Fahrenheit.");
 } else {
  console.log("We’ve encountered an error: " + error);
 }
});
Итак, что мы здесь делаем? Во-первых, мы запрашиваем наши модули, чтобы мы могли получить доступ к ним позже. Затем, мы определяем URL, который мы хотим скачать в переменную.

Затем мы используем модуль Request, чтобы скачать страницу, находящуюся по URL, указанному выше с помощью функции request. Мы передаем в URL то, что хотим скачать и функцию обратного вызова, которая обработает результаты запроса. Когда данные вернутся, будет вызван обратный вызов, который передаст три переменные: error, response и body. Если Request не сможет скачать страницу и получить данные, он передаст объект error в функцию, переменная body будет null. Прежде чем начинать работать с данными, мы проверим не произошло ли ошибок; если да – заносим их в лог, чтобы увидеть, что именно пошло не так.

Если все хорошо, мы передаем данные Cheerio. В результате мы можем работать с данными как на обычной веб-странице, используя стандартный синтаксис jQuery. Чтобы найти интересующие нас данные, надо создать селектор, который возьмет нужный элемент (ы) из страницы. Если вы откроете в браузере URL из примера и исследуете страницу с помощью инструментов разработчика, вы увидите, что большой зеленый элемент с температурой – тот самый элемент, для которого я создал селектор. Теперь, когда мы его нашли, осталось просто получить из него данные и вывести их в консоль.

Отсюда можно двигаться по разным направлениям. Поиграйте с кодом, я суммировал основные шаги ниже:

В браузере

  1. Зайдите на страницу, которую хотите “ограбить”, сохраните URL.
  2. Найдите элемент (ы), данные из которых вы хотите получить и jQuery-селектор для них.

В коде

  1. Используйте request, чтобы скачать страницу по вашему URL.
  2. Передайте полученные данные Cheerio, чтобы использовать jQuery-подобный интерфейс.
  3. Используйте селектор, который вы написали ранее, чтобы “украсть” данные со страницы.

Идем дальше: датамайнинг (добыча данных)

Более продвинутое использование web scraping можно отнести к датамайнингу – процессу скачивания страниц и генерации отчетов на основе полученных данных. Node.js отлично подходит для создания подобных приложений.

Я написал небольшое (меньше сотни строк кода) приложение для датамайнинга в Node.js, чтобы показать, как использовать две уже знакомые нам библиотеки для более сложной реализации. Это приложение ищет наиболее популярные ключевые слова, ассоциированные с определенным поиском Google, анализируя текст каждой страницы, ссылки на которые будут на первой странице результатов поиска.

В приложении есть три главных шага:

  1. Проанализировать поиск Google.
  2. Скачать все страницы и распарсить текст на каждой из них.
  3. Проанализировать текст и предоставить статистику по наиболее популярным словам.

Давайте взглянем на код, который позволит реализовать каждый из этих шагов – как вы можете догадаться, его совсем немного.

Скачивание поиска Google

Первое, что нужно сделать – определить какую страницу мы собираемся анализировать. Так как мы собираемся анализировать страницы из поиска Google, просто находим URL с нужным поисковым запросом, скачиваем и парсим результаты, чтобы найти URL нужных нам страниц.

Чтобы скачать страницу, мы используем Request как в примере выше, и для того чтобы парсить ее, используем Cheerio. Вот как выглядит код:

request(url, function (error, response, body) {
	if (error) {
		console.log(“Couldn’t get page because of error: “ + error);
		return;
	}
	
	// load the body of the page into Cheerio so we can traverse the DOM
	var $ = cheerio.load(body),
		links = $(".r a");
		
	links.each(function (i, link) {
		// get the href attribute of each link
		var url = $(link).attr("href");
		
		// strip out unnecessary junk
		url = url.replace("/url?q=", "").split("&")[0];
		
		if (url.charAt(0) === "/") {
			return;
		}
		
		// this link counts as a result, so increment results
		totalResults++;

В этом случае, переменная URL, которую мы передаем, содержит поисковый запрос для термина “data mining”.

Как видите, сначала мы делаем запрос, чтобы получить содержимое страницы. Затем загружаем полученные данные в Cheerio, чтобы запрашивать у DOМ элементы, содержащие релевантные ссылки. Затем перебираем ссылки и обрезаем дополнительные параметры URL, которые Google добавляет для своих целей – когда мы скачиваем страницы с модулем Request, нам не нужны дополнительные параметры.

Наконец, когда мы все это сделаем, нам нужно убедиться, что URL не начинается с /. Если начинается – это внутренняя ссылка на что-то в Google, и нам не нужно скачивать ее, потому что даже если она корректная, она не будет релевантной.

Получение слов с каждой страницы

Теперь, когда у нас есть URL страниц, надо получить слова с каждой из них. Этот шаг представляет собой ровно то же, что мы уже делали раньше, только теперь URL переменная – это URL страницы, которую мы нашли и обработали в предыдущем цикле.

request(url, function (error, response, body) {
	// load the page into Cheerio
	var $page = cheerio.load(body),
		text = $page("body").text();

Снова используем Request и Cheerio, чтобы скачать страницу и получить доступ к его DOM. В данном примере мы использует этот доступ, чтобы получить со страницы только текст.

Далее нужно очистить полученный текст со страницы – там будет мусор, который нам не нужен, например, множество лишних пробелов, стили, иногда даже немного данных в JSON. Нам нужно сделать вот что:

  1. Сжать все пробелы.
  2. Выбросить все символы, которые не являются буквами или пробелами.
  3. Перевести все в нижний регистр.

Когда мы это сделаем, можно будет просто разбить текст по пробелам, и мы получим массив, содержащий все слова со страницы. Теперь можно перебрать их в цикле и добавить в хранилище.

Код, который все это делает, выглядит примерно так:

// Throw away extra white space and non-alphanumeric characters.
text = text.replace(/\s+/g, " ")
	     .replace(/[^a-zA-Z ]/g, "")
	     .toLowerCase();

// Split on spaces for a list of all the words on that page and 
// loop through that list.
text.split(" ").forEach(function (word) {
	// We don't want to include very short or long words because they're 
	// probably bad data.
	if (word.length  20) {
		return;
	}
				
	if (corpus[word]) {
		// If this word is already in our corpus, our collection
		// of terms, increase the count for appearances of that 
		// word by one.
		corpus[word]++;
	} else {
		// Otherwise, say that we've found one of that word so far.
		corpus[word] = 1;
	}
});

Анализ слов

Когда все слова будут добавлены, мы можем перебрать их в цикле и отсортировать по популярности. Сначала надо внести их в массив, так как хранилище – объект.

// stick all words in an array
for (prop in corpus) {
	words.push({
		word: prop,
		count: corpus[prop]
	});
}
	
// sort array based on how often they occur
words.sort(function (a, b) {
	return b.count - a.count;
});

Результатом будет отсортированный массив, показывающий как часто каждое его слово используется на сайтах с первой страницы поиска Google. Ниже – образец списка результатов для термина “data mining”.

[ { word: 'data', count: 981 },
  { word: 'mining', count: 531 },
  { word: 'that', count: 187 },
  { word: 'analysis', count: 120 },
  { word: 'information', count: 113 },
  { word: 'from', count: 102 },
  { word: 'this', count: 97 },
  { word: 'with', count: 92 },
  { word: 'software', count: 81 },
  { word: 'knowledge', count: 79 },
  { word: 'used', count: 78 },
  { word: 'patterns', count: 72 },
  { word: 'learning', count: 70 },
  { word: 'example', count: 70 },
  { word: 'which', count: 69 },
  { word: 'more', count: 68 },
  { word: 'discovery', count: 67 },
  { word: 'such', count: 67 },
  { word: 'techniques', count: 66 },
  { word: 'process', count: 59 } ]

Если интересно увидеть остальную часть кода, здесь полностью закомментированный исходный код.

Было бы неплохо вывести это приложение на новый уровень. Вы можете оптимизировать парсинг текста, расширить поиск на множество страниц результатов Google, даже удалить слова, которые не являются ключевыми (такие, как “that” и “from”). Улучшение обработки ошибок может сделать приложение еще более точным: когда вы занимаетесь датамайнингом, лучше проверять столько, сколько возможно. При многообразии данных, которые можно получить, может неожиданно найтись текст, который, не будучи обработанным, приведет к возникновению ошибки и завершению работы приложения.

Заключение

Если вы найдете что-то по web scraping с Node.js или у вас есть вопросы, дайте знать в комментариях.

Высоких конверсий!

25-03-2016

Продающие лендинги от отдела
дизайна LPgenerator

Используем технологии:
4U, AIDA, ХПВ, психология влияния Р. Чалдини, управление взглядом
  • 4U
  • AIDA
  • ХПВ
  • психологии влияния Р. Чалдини
  • управления взглядом
  • нейромаркетинг
Готовность от 7 дней
blog comments powered by Disqus
copyright © 2011–2017 by LPgenerator LLC. Все права защищены
Запрещено любое копирование материалов ресурса без письменного согласия владельца — ООО "ЛПгенератор".