Посібник з використання Selenium в Ruby для веб-скрапінгу

У цьому посібнику я покажу вам, як налаштувати Selenium з Ruby, збирати дані та обробляти динамічний контент. В кінці у вас буде працюючий веб-скрепер для збору даних з реальних сайтів.

Якщо ви шукаєте альтернативи для створення власних веб-скреперів, ознайомтесь з нашою статтею про найкращі інструменти для веб-скрапінгу. Дізнайтеся про найкращі інструменти, які можуть спростити ваші проекти з витягнення даних.

Давайте почнемо!

Чому варто використовувати Selenium для веб-скрапінгу?

Веб-скрапінг полягає у автоматичному витягуванні даних зі сторінок вебсайтів. Основний скрапінг можна зробити за допомогою бібліотек, таких як Nokogiri, але деякі вебсайти використовують JavaScript для динамічного завантаження контенту. Традиційні скрапери мають проблеми з отриманням даних з таких сайтів.

Тут на допомогу приходить Selenium. Він дозволяє Ruby-скриптам керувати реальними браузерами, взаємодіяти з вебсайтами на основі JavaScript і витягувати необхідні дані. Ви також можете дізнатися, як здійснювати веб-скрапінг з Selenium і PHP у цій статті.

Ось деякі переваги Selenium для веб-скрапінгу:

  • Обробка динамічного контенту: може взаємодіяти зі сторінками на основі JavaScript.
  • Імітує поведінку людини: Selenium може натискати кнопки, прокручувати сторінки та заповнювати форми.
  • Підтримка різних браузерів: працює з Chrome, Firefox, Edge та іншими браузерами.
  • Гнучкість: підтримує кілька мов програмування, включаючи Ruby.

Налаштування Selenium в Ruby

Крок 1: Встановлення Selenium для Ruby

Встановлення Ruby

Перш за все, перевірте, чи встановлений у вас Ruby. Відкрийте термінал і введіть:

ruby -v

Якщо Ruby не встановлено, завантажте його з ruby-lang.org.

Встановлення необхідних гемів

Selenium вимагає гем selenium-webdriver. Встановіть його за допомогою:

gem install selenium-webdriver

Тепер ви готові почати скрапити.

Крок 2: Створення веб-скрепера на Selenium

Налаштування Ruby-проекту

Створіть нову папку для вашого проекту:

mkdir selenium-ruby-scraper  
cd selenium-ruby-scraper

Всередині папки створіть новий Ruby файл:

touch scraper.rb

Тепер відкрийте scraper.rb у вашому улюбленому текстовому редакторі.

Ініціалізація Selenium WebDriver

У файлі scraper.rb напишіть наступний код:

require "selenium-webdriver"  
# Налаштування параметрів браузера  
options = Selenium::WebDriver::Chrome::Options.new  
options.add_argument(" - headless") # Запуск в безголовому режимі (без GUI)  
# Ініціалізація WebDriver  
driver = Selenium::WebDriver.for :chrome, options: options  
# Відкриття цільового вебсайту  
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"  
# Отримання та виведення вихідного коду сторінки  
puts driver.page_source  
# Закриття браузера  
driver.quit

Збережіть файл і запустіть його:

ruby scraper.rb

Якщо все правильно, скрипт виведе HTML сторінки в термінал.

Крок 3: Витягування даних зі сторінки

Тепер давайте витягнемо конкретну інформацію. Цільова вебсторінка містить списки продуктів.
Кожен продукт має назву та ціну.

Змініть scraper.rb:  
require "selenium-webdriver"  
# Оголосити структуру продукту  
Product = Struct.new(:name, :price)  
# Налаштування параметрів браузера  
options = Selenium::WebDriver::Chrome::Options.new  
options.add_argument(" - headless")  
# Ініціалізація WebDriver  
driver = Selenium::WebDriver.for :chrome, options: options  
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"  
# Знайти всі продукти  
products = []  
html_products = driver.find_elements(:css, ".post")  
# Витягнути деталі продуктів  
html_products.each do |html_product|  
name = html_product.find_element(:css, "h4").text  
price = html_product.find_element(:css, "h5").text  
products << Product.new(name, price)  
end  
# Вивести витягнуті дані  
products.each { |product| puts "Name: #{product.name}, Price: #{product.price}" }  
# Закрити браузер  
driver.quit

Запустіть скрипт знову:

ruby scraper.rb

Тепер ви побачите назви продуктів та ціни в терміналі.

Крок 4: Обробка нескінченного скролінгу

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

Змініть scraper.rb:  
# Прокручування вниз для завантаження більше продуктів  
10.times do  
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  
sleep(1) # Дати час для завантаження контенту  
end  
# Очікування завантаження останнього продукту  
wait = Selenium::WebDriver::Wait.new(timeout: 10)  
wait.until { driver.find_element(:css, ".post:nth-child(60)") }

Крок 5: Збереження даних у CSV

Витягнуті дані будуть більш корисними, якщо зберігати їх у структурованому форматі, наприклад CSV.

Змініть scraper.rb:  
require "csv"  
# Зберегти дані у CSV  
CSV.open("products.csv", "wb", write_headers: true, headers: ["Name", "Price"]) do |csv|  
products.each { |product| csv << product }  
end  
puts "Дані збережено у products.csv"

Запустіть скрипт знову, і ви знайдете файл products.csv у вашій папці з проектом.

Крок 6: Використання проксі для анонімності

Деякі вебсайти блокують скрапери, виявляючи багато запитів з одного і того ж IP. Використання проксі допоможе уникнути блокувань.

Змініть scraper.rb:  
# Налаштування проксі  
proxy = "http://72.10.160.174:22669"  
options.add_argument(" - proxy-server=#{proxy}")

Це спрямовуватиме запити через зазначений проксі.

Крок 7: Як уникнути блокування

Щоб уникнути блокування:

Приклад встановлення user agent:

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"  
options.add_argument(" - user-agent=#{user_agent}")  
Для scraping API використовуйте:  
driver.navigate.to "https://api.brightdata.com/v1/?apikey=YOUR_API_KEY&url=https://targetsite.com"

Висновок

Selenium — потужний інструмент для автоматизації веб-взаємодій та витягування даних. Однак важливо здійснювати скрапінг відповідально: поважати умови використання вебсайтів, уникати перевантаження серверів і використовувати API, коли це можливо.

Тепер, коли ви освоїли Selenium в Ruby, спробуйте скрапити різні вебсайти та експериментуйте з більш складними взаємодіями!

Цікавить інші посібники з веб-скрапінгу?

Перекладено з: Selenium in Ruby for Web Scraping Guide