Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Создаем свой первый веб-скрэпер, часть 2

by
Length:LongLanguages:

Russian (Pусский) translation by blacktreelab (you can also view the original English article)

В этом уроке вы узнаете, как использовать Mechanize, для того, чтобы кликать на ссылки, заполнять анкеты и загружать файлы. Вы также узнаете, как можно нарезать объекты страниц в Mechanize, как автоматизировать поиск в Google и сохранять его результаты.

Содержание

  • Одна страница или нумерация (разбивка по страницам)
  • Mechanize
  • Агент
  • Страница
  • Метод Nokogiri
  • Ссылки
  • Щелчок
  • Формы

Одна страница или постранично

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

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

Вот где заканчивается работа Nokogiri, и вступает в игру другой полезный пакет, под названием Mechanize.

Mechanize

Mechanize - это еще один мощный инструмент, который предлагает много отличных функций. Он, по сути, позволяет автоматизировать процесс взаимодействия с веб сайтами, с которых нужно провести экстракцию информации. В этом смысле он немного напоминает функциональность Capybara, с которым вы возможно знакомы.

Не поймите меня неправильно, работать с Nokogiri на одной странице - это круто само по себе, но для более сложной экстракции, нам нужно чуть больше лошадиных сил. По существу, мы можем пройти через столько страниц, сколько нужно, и взаимодействовать с их элементами —иммитируя и автоматизируя человеческое поведение. Круто, правда?!

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

Все что нужно, это добавить регистрационные данные и дать направление Mechanize. Поскольку у нас есть возможность кликать на ссылки и заполнять формы, практически не существует того, что данный инструмент не сможет сделать. Он имеет тесную связь с Nokogiri, и также основывается на нем. Аарон Паттерсон - один из авторов этого отличного пакета.

Инстанцируем агент Machanize

Прежде чем мы начнем работу с Michanize, на нужно инстанцировать агента.

some_scraper.rb

Этот агент будет использован для загрузки страницы, аналогично тому, что мы это делали с Nokogiri.

some_scraper.rb

Здесь агент Mechanize получл страницу подкастов с ее куки.

Экстракция содержимого страницы

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

some_scraper.rb

Результат это получается довольно существенный. Сами посмотрите из чего состоит объект Mechanize::Page Здесь вы можете видить все атрибуты страницы.

Это очень удобный объект для среза данных, которые вы хотите извлечь.

Результат

Если вы хотите взглянуть на саму страницу HTML, вы можете задать методы body или content.

some_scraper.rb

Результат

Поскольку подкаст имеет лишь небольшое число различных элементов на странице, вот, для примера, что получается после экстракции данных со страницы github.com. Здесь намного больше информации. Думаю, полезно попробовать разные страницы.

Результат со страницы github.com

Вернемся к нашим подкастам, вы также можете рассмотреть такие вещи, как кодирование, код ответа HTTP, URI, или заголовки ответа.

some_scraper.rb

Результат

Есть еще много интересных вещей, если вы хотите изучать дальше. А мы на этом остановимся.

Методы Nokogiri

  • at
  • search

Mechanize использует Nokogiri для эктракции данных со страниц. Вы можете применять то, что вы узнали о Nokogiri в первой статье, используя эти знания при работе с Mechanize. Это означает, что вы используете Mechanize для навигации по страницам, и методы Nokogiri для экстракции.

Например, если вы хотите найти отдельный объект, вы можете использовать метод at, и в тоже время метод search возвращает все объекты, соответствующие критериям селектора на странице. Иными словами, оба эти метода будут работать как и с объектами документа Nokogiri, так и с объектами страницы Mechanize.

some_scraper.rb

Результат

Ссылки

  • links
  • link_with
  • links_with

Мы можем перемещаться по всему сайту как захотим. Пожалуй, самое важное в Mechanize это возможность работать с ссылками. В противном случае, вы можете работать только с Nokogiri. Давайте посмотрим, что мы получим, если задать данные ссылки на странице.

some_scraper.rb

Результат

Елы-палы, давайте разобьем это на отдельные части. Так как мы не задавали Mechanize поиск по всему сайту, мы получили массив только страницы. Mechanize проходит по странице сверху вниз, и возвращает список ссылок. Я создал небольшую картинку с зелеными указателями на различные ссылки, которые вы можете видеть на выходе.

Кстати, это уже конечный результат редизайна моего подкаста. Мне кажется эта версия немного лучше походит для демонстрационных целей. Вы также получите представление о том, как будет выглядеть конечный результат, и почему нужно было выбрать контент с моего старого сайта на Sinatra.

Скриншот

Podcast Links

Как обычно, мы также можем просто извлечь текст.

some_scraper.rb

Результат

