uCrawler - фабрика новостных агрегаторов с ИИ
Новостной робот
В ноябре 2017 года я запустил сайт «Новостной робот» (https://newsbot.press). А также написал статью об этом проекте на VC.ru: «Как я сделал свои Яндекс.Новости» (https://vc.ru/29708-kak-ya-sdelal-svoi-yandeks-novosti). Чтобы не перечитывать тот материал, я коротко расскажу об этом проекте, так как он дал начало платформе uCrawler.
Новостной робот - это автоматизированная система сбора и анализа новостной информации. Задача робота: собрать информацию с сайтов СМИ, выделить главные новости в разных категориях и сгруппировать их по темам. Робот полностью автономен. Ни я, ни кто-либо еще не принимает участия в его повседневной работе. Он все делает самостоятельно, в том числе выбирает главные темы дня или срочные новости последних часов. Он намного сложнее традиционных агрегаторов. Внутри — машинное обучение, нейронные сети. На данный момент, вся система проработала без сбоев полгода.
Для меня это был пет-проект, одной из целей которого было испытать новые технологии. Я реализовывал его один: от фронтенда до бэкенда, от микросервисов до алгоритмов машинного обучения, от работы с облаками до интеграции в соцсети.
Наиболее интересной частью этого проекта (с технической стороны) является семантический анализатор, который использует библиотеку fastText от Facebook. fastText позволил мне строить семантические векторы слов и даже целых фраз, а затем сравнивать их и делать выводы о том, насколько похожи сами слова между собой. «Новостной робот» стал понимать, к примеру, что «импичмент» и «отставка» близкие в определенном контексте слова.
Другой отличительной особенностью проекта является его экономичность в плане ресурсов. Для этого пришлось переписать некоторые библиотеки (в том числе и fastText), отказаться от многих удобных облачных услуг. Но в итоге, вся система работает на одной виртуальной машине с 1 CPU и 1 GB RAM.
Последнее, что достойно внимания - это отсутствие привязки «Новостного робота» к языку. Не смотря на то, что newsbot.press - это русскоязычный ресурс, сам робот может выполнять свою функцию и для других языков.
Нужно понимать, что я не стремился создать новостной ресурс с тысячами пользователей. Развитие таких площадок - это не моя область деятельности. Мне ничего про это не известно. Не было и цели заработать на рекламе, поэтому никакой рекламы на сайте нет. Я лишь решал сложную и интересную техническую задачу. И добился отличного результата. Новостной робот всегда знает о главных темах.
Новая идея
С момента публикации первой статьи о «Новостном роботе» я получил много отзывов. И должен выразить признательность всем людям за проявленный интерес.
Читая различные предложения, я обратил внимание на то, что многие занимались созданием аналогичных систем-агрегаторов. Отличались лишь тематики и языки, но в общем наши задачи были схожи. Тогда мой друг предложил создать из «Новостного робота» инструмент, который мог бы помочь в решении этих задач. Фактически, нужно было превратить существующую систему в платформу, которую можно было бы развернуть и настроить для произвольного набора источников (на любую тематику и на любом языке). И это действительно было возможно.
Во-первых, как уже было сказано, робот не требует серьезных вычислительных ресурсов. А это значит, мы могли арендовать под каждый новый агрегатор свою недорогую виртуальную машину в облаке.
Во-вторых, робот не ориентирован на один язык или определенную тематику, и может быть настроен, к примеру, на сбор данных с сайтов о криптовалютах на французском языке. Было бы совершенно бессмысленно пытаться создавать множество таких площадок самим. Недостаточно только создать ресурс, нужно еще и развивать его. А это совсем иная задача. Мы же могли бы помочь собрать нужные данные, обработать их своими алгоритмами и передать результат потребителю.
Чтобы создать такую платформу, мне потребовалось серьезно изменить существующую админку «Новостного робота». Сделать ее удобной, чтобы работать в ней мог не только я, но и любой другой человек. Кроме того, я существенно упростил процесс добавления новых источников. Раньше, для этого требовалось указывать не менее 5 селекторов на языке запросов XPath (потому что, далеко не всегда существует RSS-поток, а для кластеризации нужны полные тексты).
Сейчас краулер обладает алгоритмами, которые позволяют автоматически определять расположение контента на странице. Он умеет находить основной заголовок, картинки, полный текст статьи; умеет убирать ненужный текст вида «следуй за нами в соц.сетях». В половине случаев необходимость в написании XPath запросов отпала вовсе! В других случаях, требуется написать один или два запроса, и данные будут корректно собраны со страницы. Сейчас я могу за один вечер внести от 50 до 100 источников за раз.
Небольшое примечание. Краулер очень аккуратно работает с источниками! Он запускается не часто, учитывает robots.txt, делает длинные паузы между запросами страниц, кэширует ответы, и не забирает данные повторно. Возможно, именно поэтому он ни разу не был забанен. Все это отражается и на времени опроса. Краулер работает очень быстро, даже если в списке есть «медленные» сайты.
Кроме админки, было еще много вопросов, которые пришлось решать. Например, DevOps. Нужно было научиться быстро «поднимать» полностью сконфигурированную на работу машину в облаке. Сейчас этот процесс автоматизирован. Однако, делаем мы это по непосредственному запросу по почте.
Оставлю «за кадром» все остальные проблемы и задачи, которые стояли в ходе разработки. И сразу перейду к тому, что получилось в итоге.
uCrawler
Платформу мы назвали uCrawler. Она была разработана достаточно быстро, но ее развитие не прекращается и сейчас. Мы занимаемся проектом столько сколько нам позволяет время.
uCrawler предоставляется в виде SaaS услуги. В начале, клиенту дается бесплатный Демо-доступ сроком на неделю. Добавление источников происходит в один клик из готового списка. Если каких-то источников в списке нет, то мы оперативно добавляем их по запросу клиента.
После того, как краулер запускается в работу, клиент может начинать забирать результат к себе. Для этого предусмотрены разные варианты. Можно забирать результат по API в виде JSON или XML, можно настроить RSS-ленту, а можно и просто посмотреть на результат в виде сгенерированного статического сайта.
Что из себя представляет результат? Это кластеризованный ранжированный новостной поток от источников, содержащий всю информацию, которую собирает краулер, включая полные тексты новостей и картинки. Вот примеры сбора новостей ИТ и криптовалют.
Мы полностью отвечаем за работу краулера и гарантируем его стабильность. Мы понимаем, что многие выводят данные от uCrawler сразу к себе на сайт. Или автоматически публикуют новости в своем Telegram-канале (через IFTTT). Поэтому мы отслеживаем все рабочие процессы каждой виртуальной машины под нашим управлением. Видим все «проблемные» источники. Не так давно были атакованы устройства Cisco, что сразу отразилось на доступности многих сайтов. Об этой проблеме мы узнали сразу же, как только она произошла. Все uCralwer инстансы продолжили работу в штатном порядке, несмотря на некоторые потери среди источников.
Как только мы начали создавать первые Демо-машины, нам сразу стали поступать различные предложения по развитию функционала. Но наши возможности ограничены, и выполнить все задуманное практически нельзя. Однако, мы стали отбирать самые частые предложения, чтобы постараться выполнить хотя бы их. Так мы реализовали фильтрацию новостного потока по ключевым словам. Это оказалось очень востребованной функцией.
uCrawler позволяет создавать неограниченное количество фильтров. Каждый фильтр может быть настроен индивидуально со своим набором ключевых слов. При этом, данные от таких фильтров кластеризуются также, как и основная группа новостей. Эти данные можно получить по API в виде JSON или XML, или настроить RSS-ленту, или посмотреть в виде сгенерированного статического сайта. Поиск по словам выполняет Elasticsearch, который мы устанавливаем внутрь uCrawler, когда функция фильтрации требуется клиенту. Такой подход вынуждает нас использовать более дорогие виртуальные машины (так как Elasticsearch написан на Java), однако, в итоге дает хороший результат.
Опыт с Elasticsearch мы решили развивать. uCrawler помнит данные лишь за несколько дней, и не может быть использован для постоянного хранения информации. Но он умеет выгружать кластеризованные данные в Elasticsearch. А Elasticsearch умеет делать различные интересные агрегации. Мы воспользовались этой возможностью, и начали тестировать свой небольшой раздел аналитики по СМИ. Мы научили uCrawler забирать различные счетчики из соц.сетей (комментарии, репосты, лайки), и сопоставлять их с данными от СМИ. И написали специальный сайт, где «на лету» можно генерировать отчеты по любому запросу. Сейчас этот функционал проходит тестирование, и мы набираем минимально необходимый объем данных. Раздел аналитики уже доступен для экспериментов тут.
В запасе есть и другие интересные задачи. Это и переводы текстов «на лету», и автоматический рерайтинг, и определение первоисточников. Возможно, вы сможете придумать что-то еще. Тогда обязательно свяжитесь с нами! Мы всегда рады новым идеям.
В заключении
uCrawler появился совсем недавно. И мы даже не успели подумать о продвижении, как к нам стали обращаться за Демо-доступом.
На самом деле, у нас не так много постоянных пользователей. Но этого хватает, чтобы мы с энтузиазмом продолжали свою работу. Каждый новый запрос Демо - это свое небольшое испытание для нашей платформы. К примеру, несколько дней назад, мы запустили систему на арабском языке для одной африканской страны.
Стоит отметить, что мы сами являемся пользователями собственного продукта, так как наш первоначальный сайт newsbot.press теперь работает на платформе uCrawler.Дополнительную информацию можно получить на нашем сайте https://ucrawler.newsbot.press.