Веб-скрапинг с помощью Watir Ruby в 2026 году
В этой статье я покажу, как настроить Watir в Ruby, и расскажу, как извлекать данные, обрабатывать пагинацию, прокручивать страницы и делать снимки экрана. Начнем!
Что такое Watir и зачем его использовать?
Watir (Web Application Testing in Ruby) - это Ruby-библиотека, которая помогает автоматизировать веб-браузеры для тестирования. Она взаимодействует с такими браузерами, как Chrome, Firefox и Edge, имитируя действия пользователя, например нажатие кнопок, ввод текста в формы и переходы между страницами.
Хотя Watir изначально создавался для тестирования веб-приложений, его также можно использовать для веб-скрейпинга. Watir умеет выполнять JavaScript и взаимодействовать с динамическим контентом, что делает его подходящим для скрейпинга сайтов, где требуются действия, похожие на пользовательские, например клики или прокрутка.
Как настроить Watir на Ruby
Прежде чем приступать к скрапингу, нужно настроить Watir в Ruby. Ниже приведены шаги по установке необходимых инструментов и библиотек.
Шаг 1: Установите Ruby
Сначала убедитесь, что Ruby установлен в вашей системе. Ruby - это язык программирования, на котором основан Watir, и он нужен для запуска вашего скрейпера. Скачать Ruby можно на официальном сайте здесь.
После установки Ruby вам также станет доступен gem, менеджер пакетов Ruby.
Шаг 2: Установите Watir
Теперь, когда Ruby установлен, вы можете установить gem Watir. Откройте терминал и выполните следующую команду для установки Watir:
gem install watir
Шаг 3: Создайте новый Ruby-проект
Создайте новый каталог для проекта и инициализируйте новый Ruby-проект. Это позволит управлять зависимостями вашего проекта. В терминале перейдите в каталог, где вы хотите хранить проект, и выполните следующую команду:
bundle init
Это создаст Gemfile в папке проекта. Откройте этот файл и добавьте следующую строку, чтобы подключить gem Watir:
gem 'watir'
Затем установите gem, выполнив команду:
bundle install
Создание простого скрейпера
Теперь, когда Watir настроен, давайте напишем простой скрейпер для извлечения данных с веб-страницы.
Шаг 1: откройте сайт и получите HTML
Сначала нужно импортировать библиотеку Watir и создать новый экземпляр браузера. В этом примере мы используем Chrome в headless-режиме, то есть браузер будет работать в фоновом режиме без открытия графического интерфейса.
Вот базовый Ruby-скрипт для получения HTML-кода веб-страницы:
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com')
# Get the HTML of the page
html_content = browser.html
# Print the HTML content
puts html_content
# Close the browser
browser.close
Шаг 2: Извлеките конкретные данные
Теперь давайте извлечем конкретные данные с веб-страницы. Допустим, вы хотите собрать названия товаров со страницы товара. Можно использовать методы браузера, чтобы находить элементы и извлекать их текст.
Вот пример, который извлекает названия товаров со страницы:
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com/products')
# Extract the product titles
product_titles = browser.divs(class: 'product-title').map(&:text)
# Print the product titles
puts product_titles
# Close the browser
browser.close
В этом примере мы используем метод divs, чтобы найти все элементы с классом product-title, а затем извлечь их текст.
Работа с пагинацией
Многие сайты разбивают контент на страницы, то есть списки товаров распределены по нескольким страницам. Если вы хотите собрать все товары, нужно пройти по всем страницам.
Let’s see how to handle pagination with Watir. We will click the “Next” button repeatedly until it is no longer available.
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com/products')
# List to store product titles
product_titles = []
# Loop through the pages
в то время как browser.button(class: 'next').exists?
# Extract product titles from the current page
titles = browser.divs(class: 'product-title').map(&:text)
product_titles.concat(titles)
# Click the "Next" button to go to the next page
browser.button(class: 'next').click
# Wait for the next page to load
browser.wait
конец
# Print the product titles
puts product_titles
# Close the browser
browser.close
Этот скрипт будет продолжать нажимать кнопку «Next», пока она не исчезнет. При каждом нажатии он извлекает названия товаров с текущей страницы и добавляет их в список.
Прокрутка для страниц с бесконечной прокруткой
Некоторые сайты используют бесконечную прокрутку, когда новый контент загружается по мере прокрутки страницы вниз. Чтобы собирать данные с таких сайтов, нужно имитировать прокрутку.
Вот как можно имитировать прокрутку с помощью Watir:
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com/infinite-scroll')
# List to store product titles
product_titles = []
# Set initial scroll height
previous_height = 0
# Keep scrolling until new content stops loading
loop сделать
# Extract product titles
titles = browser.divs(class: 'product-title').map(&:text)
product_titles.concat(titles)
# Scroll down
browser.execute_script('window.scrollBy(0, 1000)') sleep 2
# Get the new scroll height
new_height = browser.execute_script('return document.body.scrollHeight')
# Break if the page height hasn't changed
перерыв если new_height == previous_height
previous_height = new_height
конец
# Print the product titles
puts product_titles
# Close the browser
browser.close
Этот скрипт будет продолжать прокручивать страницу вниз, пока высота страницы не перестанет расти, то есть пока не останется больше контента для загрузки.
Создание скриншотов с помощью Watir
Иногда во время скрейпинга нужно делать скриншоты. Watir упрощает создание скриншотов всей страницы, конкретного элемента или видимой области.
Full-Page Screenshot
Чтобы сделать скриншот всей страницы, можно использовать встроенный метод screenshot в Watir. Однако для такого скриншота может понадобиться сторонний плагин, поскольку по умолчанию Watir захватывает только видимую часть страницы.
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com/product/1')
# Take a full-page screenshot
browser.screenshot.save 'fullpage_screenshot.png'
# Close the browser
browser.close
Specific Element Screenshot
To capture a screenshot of a specific element, you can use Selenium’s screenshot_as method, which Watir inherits.
требуется 'watir'
# Launch Chrome browser in headless mode
браузер = Watir::Browser.new :chrome, headless: true
# Open the website
browser.goto('https://www.example.com/product/1')
# Get the target element
element = browser.div(class: 'product-summary')
# Take a screenshot of the element
screenshot_data = element.wd.screenshot_as(:png)
# Save the screenshot
File.open('element_screenshot.png', 'wb') { |file| file.write(screenshot_data) }
# Close the browser
browser.close
Заключение
Итак, мы рассмотрели веб-скрейпинг с Watir в Ruby. Watir — отличный инструмент для скрейпинга динамических сайтов. Он обеспечивает отличную гибкость, позволяя решать задачи вроде пагинации, прокрутки и создания скриншотов. Хотя по сравнению с другими инструментами для скрейпинга он может работать медленнее, его способность взаимодействовать с сайтами, насыщенными JavaScript, делает его незаменимым инструментом в вашем наборе инструментов. Теперь, когда вы освоили основы, вы можете начать создавать собственные веб-скрейперы для самых разных проектов — от отслеживания цен на товары до извлечения данных со страниц с бесконечной прокруткой.

