CoderCastrov logo
CoderCastrov
Ruby

Основы парсинга с помощью Ruby

Основы парсинга с помощью Ruby
просмотров
3 мин чтение
#Ruby
Table Of Content

    Бывают случаи, когда вам нужно получить данные из интернета для программы, которую вы пишете. API - отличный ресурс, но только если существует тот, который содержит нужную вам информацию и если данные, которые вы ищете, статичны и неизменны. Если вы хотите получить информацию о предстоящих событиях вашей любимой знаменитости или о предстоящих играх Seahawks или Mariners, API не подходит. Парсинг - отличный способ получить данные с веб-страницы.

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

    Название Nokogiri происходит из японского и означает "пила с мелкими зубьями", которая использовалась для грубой распиловки бревен на доски для плотников и столяров.

    И вот как используется гем Nokogiri. Он точно парсит только необходимые данные, которые мы ищем на веб-странице.

    Чтобы использовать Nokogiri, вам сначала нужно установить гем, а затем подключить его и Open-URI в начале вашего файла:

    require 'nokogiri'
    require 'open-uri'

    Затем, чтобы начать, вам нужно получить HTML с любого веб-сайта, с которого вы хотите получить данные, используя URL:

    html = open('http://www.google.com')

    и после этого Nokogiri возьмет строку HTML, возвращенную и переведет ее в набор узлов, с которыми мы можем работать (обычно это называется 'doc'):

    doc = Nokogiri::HTML(html)

    Теперь у doc есть весь HTML, преобразованный во вложенные узлы, которые похожи на структуру вложенных хэшей, поэтому мы можем перебирать объект Nokogiri, чтобы найти нужную информацию.

    Теперь, когда мы сделали основы, мы можем перейти к интересным вещам: получению данных, которые мы ищем, из 'doc'. Nokogiri использует селекторы CSS для возврата данных из определенной части HTML-документа. Селекторы CSS выглядят так:

    <div id="example-div">
      <p class="example-paragraph">Пример параграфа</p>
    </div>

    В этом примере вы бы обратились к элементу div с #example-div (# для идентификаторов) и к параграфу с .example-paragraph (. для классов). В HTML идентификатор должен быть уникальным и относится только к одному элементу, в то время как класс может быть применен к группе похожих элементов.

    Используя Nokogiri в переменной doc, чтобы найти нужный вам элемент, это возможно, но не очень практично, так как это очень длинный список информации. Лучший способ найти то, что вам нужно, - найти его на исходной веб-странице, щелкнуть правой кнопкой мыши и выбрать "Инспектировать". Это покажет вам HTML всей веб-страницы, но подсветит элемент, на который вы нажали.

    Вернемся к Ruby, у Nokogiri есть метод .css, который вызывается на переменной doc. Он принимает аргумент селектора CSS, который вы хотите найти, используя подход из предыдущего абзаца, с классами и идентификаторами. Таким образом, получение параграфа из приведенного выше примера будет выглядеть так:

    doc.css(".example-paragraph")

    Но это фактически возвращает что-то похожее на массив с одним объектом Nokogiri с множеством информации о всем элементе параграфа. Если вы хотите получить только текстовую часть параграфа, вы вызовете .text в конце:

    doc.css(".example-paragraph").text
      => "Пример параграфа"

    Но не очень интересно получать информацию только из одной части веб-страницы, и вот где вступает в игру итерация. Если на веб-сайте приюта для животных есть список элементов div для каждого животного, вы можете найти имя класса для всех этих div и вызвать pets = doc.css(".class-name") для получения коллекции элементов, а затем перебрать их, используя перечисляемый объект, чтобы получить имена всех животных, например:

    pets.map do |pet|
       pet.css(".pet-name").text
    end
      => [массив имен животных]

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