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