перейти к содержанию

Полное руководство по парсингу веб-страниц с помощью Ruby

Ruby — очень популярный язык для парсинга веб-страниц благодаря своей гибкости, производительности и экосистеме проверенных библиотек парсинга. В этом подробном руководстве, состоящем из более чем 2200 слов, мы подробно изучим парсинг веб-страниц Ruby — от настройки надежной среды парсинга до решения реальных задач, таких как сайты JavaScript и капчи.

Почему стоит выбирать Ruby для парсинга веб-страниц?

Вот несколько ключевых причин, почему Ruby преуспевает в парсинге веб-страниц:

  • Срок погашения: Ruby существует уже более 25 лет и является активным сообществом, создающим парсерные библиотеки.
  • Скорость: Тесты показывают, что Ruby превосходит Python и Node.js при выполнении сложных задач ввода-вывода, таких как парсинг веб-страниц.
  • Выразительность: Читабельность Ruby позволяет легко обслуживать парсеры и расширять их с течением времени.
  • Экосистема: Ruby предлагает обширную коллекцию специализированных инструментов для любых нужд парсинга — HTTP-клиенты, анализ HTML, автоматизация, кеширование и многое другое.
  • Масштабируемость: Ruby хорошо масштабируется, особенно с такими инструментами, как Sidekiq и Resque для фоновой работы. Большие сайты можно очистить, распределив задания по нескольким рабочим очередям.
  • Принятие: Крупные сайты, такие как Airbnb, Basecamp, Github, Shopify и т. д., широко используют Ruby, что свидетельствует о его стабильности для производственных сред.

Благодаря универсальности, отличной производительности и процветающей экосистеме Ruby, несомненно, является мудрым выбором для проектов парсинга — от простых одноразовых парсеров до сложных распределенных систем.

Настройка надежной среды Ruby

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

Выберите свой менеджер версий Ruby

Используйте менеджер версий, такой как RVM, rbenv или chruby, чтобы легко переключаться между версиями Ruby для каждого проекта. Мой личный фаворит грубый за простоту и скорость.

Например, установите chruby и рубиновая установка:

# Ubuntu/Debian 
sudo apt install ruby-install chruby

# macOS with Homebrew
brew install ruby-install chruby 

Затем создайте изолированную среду Ruby для вашего парсерного проекта:

# Install version
ruby-install ruby

# Create project directory 
mkdir scraper-project
cd scraper-project

# Use this dir as Ruby env 
chruby .

ruby -v # 3.0.2  

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

Используйте Bundler для управления зависимостями

Управляйте зависимостями драгоценных камней вашего парсера с помощью Bundler.

Создайте Gemfile список драгоценных камней, таких как HTTParty, Nokogiri, Selenium и т. д. Затем запустите bundle install чтобы установить их в вашей среде.

Это гарантирует, что ваш парсер будет использовать именно те версии драгоценных камней, которые вы указали, без конфликтов.

Выберите IDE

Для написания парсеров используйте редактор кода, например Visual Studio Code или RubyMine. Установите плагин Ruby для подсветки синтаксиса, проверки и поддержки автозаполнения.

Ассоциация Руби Соларграф Расширение обеспечивает превосходную аналитику кода с помощью Intellisense, определений методов и т. д.

Рассмотрите вспомогательные инструменты

Вот несколько полезных инструментов для повышения производительности:

  • Используйте подглядывать для интерактивной отладки парсеров. Он намного превосходит простой Ruby IRB.
  • Попытка RSspec для написания тестов для ваших парсеров. Водосвинка отлично подходит для моделирования автоматизации браузера.
  • Профилируйте использование ЦП и памяти с помощью рбшпион or derailed_benchmarks.
  • Свяжите свой код с РубоКоп для внедрения лучших практик.

Инвестирование в эти инструменты ускорит разработку и облегчит обслуживание скреперов.

Парсинг простых сайтов

