Руководство по веб-скрейпингу на Ruby с Selenium
Если вам нужны альтернативы созданию собственных веб-скрейперов, ознакомьтесь нашу статью о лучших инструментах для веб-скрейпинга. Ознакомьтесь с лучшими инструментами, которые могут упростить ваши проекты по извлечению данных.
Let’s get started!
Зачем использовать Selenium для веб-скрейпинга?
Веб-скрейпинг заключается в автоматическом извлечении данных с веб-страниц. Хотя базовый скрейпинг можно выполнять с помощью библиотек вроде Nokogiri, некоторые сайты используют JavaScript для динамической загрузки контента. Традиционным скрейперам трудно извлекать данные с таких сайтов.
Именно здесь Селен помогает. Он позволяет скриптам Ruby управлять реальными браузерами, взаимодействовать с сайтами на JavaScript и извлекать нужные данные. Также вы можете узнать, как собирать данные с сайтов с помощью Selenium и PHP в эта статья.
Некоторые преимущества Selenium для веб-скрейпинга:
- Работа с динамическим контентом: Он может взаимодействовать со страницами на JavaScript.
- Имитирует человеческое поведение: Selenium может нажимать кнопки, прокручивать страницу и заполнять формы.
- Кроссбраузерная поддержка: работает с Chrome, Firefox, Edge и другими браузерами.
- Flexible: Поддерживает несколько языков программирования, включая Ruby.
Настройка Selenium в Ruby
Шаг 1: Установите Selenium для Ruby
Install Ruby
Сначала проверьте, установлен ли Ruby. Откройте терминал и введите:
ruby -v
If Ruby is not installed, download it from ruby-lang.org.
Install Required Gems
Для Selenium требуется gem selenium-webdriver. Установите его с помощью:
gem install selenium-webdriver
Теперь вы готовы приступить к веб-скрейпингу.
Шаг 2: Создайте веб-скрейпер с помощью Selenium
Настройка Ruby-проекта
Создайте новую папку для своего проекта:
mkdir selenium-ruby-scraper
cd selenium-ruby-scraper
Внутри каталога создайте новый Ruby-файл:
touch scraper.rb
Now, open scraper.rb in your preferred text editor.
Initialize Selenium WebDriver
In scraper.rb, write the following code:
требуется "selenium-webdriver"
# Set up browser options
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument(" - headless") # Run in headless mode (no GUI)
# Initialize WebDriver
driver = Selenium::WebDriver.для :chrome, options: options
# Open the target website
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"
# Get and print page source
puts driver.page_source
# Close the browser
driver.quit
Сохраните файл и запустите его:
скрейпер на Ruby.rb
Если все правильно, скрипт выведет HTML страницы в терминал.
Шаг 3: Извлеките данные с веб-страницы
Теперь извлечем конкретную информацию. На целевой веб-странице показан список товаров. У каждого товара есть название и цена.
Доработайте скрейпер.rb:
требуется "selenium-webdriver"
# Define Product structure
Product = Struct.new(:name, :price)
# Set up browser options
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument(" - headless")
# Initialize WebDriver
driver = Selenium::WebDriver.для :chrome, options: options
driver.navigate.to "https://scrapingclub.com/exercise/list_infinite_scroll/"
# Find all products
products = []
html_products = driver.find_elements(:css, ".post")
# Extract product details
html_products.each сделать |html_product|
name = html_product.find_element(:css, "h4").text
price = html_product.find_element(:css, "h5").text
products << Product.new(name, price)
конец
# Print extracted data
products.each { |продукт| puts "Имя: #{product.name}, Цена: #{product.price}" }
# Close the browser
driver.quit
Запустите скрипт снова:
скрейпер на Ruby.rb
Теперь в терминале должны появиться названия товаров и цены.
Шаг 4: Работа с бесконечной прокруткой
Некоторые сайты используют бесконечную прокрутку, при которой контент подгружается по мере прокрутки страницы. Selenium позволяет имитировать такое поведение.
Доработайте скрейпер.rb:
# Scroll down to load more products
10.times сделать
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") sleep(1) # Allow time for content to load
конец
# Wait for the last product to load
wait = Selenium::WebDriver::Wait.new(timeout: 10) wait.until { driver.find_element(:css, ".post:nth-child(60)") }
Шаг 5: Сохраните данные в CSV
Извлеченные данные полезнее хранить в структурированном формате, например CSV.
Modify scraper.rb:
требуется "csv"
# Save data to CSV
CSV.открыть("products.csv", "wb", write_headers: true, заголовки: ["Name", "Price"]) сделать |csv|
products.each { |product| csv << product }
end
puts "Data saved to products.csv"
Run the script again, and you will find a products.csv file in your project folder.
Шаг 6: Используйте прокси для анонимности
Некоторые сайты блокируют скрейперы, обнаруживая многочисленные запросы с одного IP-адреса. Использование прокси может помочь избежать блокировок.
Modify scraper.rb:
# Set up proxy
прокси = "http://72.10.160.174:22669"
options.add_argument(" - proxy-server=#{proxy}")
Это позволит направлять запросы через указанный прокси.
Шаг 7: Избегайте блокировок
Чтобы избежать блокировки:
- Use прокси с ротацией.
- Используйте случайные user-agent'ы.
- Снижайте частоту запросов с помощью sleep().
- Используйте такие сервисы, как Scraping Browser от Bright Data для обхода антиботовой защиты.
Пример настройки user agent:
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
options.add_argument(" - user-agent=#{user_agent}")
For a scraping API, use:
driver.navigate.to "https://api.brightdata.com/v1/?apikey=YOUR_API_KEY&url=https://targetsite.com"
Заключение
Selenium — мощный инструмент для автоматизации взаимодействия с веб-страницами и извлечения данных. Однако при скрапинге важно действовать ответственно — соблюдайте условия использования сайтов, не перегружайте серверы и по возможности используйте API.
Теперь, когда вы освоили Selenium в Ruby, попробуйте скрейпить разные сайты и поэкспериментировать с более продвинутыми сценариями взаимодействия!

