Oops... your message was not sent

Your message has been successfully sent

тематические истории, основанные на опыте компании JetRuby
Веб-разработка

Веб-скрапинг — что это и как он работает

Любой веб-ресурс становится ценным и посещаемым только при наличии полезного, интересного пользователям и уникального контента. “Кто владеет информацией, тот владеет миром”, — простая истина, без осознания которой невозможно стать успешным бизнесменом (равно как и политиком или любым другим специалистом). Вспомните цитату Билла Гейтса: “В будущем на рынке останется два вида компаний: те, кто в Интернете и те, кто вышел из бизнеса”. Пожалуй, сегодня ее тоже можно назвать прописной истиной.

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

Сегодня объемы информации превосходят возможности их обработки у любого даже самого талантливого человека или узкопрофильного специалиста. И в этом нет ничего противоестественного. Такова жизнь. Поэтому для автоматического сбора и обработки больших объемов информации был придуман скрапинг (он же — парсинг) веб-сайтов.

Веб-скрапинг — что это?

В широком понимании веб-скрапинг — это сбор данных с различных интернет-ресурсов. Общий принцип его работы можно объяснить следующим образом: некий автоматизированный код выполняет GET-запросы на целевой сайт и получая ответ, парсит HTML-документ, ищет данные и преобразует их в заданный формат. Заметим, что к категории полезных данных могут относиться:

  • каталог товаров;
  • изображения;
  • видео;
  • текстовый контент;
  • открытые контактные данные — адреса электронной почты, телефоны и т.д.

Существует масса решений для скрпаинга веб-сайтов. Среди них:

  • Отдельные сервисы, которые работают через API или имеют веб-интерфейс (Embedly, DiffBot и др.).
  • Проекты с открытым кодом, на разных языках программирования (Goose, Scrapy — Python; Goutte — PHP; Readability, Morph — Ruby ).

Кроме того, всегда есть возможность изобрести велосипед и написать собственное решение. Например, с использованием библиотеки Nokogiri (для языка программирования Ruby).

Команда JetRuby Agency сумела накопить немалый опыт в сфере скрапинга веб-сайтов. Изучив и использовав самые разнообразные решения, мы можем смело заявить: идеального скрапера не существует. Почему? Извольте: аргументы в студию!

  1. Ни один сайт не имеет идеальной верстки с точки зрения догматов веб-дизайна. Именно это делает каждый сайт уникальным и привлекательным для пользователей.
  2. Каждый веб-разрабочик (если он не работает в солидной IT компании со своими правилами и стайл гайдами) пишет код под себя или просто, как умеет. Далеко не всегда код получается грамотным и качественным. Зачастую в нем можно найти огромное количество ошибок. В том числе грамматических. Все это делает “самописный” код абсолютно нечитаемым для скраперов (речь, в первую очередь, идет о верстке).
  3. Масса веб-ресурсов использует HTML5, где каждый элемент может быть абсолютно уникальным.
  4. Некоторые ресурсы содержат разнообразные защиты от копирования данных, а значит и от скрапинга. Это выражается в многоуровневой верстке, использовании JavaScript для рендеринга контента, проверки user-agent и т.д.
  5. В зависимости от сезона или тематики целевого материала на сайте могут быть использованы разные макеты. Периодически это касается даже типичных страниц (сезонные акции, премиум статьи и т.д.).
  6. Кроме полезных блоков, веб-страница часто изобилует “мусором” в виде рекламы, комментариев, дополнительных элементов навигации и т.д.
  7. Исходный код может содержать ссылки на одни и те же картинки разных размеров, например — для превью.
  8. Сайт может определить страну, в которой находится ваш сервер и отдать информацию не на английском языке.
  9. У всех сайтов может быть разная кодировка, которая не отдается в ответе на запрос.

Вышеперечисленные факторы серьезно затрудняют процесс веб-скрапинга. В результате качество контента может упасть до 20% и даже до 10%, что абсолютно неприемлемо. Не забываем — полнота информации является ее важнейшим критерием.

А если очень хочется?

Итак, проблем — выше крыши. Но “поскрапить” очень хочется. В сложившейся ситуации мы пришли к единственному верному, на наш взгляд, выводу:

  • При необходимости получать данные из небольшого количества источников, лучше написать свой скрапер и настроить его под нужные сайты (качество получаемого контента — около 100%).
  • Использовать комплексный подход в выборе ридера (скрапера), если нужно получать информацию из большого количества источников (до 95% качества).

Как это работает на практике?

  1. Готовим механизм получения HTML кода по GET запросу. Далее рассматриваем DOM структуру целевого сайта и определяем узлы с интересующей нас информацией. После этого создаем обработчик узлов и выводим данные в нормализованном виде (по желанию заказчика или удобству обработки результатов — к примеру, в формате JSON).
  2. Создаем систему скрапинга.

Абстрагируемся и обзовем нашу систему “Duck System”. Затем научим ее нести золотые яйца

web-scraping

На входе наша система получает URL целевой страницы, а на выходе отдает нормализованные данные (например, в формате JSON). Получив URL, система определяет какому ридеру следует отдать заданный URL на обработку (мы точно знаем, что этот ридер читал страницы сайта с наивысшем качеством и под него были внесены соответствующие настройки). Если же ридер для целевого сайта отсутствует, его читает ридер, используемый по умолчанию (как правило это либо самый стабильный скрапер, либо сторонний сервис). Получив от Duck System задачу, ридер ее выполняет.

Как видите, на схеме представлен еще один скрапер (справа). Это дополнительный, постоянно дорабатывающийся ридер. Он предназначен для чтения сайтов, которые не смог обработать скрапер, используемый по умолчанию. Причем дорабатываться он может как разработчиками, когда ситуация очень сложная и скрапер написать довольно трудно, так и специально  обученным админом системы, которому достаточно скопировать XPATH контейнера с контентом и контейнеров, которые нужно вырезать из результата.

Такой подход позволяет поднять качество получаемого контента на максимальную высоту. Однако за все приходится платить. В нашем случае платой за использование системного подхода является время обработки и ресурсы сервера. А также подписка на сторонний сервис веб-скрапинга — она стоит денег. Скажем прямо, эти затраты могут превысить вложения в серверную инфраструктуру и работу всех вместе взятых программистов.

Преимущества собственных решений для небольшого количества сайтов заключаются в их скорости. Обработка одной страницы — от 7 ms. А как же ограничение скоростью интернета и размером загружаемых медиафайлов — спросите вы. Мы решили этот вопрос с помощью асинхронной загрузки медиа и основного контента в бэкграунде. В итоге файлы размером от 100 Мб грузятся аж со свистом (вы просто не успеваете этого замечать), а результаты на выходе дают стопроцентную точность.

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

Если у вас остались вопросы, мы всегда открыты к диалогу.

department
Статью подготовил
Отдел веб-разработки
Профессиональная разработка сайтов и приложений на стороне сервера и клиента. Проектирование дизайна, верстка страниц и техническое обслуживание реализованных проектов.
New Articles