Работать со всеми этими ссылками в одной куче может быть и очень полезным, и довольно таки нудным. К счастью, у нас есть несколько инструментов для тонкой настройки.

some_scraper.rb

Результат

Бум! Кажется у нас что-то получается! Мы может сконцентрироваться на конкретных ссылках. Мы можем нацеливаться на ссылки, которые соответствуют определенным критериям — как например текст, — с более интересным API как links_with или link_with. Также, если у нас есть многочисленные Focus ссылки, мы можем сосредоточиться на определенном номере на странице, используя квадратные скобки [].

some_scraper.rb

Если же вам нужны сами ссылки, а не их текст, вам нужно только указать параметр href, чтобы найти эти ссылки. Mechanize не будет вам мешать. Вместо параметра text мы указываем параметр href.

some_scraper.rb

Если вы хотите найти первую ссылку с нужным текстом, вы также можете использовать этот синтаксис. Очень удобно и немного более читабельно.

some_scraper.rb

А теперь давайте посмотрим, что же скрывается за ссылкой Focus. Давайте щелкнем на нее!

Клик

some_scraper.rb

Мы получим еще один длинный список ссылок, как и раньше. Видите, как легко было совместить .click.links. Mechanize нажимает на ссылку и переходит на следующую страницу. Поскольку мы также запросили список ссылок, мы получим все ссылки, что Mechanize сможет найти на этой новой странице.

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

some_scraper.rb

Тут мы получим список ссылок с обеих страниц. Мы пройдем по ссылке каждого собеседника, Mechanize переходит по каждой ссылке, и собирает все ссылки на данной странице. Ниже вы можете найти несколько примеров комбинаций для сравнения.

some_scraper.rb

Формы

  • submit
  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Давайте теперь рассмотрим формы!

some_scraper.rb

Результат

Так как мы используем метод forms, на выходе мы получаем массив, даже если это только одна форма. Теперь, когда мы знаем, что форма имеет название "f", мы можем использовать версию form в в единственном числе, чтобы получить более удобную информацию.

some_scraper.rb

Используя form'f', мы выделяем отдельную форму для работы. На выходе мы не получим массив.

Результат

Мы также можем определить имя поля ввода текста (q).

Мы может выделять его по имени, устанавливая его значение как атрибуты в Ruby. Все, что нам нужно сделать, это дать ему новое значение. Вы можете видеть из примера результата, что оно пусто по умолчанию.

some_scraper.rb

Результат

Как вы можете видетть выше, значение текстового поля изменилось на New Google Search (новый поиск Google). Теперь нам нужно лишь послать (submit) форму и собрать результаты со страницы, которую возвращает Google. Нет ничего проще. А теперь давайте проведем поиск чего-нибудь еще!

some_scraper.rb

Здесь я определил заголовок результата поиска с помощью h3.r селектора CSS, сопоставив его с text, и распечатал результаты. Ничего трудного, правда? Это, конечно, простой пример, но подумайте о том, какие бесконечные возможности это вам предоставляет!

Результат

В Mechanize имеются различные поля ввода, чтобы вы смогли поэкспериментировать. Вы даже можете загружать файлы!

  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Вы можете также задавать по имени такие параметры, как, радио-кнопки, и определять их с помощью метода check.

some_scraper.rb

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

some_scraper.rb

Загрузка файлов работает по тому же принципу, что и ввод текста в форме, установкой его как атрибута Ruby. Определяем место загрузки и указываем путь к файлу (имя файла), который вы хотите передать. Это звучит сложнее, чем есть на самом деле. Давайте взглянем!

some_scraper.rb

Заключительные мысли

Видите, никакого волшебства! Теперь вы достаточно оснащены, чтобы продолжать экспериментировать. Конечно, вам предстоит еще много чего узнать о Nokogiri и Mechanize, но вместо того, чтобы тратить слишком много времени на ненужные аспекты, поэкспериментируйте с этими пакетами, и если столкнетесь с проблемами, выходящими за рамки  данной статьи для начинающих, обращайтесь к документации.

Я надеюсь, что вы видите, насколько простые и в то же время мощные эти пакеты. Но как мы знаем, возможности также несут за собой обязанности. Используйте эти пакеты в рамках закона, когда у вас нет доступа к API. Вам вряд ли часто придется использовать эти инструменты, но они очень вам пригодятся, если надо провести экстракцию информации с веб-страниц.

Как я и обещал, в следующей статье мы рассмотрим реальный пример, где я буду выбирать данные с моего сайта с подкастами. Я извлеку информацию с моего старого сайта на Sinatra, и перенесу ее на новый сайт на Middleman, который использует .markdown файлов для каждого эпизода. Мы будем выбирать даты, номера эпизодов, имена собеседников, заголовки, подзаголовки и тому подобное. До встречи!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.