Давайте посмотрим на парсинг простого статического сайта, например Books.toscrape.com. Прежде чем мы приступим к более сложным сценариям, мы рассмотрим основные концепции.

Получение страниц с помощью HTTParty

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

require ‘httparty‘

response = HTTParty.get(‘http://books.toscrape.com/‘)

HTTParty по умолчанию автоматически анализирует JSON. Для парсинга HTML нам нужен доступ к необработанному телу ответа – response.body.

Разбор HTML с помощью Nokogiri

Чтобы извлечь данные из HTML, нам сначала нужно их проанализировать. Мой любимый парсер в Ruby: Нокогири.

Передайте HTML в Nokogiri::HTML() разобрать:

require ‘nokogiri‘

html = Nokogiri::HTML(response.body)

Эта html Объект предоставляет методы стиля jQuery для запроса элементов DOM с использованием селекторов CSS или XPath.

Извлечение данных о продукте

Давайте возьмем названия книг и цены.

Названия книг есть h3 теги под .product_pod:

product_titles = html.css(‘article.product_pod h3‘)

product_titles.each do |title|
  puts title.text 
end

Цены в пределах p.price_color элементы:

product_prices = html.css(‘article.product_pod p.price_color‘)

product_prices.each do |price|
  puts price.text
end

И мы построили простой скребок! Полный код на данный момент:

require ‘httparty‘ 
require ‘nokogiri‘

url = ‘http://books.toscrape.com‘

response = HTTParty.get(url)
html = Nokogiri::HTML(response.body)

product_titles = html.css(‘article.product_pod h3 a‘)
product_prices = html.css(‘article.product_pod p.price_color‘)

product_titles.each { |title| puts title.text }
product_prices.each { |price| puts price.text }

Здесь рассматриваются основные концепции — получение HTML, анализ контента и извлечение данных с помощью селекторов. Теперь давайте расширим этот скребок.

Решение реальных проблем парсинга

Парсеры промышленного уровня требуют решения таких проблем, как нумерация страниц, сайты JavaScript, прокси и т. д. Давайте рассмотрим некоторые решения.

Управление нумерацией страниц

Чтобы очистить данные с разбивкой на страницы, нам нужно автоматизировать получение всех страниц.

Мы можем генерировать URL-адреса страниц на основе шаблонов:

require ‘uri‘

url = ‘http://books.toscrape.com/catalogue/page-1.html‘

(1..10).each do |page|  
  puts URI.join(url, "page-#{page}.html")
end

Затем очистите каждую страницу:

page_urls.each do |url|
  response = HTTParty.get(url)

  # Extract data...
end 

Некоторые сайты используют «бесконечную прокрутку» вместо нумерации страниц. В таких случаях нам необходимо автоматизировать прокрутку и динамическую загрузку контента с помощью безголового браузера.

Обработка тяжелых сайтов на JavaScript

Многие сайты используют JavaScript для отображения контента. Для выполнения JS-кода нам нужны инструменты автоматизации браузера, такие как селен-webdriver и Водосвинка.

Например:

require ‘selenium-webdriver‘

driver = Selenium::WebDriver.for :chrome

driver.get ‘https://example.com‘

html = driver.page_source # contains JavaScript generated HTML

Capybara предоставляет предметно-ориентированный язык (DSL) для моделирования действий пользователя, таких как нажатие кнопок, заполнение форм и т. д.

Эти браузеры позволяют очищать самые сложные SPA-интерфейсы JavaScript.

Использование прокси и ротации

При парсинге больших сайтов прокси необходимы для распределения запросов и предотвращения блокировки.

Парсеры Ruby могут интегрироваться с прокси-сервисами через API:

# Fetch proxy from API
proxy_ip = fetch_new_proxy()

HTTParty.get(url,
  http_proxyaddr: proxy_ip,
  http_proxyport: 8080
)

Ключевым моментом является регулярная ротация прокси — сайты блокируют IP-адреса, делающие слишком много запросов.

Рассмотрите возможность использования таких инструментов, как СкребокAPI которые обеспечивают чистые резидентные прокси и автоматическую ротацию IP-адресов.

Обход CAPTCHA

Для сайтов с CAPTCHA мы можем использовать такие сервисы, как 2Captcha и Анти-CAPTCHA чтобы их решить.

Они работают путем отправки изображения или аудио CAPTCHA людям, решающим проблему.

Их API-интерфейсы Ruby позволяют легко интегрировать решение CAPTCHA:

require ‘anti_captcha‘

api = AntiCaptcha::Client.new(token: ‘xxx‘)

solution = api.solve_captcha(site_key: ‘xxx‘, page_url: ‘xxx‘)

# Submit CAPTCHA solution  

Благодаря этим решениям скреперы могут решить большинство реальных проблем.

Дополнительные советы и рекомендации

Вот еще несколько советов по созданию готовых к использованию парсеров Ruby:

  • Используйте такие библиотеки, как MongoDB и Postgres для хранения собранных данных для анализа.
  • Сделайте скраперы устойчивыми, используя обработку ошибок, повторные попытки, автоматические выключатели и т. д.
  • Автоматически планируйте и запускайте парсеры с помощью Cron или фоновых процессоров заданий, таких как Сидекик.
  • Проверяйте файл robots.txt сайтов и используйте задержки сканирования, чтобы избежать перегрузки серверов.
  • Имитируйте заголовки браузера и используйте пользовательский агент браузера чтобы выглядеть менее подозрительно.
  • Внедряйте рабочие очереди и архитектуры параллельного парсинга для больших сайтов.

С помощью этих советов вы сможете создать надежные и эффективные парсеры Ruby.

Проверенные в боях библиотеки парсинга

Ruby предлагает широкий спектр специализированных библиотек парсинга. Вот некоторые популярные из них:

И многие другие специализированные драгоценные камни…

Сравнение Ruby с Python и Node.js

Так как же Ruby соотносится с другими популярными языками парсинга, такими как Python и Node.js?

Руби против Питона – Согласно тестам, для большинства задач парсинга Ruby быстрее, чем Python. Однако Python лидирует в области науки о данных и машинного обучения благодаря таким библиотекам, как Pandas, NumPy и TensorFlow.

Руби против узла – Node.js лучше подходит для интенсивного парсинга API и парсинга в реальном времени. Но у Ruby более зрелая экосистема общих библиотек парсинга.

Поэтому тщательно взвешивайте компромиссы в зависимости от варианта использования. Ruby предлагает отличную универсальную производительность, выразительность и инструменты очистки.

Заключение

На этом завершается мое подробное руководство по парсингу веб-страниц с помощью Ruby. Мы рассмотрели:

  • Настройка парсинга – Менеджеры версий Ruby, Bundler, IDE и инструменты.
  • Основные понятия – HTTP-запросы, анализ HTML, извлечение селектора CSS.
  • Проблемы в реальном мире – Пагинация, JS-сайты, прокси, капчи и т. д.
  • Лучшие практики – Обработка ошибок, хранение, планирование, задержки сканирования и многое другое.
  • Библиотеки и инструменты - Механизировать, Анемона, Кимурай, Скрэпи и другие.
  • Против Python и Node – Как Ruby сравнивается по производительности, зрелости и вариантам использования.

Универсальность, экосистема и производительность Ruby делают его одним из лучших вариантов для проектов парсинга веб-страниц — от простых одноразовых парсеров до сложных корпоративных систем.

Я надеюсь, что это руководство предоставило вам прочную основу для начала вашего путешествия по парсингу Ruby. Дайте мне знать, если у вас есть какие-либо другие темы, которые вы хотели бы, чтобы я осветил в будущем!

Присоединяйтесь к беседе

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