/rss-2

Primary LanguageHTML

Java

Нужно написать агрегатор новостей.

Пользователь подает на вход адрес новостного сайта или его RSS-ленты и правило парсинга (формат правила — на усмотрение разработчика).

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

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

В качестве примера требуется подключить два любых новостных сайта на выбор.

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

Язык — Java. Хранилище — любая реляционная база данных. Плюсом будет использование ORM Hibernate.

Комментарии

Парсер

По условию парсер должен парсить либо страницы сайта, либо RSS-ленту.

RSS лента

Для RSS ленты все довольно просто, т.к. формат более-менее стандартизирован. Благодаря этому можно составить шаблон который и использовать для чтения ленты.

Указание путей до необходимых значений решил задавать с помощью XPath.

HTML

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

Для случаяв когда необходимое содержимое находится в аттрибуте добавил возможность указать название аттрибута добавлением в конец селектора @attribute, с указанием имени необходимого аттрибута, например: a @href.

Также возможны случаи когда необходимо сохранить пост со всем содержимым тэга, а не только текстовым содержимым (например если пост содержит картинки), для этого достаточно добавить в конец селектора @, например: div.post @.

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

Парсер основан на библиотеке Jsoup.

Парсинг дат

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

Хранение шаблона

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

Запуск приложения

Переменные приложения:

Переменная Значение по умолчанию Описание
db.url jdbc:postgresql://127.0.0.1:5432/rss URL для подключение к БД
db.username rss Имя пользователя для подключения к БД
db.password rss Пароль который необходимо использовать для подключения к БД
db.driver org.postgresql.Driver Класс драйвера который необходимо использовать
hibernate.dialect org.hibernate.dialect.PostgreSQL95Dialect Диалект который необходимо использовать
hibernate.show_sql true Показывать ли в консоле выполняемые запросы
hibernate.hbm2ddl.auto create Действие которое необходимо произвести с базой при запуске приложения, рекомендуемые значения create (инициализация БД) и validate (проверка структуры БД)
entitymanager.packagesToScan rss.model Пакет с моделями БД которые необходимо использовать
spring.jpa.properties.hibernate.jdbc.time_zone GMT Указание в каком часовом поясе необходимо хранить метки времени

Первый запуск

При первом запуске необходимо проинициализировать БД. Для этого необходимо указать параметр hibernate.hbm2ddl.auto равным create. При дальнейших запусках его необходимо выставить в validate, т.к. в противном случае база будет заного проинициализирована.

При первом старте будет добавлено несколько ресурсов по умолчанию. Скрипт их инициализации находится в файле import.sql