Java, UX, HTML, CSS, WEB-design

Парсинг веб-страниц с помощью Node.js

[ad_1]

  • Эллиот Бонневиль

  • 0 Комментарии

Парсинг веб-страниц с помощью Node.js

  • 11 минут чтения

  • Кодирование, JavaScript, Node.js

Краткое резюме ↬

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

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

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

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

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

Дальнейшее чтение на SmashingMag:

  • Полезные инструменты, учебные пособия и ресурсы Node.js
  • Подробное введение в Webpack
  • Плавание с Sails.js: фреймворк в стиле MVC для Node.js
  • Проблема с глобальными пакетами узлов

Еще после прыжка! Продолжить чтение ниже ↓

Модули

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

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

Запрос

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

Черио

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

Выполнение

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


var request = require("request"),
  cheerio = require("cheerio"),
  url = "https://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. Если запрос обнаружит проблему при загрузке веб-страницы и не сможет получить данные, он передаст в функцию допустимый объект ошибки, а переменная body будет иметь значение null. Прежде чем мы начнем работать с нашими данными, мы проверим, нет ли ошибок; если они есть, мы просто зарегистрируем их, чтобы увидеть, что пошло не так.

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

Мы можем взять его много мест отсюда. Я призываю вас поиграть, и я кратко изложил для вас ключевые шаги ниже. Они следующие.

В вашем браузере

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

В вашем коде

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

Идем дальше: интеллектуальный анализ данных

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

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

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

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

Мы кратко рассмотрим код, необходимый для реализации каждой из этих вещей — как вы могли догадаться, не так много.

Первое, что нам нужно сделать, это выяснить, какие страницы мы собираемся анализировать. Поскольку мы собираемся просматривать страницы, извлеченные из поиска 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) === "https://www.smashingmagazine.com/") {
      return;
    }

    // this link counts as a result, so increment results
    totalResults++;

В этом случае переменная URL, которую мы передаем, представляет собой поиск Google по термину «интеллектуальный анализ данных».

Как видите, сначала мы делаем запрос на получение содержимого страницы. Затем мы загружаем содержимое страницы в Cheerio, чтобы мы могли запросить DOM для элементов, которые содержат ссылки на соответствующие результаты. Затем мы перебираем ссылки и удаляем некоторые дополнительные параметры URL, которые Google вставляет для собственного использования — когда мы загружаем страницы с помощью модуля запроса, нам не нужны никакие из этих дополнительных параметров.

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

Вытягивание слов с каждой страницы

Теперь, когда у нас есть 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. Ниже приведен пример набора результатов для термина «интеллектуальный анализ данных». (По совпадению, я использовал этот список для создания облака слов в начале этой статьи.)


[ { 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 и даже удалить общие слова, которые на самом деле не являются ключевыми терминами (например, «тот» и «от»). Также можно было бы добавить дополнительную обработку ошибок, чтобы сделать приложение еще более надежным — когда вы извлекаете данные, вам нужно столько уровней избыточности, сколько вы можете себе позволить. Разнообразие содержимого, которое вы будете извлекать, таково, что вы неизбежно столкнетесь с неожиданным фрагментом текста, который, если его не обработать, вызовет ошибку и немедленно приведет к сбою вашего приложения.

В заключении

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

Сокрушительная редакция
(ил, рб, ал)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — Парсинг веб-страниц с помощью Node.js

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован.

Краткое описание по статье Парсинг веб-страниц с помощью Node.js

Название: Парсинг веб-страниц с помощью Node.js . Краткое описание: [ad_1] ⭐ Эллиот . Дата публикации: 07.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»