Анализ веб-страниц, выявление новостей и не только

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

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

Пока я могу рассказать как сбором и анализом данных для алгоритмов занимаюсь я. Собственно ничего сложного в этом нет:

— у меня есть специально написанная система и пол-сервера на Amazon’е которая используется с единственной целью находить извлекать информацию с веб-сайтов. При этом извлечение происходит на нескольких уровнях: HTTP заголовки, meta информация HTML, скрипты, ссылки на изображения, любые ссылки, стилевые страницы и статистику по использованию тэгов их иерархии и структуре. В совокупности там хранится порядка 100 000 веб-страниц, в основном главных «морд» сайтов в виде нескольких выборок от 10 000 до 25 000 тысяч страниц.

— далее несколько очень простых алгоритмов разбирают эти первичные (веб-страницу) и вторичные (объекты на странице) данные и классифицируют сайт по целому ряду метрик — какая CMS используется, поддерживается ли кэширование страниц, используется ли CDN, какой-сервер используется, если реклама, какие используются виджеты и так далее. Фактически эта система аналог http://builtwith.com/ для Рунета с учётом его специфики и сервисов и с тем отличием что она не публична.  Эту штуку я называл под кодовым названием «Урлум», сейчас я передумал её делать публичной — поскольку пока не вижу в этом пользы.

— после этого начинают работать сложные алгоритмы: определения коммерциализованности сайта, извлечение структурированных блоков, определения структурной карты сайта (не путать с объектной!)  — структурная карта это совокупность правил навигаций по сайту. Того как происходят переходы — через запросы GET, именованными подразделами, AJAX’ом или иначе, а также выявление непосредственно навигационного меню сайта.

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

Собственно делалась мною вся эта схема под впечатлением от проекта из Opera Mama, но с целями идентификации форм представления информации.  Недостатки у этого подхода тоже есть — это типичный overkill поскольку усилий на то чтобы собрать все эти признаки нужно очень много и нужно четко понимать зачем это нужно и как будет использоваться.

Другой недостаток — это высокое ресурсопотребление. После структурного разбора веб-страницы хранение всех признаков и её блоков может превосходить её объём в несколько раз. Да, конечно, можно использовать эффективные структуры данных, оптимизировать переписав ключевые участки на C++, но тут уже вопрос стоимости усилий к гибкости решения.

Собственно теперь почему я и раньше писал что выявление новостей в Скиуре — это на самом деле очень упрощённый алгоритм. Потому как в нём всей этой базы не используется, в нём есть только самая базовая информация о распознавании кластеров, большая коллекция шаблонов распознавания даты и времени и простой алгоритм разметки распознанных блоков на заголовок, ссылку и текст. По отдельности это действительно  _очень простые_ алгоритмы.

Для работы алгоритма в Скиуре минимально необходимы дата + текст, а желательны дата + текст + ссылка на новость. Но дата в ленте новостей нужна не потому что нельзя RSS ленту построить на других данных и дату сформировать динамически или извлечь из сопутствующей информации. Смысл в другом, смысл в идентификации блоков. На самом деле на любой веб странице могут присутствовать множество различных информационных блоков.  Ленты новостей, избранные статьи, навигационные меню, ссылки с обзорами и без, галереи фотографий, списки книг и так далее. Далеко не все из них могут быть представлены как новостные ленты, как раз наоборот большинство из них новостными лентами не являются и новостные ленты без дат на сайте это скорее исключение чем норма. В свою очередь упрощённый алгоритм скиура делался под полную автоматику — то есть так чтобы можно было запустить робота по сайтам и он сам восстанавливал RSS ленты. Для случаев когда дат нет требуется обязательное подтверждение от человека что новостная лента найдена и определена верно. А это уже полу-автомат, а не автомат и сделать его возможно, фактически, для него всё готово, но уже не так интересно и практических задач для него пока ещё мало.

И о точности и производительности. Существует некий баланс между точностью восстановления RSS ленты, того что туда попадают все записи и правильно распознаются ссылки, текст и заголовок, и тем с какой производительностью и скоростью может работать алгоритм. Чем Выше точность тем время разбора страницы ниже и наоборот. Почему так?

Потому как есть 3 основных режима работы алгоритма:

универсальный: алгоритм, фактически всегда работает в режиме обучения и распознает новостную ленту даже если сменится движок на сайте или поменяется вёрстка, расположение блоков на странице или форматы описания дат. Универсальный режим определяет все блоки динамически и формирует ленту также динамически. Это наиболее эффективный и медленный способ выявления новостей на веб-странице и самый медленный тоже.

избирательный: режим при котором при первом обращении к странице формируется выжимка из её метаданных которые далее используются для ускоренного анализа веб-страницы. Последующий разбор страницы после этого происходит очень быстро, но и сопряжён с ошибками если изменится разметка страницы, новые элементы новостной ленты будут несоответствовать ранее сформированным при обучении шаблонам и так далее. Этот способ используется большинством полу-ручных парсеров делающих из веб-страниц RSS ленты. Только в качестве алгоритма выступает человек определяющий какие блоки и как размечать.

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

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

Суть проблемы остаётся одна — постоянная изменчивость структуры веб-страниц. Если для сотен сайтов — это будет происходить нечасто, то для тысяч и десятков тысяч, это уже заметно. В то время как «обучение на изменчивость» процесс непростой, так как требует накопления версий одной и той же страницы во временном разрезе.

Однако, по прежнему, я считаю что структурный анализ веб-страниц возможен и становится всё проще и проще.

About This Author

Яндекс.Метрика