Кінцевий посібник з веб-скрапінгу за допомогою Node.js

То що все-таки зішкріб із Інтернету? Він передбачає автоматизацію трудомісткого завдання збору інформації з веб-сайтів.

Існує багато випадків використання веб-скрапінгу: можливо, ви захочете зібрати ціни з різних сайтів електронної комерції для сайту порівняння цін. Або, можливо, вам потрібен час польоту та списки готелів / AirBNB для туристичного сайту. Можливо, ви хочете збирати електронні листи з різних каталогів для потенційних клієнтів або використовувати дані з Інтернету для навчання моделей машинного навчання / ШІ. Або ви можете навіть захотіти створити такий пошуковий механізм, як Google!

Початок роботи з вискоблюванням веб-сторінок легко, і процес можна розбити на дві основні частини:

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

Цей посібник проведе вас через процес за допомогою популярного модуля запитів-обіцянок Node.js, CheerioJS та Puppeteer. Опрацьовуючи приклади в цьому посібнику, ви дізнаєтесь усі поради та підказки, необхідні для того, щоб стати професіоналом у збиранні будь-яких потрібних даних за допомогою Node.js!

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

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

Зробіть свій перший запит

Далі, давайте відкриємо новий текстовий файл (назвемо файл potusScraper.js) і напишемо швидку функцію, щоб отримати HTML сторінки Вікіпедії “Список президентів”.

Вихід:

Використання Chrome DevTools

Класно, ми отримали вихідний HTML-код із веб-сторінки! Але тепер нам потрібно осмислити цю гігантську крапку тексту. Для цього нам потрібно буде використовувати Chrome DevTools, щоб ми могли легко шукати HTML-код веб-сторінки.

Користуватися Chrome DevTools просто: просто відкрийте Google Chrome і клацніть правою кнопкою миші на елементі, який ви хочете скребти (у цьому випадку я натискаю правою кнопкою миші Джорджа Вашингтона, оскільки ми хочемо отримати посилання на всі сторінки Вікіпедії окремих президентів). :

Тепер просто натисніть перевірити, і Chrome відкриє свою область DevTools, що дозволить вам легко перевірити вихідний HTML сторінки.

Розбір HTML за допомогою Cheerio.js

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

Вихід:

Ми перевіряємо, чи повернуто рівно 45 елементів (кількість президентів США), тобто в інших місцях на сторінці немає зайвих прихованих «великих» тегів. Тепер ми можемо переглянути список посилань на всі 45 президентських сторінок Вікіпедії, отримавши їх у розділі “attribs” кожного елемента.

Вихід:

Зараз у нас є список усіх 45 сторінок президентської Вікіпедії. Давайте створимо новий файл (з іменем potusParse.js), який міститиме функцію переходу на сторінку президентської Вікіпедії та повернення імені та дня народження президента. Перш за все, давайте отримаємо необроблений HTML-код зі сторінки Вікіпедії Джорджа Вашингтона.

Вихід:

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

Отже, ми бачимо, що ім’я є в класі, який називається “firstHeading”, а день народження - у класі, який називається “bday”. Давайте змінимо наш код, щоб використовувати Cheerio.js для вилучення цих двох класів.

Вихід:

Склавши все це разом

Ідеально! Тепер обернемо це у функцію та експортуємо з цього модуля.

Тепер повернімось до нашого вихідного файлу potusScraper.js і вимагаємо модуль potusParse.js. Потім ми застосуємо його до списку wikiUrls, який ми зібрали раніше.

Вихід:

Візуалізація сторінок JavaScript

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

Однак останнім часом багато сайтів почали використовувати JavaScript для генерування динамічного контенту на своїх веб-сайтах. Це спричиняє проблему для запиту-обіцянки та інших подібних бібліотек запитів HTTP (таких як axios та fetch), оскільки вони отримують відповідь лише від початкового запиту, але вони не можуть виконати JavaScript так, як це може веб-браузер.

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

Вихід:

Ось як виглядає результат:

Мда ... не зовсім те, що ми хочемо. Це тому, що для отримання фактичного вмісту потрібно запустити на сторінці JavaScript! З Puppeteer це не проблема.

Puppeteer - надзвичайно популярний новий модуль, представлений вам командою Google Chrome, який дозволяє керувати браузером без голови. Це ідеально підходить для програмного скребування сторінок, які вимагають виконання JavaScript. Давайте отримаємо HTML із першої сторінки Reddit, використовуючи Puppeteer замість запиту-обіцянки.

Вихід:

Приємно! Сторінка наповнена правильним змістом!

Тепер ми можемо використовувати Chrome DevTools, як це було в попередньому прикладі.

Схоже, Reddit розміщує заголовки всередині тегів “h2”. Давайте використовувати Cheerio.js для вилучення тегів h2 зі сторінки.

Вихід:

Додаткові ресурси

І там список! На цьому етапі вам буде комфортно писати свій перший веб-скрепер для збору даних із будь-якого веб-сайту. Ось кілька додаткових ресурсів, які можуть вам виявитися корисними під час подорожі за допомогою веб-скрапінгу:

  • Список веб-скрапінгу проксі-сервісів
  • Перелік зручних інструментів для вишкрібання веб-сторінок
  • Список порад щодо витирання веб-сторінок
  • Порівняння веб-скрапінгу проксі
  • Документація Cheerio
  • Лялькова документація