Окончательное руководство по веб-скрейпингу с помощью Node.js

okonchatelnoe rukovodstvo po veb skrejpingu s pomoshhyu nodejs

Итак, что такое веб-скреб? Это подразумевает автоматизацию кропотливой работы по сбору информации с веб-сайтов.

Существует множество вариантов использования веб-скрейпинга: вы можете собирать цены с разных сайтов электронной коммерции для сайта сравнения цен. Или может потребоваться время полетов и список отелей/AirBNB для вашего туристического сайта. Возможно, вы хотите собирать электронные письма из разных каталогов для потенциальных клиентов или использовать данные из Интернета для обучения моделей машинного обучения/AI. Или вы даже можете захотеть создать поисковую систему, например Google!

Начать работу с веб-скрейпингом легко, и процесс можно разделить на две основные части:

  • получение данных с помощью библиотеки запросов HTML или безголового браузера,
  • и анализировать данные, чтобы получить точную информацию, которую вы хотите.

Это руководство проведет вас через процесс с популярным модулем запроса-обещания Node.js, CheerioJS и Puppeteer. Работая с примерами в настоящем руководстве, вы узнаете все советы и рекомендации, которые вам нужны, чтобы стать профессионалом в сборе любых данных, которые вам нужны с помощью Node.js!

Мы собираем список всех имен и дней рождения президентов США из Википедии и названия всех публикаций на первой странице Reddit.

Прежде всего: давайте установим библиотеки, которые мы будем использовать в настоящем руководстве (для установки Puppeteer потребуется некоторое время, поскольку ему также нужно скачать Chromium).

Сделать свой первый запрос

Далее давайте откроем новый текстовый файл (назовите файл potusScraper.js) и напишем быструю функцию, чтобы получить HTML страницы «Список президентов» Википедии.

Выход:

Использование инструментов разработчика Chrome

Круто, мы получили необработанный HTML с веб-страницы! Но теперь нам следует разобраться в этой гигантской массе текста. Для этого нам нужно использовать Chrome DevTools, чтобы мы могли легко искать HTML веб-страницы.

Пользоваться Chrome DevTools легко: просто откройте Google Chrome и щелкните правой кнопкой мыши на элементе, который вы хотите очистить (в этом случае я щелкаю правой кнопкой мыши на Джорджа Вашингтона, потому что мы хотим получить ссылку на все страницы Википедии отдельных президентов):

1*gLKhu_EO-cDqYna1P9WL_w

Теперь просто нажмите кнопку Проверить и Chrome откроет панель DevTools, что позволит вам легко проверить исходный HTML-код страницы.

1*HSUjFgji22vjwvGi2uZe1A

Разбор HTML с помощью Cheerio.js

Прекрасно, Chrome DevTools теперь показывает нам точный шаблон, который мы должны искать в коде («большой» тег с гиперссылкой внутри него). Давайте используем Cheerio.js для разбора HTML, который мы получили раньше, чтобы вернуть список ссылок на отдельные страницы Википедии президентов США.

Выход:

Мы проверяем, возвращено ли ровно 45 элементов (количество президентов США), что означает, что в других местах страницы нет дополнительных скрытых «больших» тегов. Теперь мы можем просмотреть и получить список ссылок на все 45 президентских страниц в Википедии, получив их из раздела «атрибуты» каждого элемента.

Выход:

Теперь у нас есть список всех 45 президентских страниц в Википедии. Давайте создадим новый файл с названием potusParse.js, который будет содержать функцию для перехода на президентскую страницу Википедии и возвращения имени и дня рождения президента. Прежде всего, давайте получим необработанный HTML со страницы Википедии Джорджа Вашингтона.

Выход:

Давайте снова используем Chrome DevTools, чтобы найти синтаксис кода, который мы хотим проанализировать, чтобы мы могли получить имя и день рождения с помощью Cheerio.js.

1*exzZbuIwfrCcbTM2rr9_bw
1*yth6AmHpywM77n0wEprpiA

Итак, мы видим, что имя находится в классе под названием firstHeading, а день рождения – в классе под названием bday. Давайте модифицируем наш код, чтобы использовать Cheerio.js для извлечения этих двух классов.

Выход:

Соединив все это вместе

Идеально! Теперь давайте обратим это в функцию и экспортируем ее из этого модуля.

Теперь вернемся к нашему исходному файлу potusScraper.js и требуем модуль potusParse.js. Затем мы применим его к списку wikiUrl, который мы собрали раньше.

Выход:

Воспроизведение страниц JavaScript

Вуаль! Список имен и дней рождения всех 45 президентов США. Использование только модуля request-promise и Cheerio.js позволит вам очистить большинство сайтов в Интернете.

Однако в последнее время многие сайты начали использовать JavaScript для создания динамического содержимого на своих веб-сайтах. Это вызывает проблемы для запросов-промисса и других подобных библиотек запросов HTTP (например, axios и fetch), поскольку они получают ответ только от исходного запроса, но не могут выполнять JavaScript так, как это может сделать веб-браузер.

Таким образом, для очистки сайтов, требующих выполнения JavaScript, нам нужно другое решение. В следующем примере мы получим заголовки для всех публикаций на первой странице Reddit. Давайте посмотрим, что произойдет, когда мы попытаемся использовать request-promise, как мы сделали в предыдущем примере.

Выход:

Вот как выглядит результат:

1*mKzPVGRR4CFKMwQw5y_YnQ

Хм… не совсем то, что мы хотим. Это потому, что для получения фактического содержимого необходимо запустить JavaScript на странице! С Кукловодом это не проблема.

Puppeteer – это очень популярный новый модуль, представленный командой Google Chrome, позволяющий управлять безголовым браузером. Это идеально подходит для программного скрейпинга страниц, требующих выполнения JavaScript. Давайте получим HTML с главной страницы Reddit, используя Puppeteer вместо request-promise.

Выход:

Хорошо! Страница наполнена правильным содержимым!

1*N5HtAiijcMEB_fBQvPd7Ow

Теперь мы можем использовать Chrome DevTools, как и в предыдущем примере.

1*tHSgjPMvn3M26N2f7Q2B1Q

Похоже, Reddit помещает заголовки в тэги «h2». Давайте используем Cheerio.js для удаления меток h2 со страницы.

Выход:

Дополнительные ресурсы

И вот перечень! На этом этапе вам будет удобно писать свой первый веб-скребок для сбора данных с любого сайта. Вот несколько дополнительных ресурсов, которые могут пригодиться во время вашего путешествия по веб-скрейпингу:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *