Harvester собирает заголовки статей с новостных сайтов и выводит их список, отмечая просмотренные. Программа помогает искать события для выпусков «Леновостей».
Придумал интерфейс и написал код на Python + JS.
Вторая версия научилась собирать новости асинхронно и без помощи стационарного ПК. Каждые 15 минут она обходит 55 сайтов за 12 секунд и выводит заголовки по дням.
Программа всё также управляется с клавиатуры:
↑/↓ или W/S — Навигация по списку
Ввод или Пробел — Открыть новость в новой вкладке
Минимальная ширина экрана: 1680px. Жми на скриншот, чтобы увидеть в оригинале.
Раздел «Закладки» хранит новости, которые передал «
Hound»:
Панель управления выводит ошибки и процент успешных попыток сбора новостей. Внизу кнопка ручного запуска процесса.
Бэкенд на Django, состоит из трёх частей: краулеры для сбора новостей с сайтов, хранилища и API.
Каждый краулер наследует абстрактный класс, который предоставляет парсер и сохраняет «урожай»:
Краулеры живут в отдельных файлах с главным классом для всего сайта и подклассами для страниц. От них требуется реализовать сбор данных и вернуть массив с заголовками, ссылками и описанием новостей:
Подклассы тоже могут реализовать метод collect() и объявить имя
Парсер передаёт краулерам HTML, обработанный BS4, или RSS через Feedparser:
Для добавления нового краулера достаточно создать файл. Каждые 15 минут планировщик задач «Django Q2» вызывает функцию, которая запускает все краулеры асинхронно, получив их список от фабрики:
Краулер при первом запуске создаёт запись о себе в базе данных и скачивает favicon сайта, который обходит. Далее управляется через панель администратора Django: включить/выключить, задать хранилище, посмотреть журнал ошибок и количество удачных обходов:
Все хранилища наследуют абстрактную модель и игнорируют новости с одинаковыми ссылками при записи, так что краулерам не нужно беспокоиться о повторах. Django не поддерживает уникальные текстовые поля в MySQL и база ищет дубликаты по CRC32 хэшу:
Новости в админке Django
API на Django REST framework. Интерфейс не знает о хранилищах и получает их от фабрики по названию точки, к которой обратился клиент:
Фабрика предоставляет не только классы, но и абстрактный сериализатор:
Фронтенд на SvelteKit с адаптером SPA. Вывод списка новостей:
Если в начале списка нажать вверх или в конце — вниз, то звучит звуковое предупреждение: