Это инструкция для команды «Контент-Агент», которая хочет за 7 дней запустить стабильный автопостинг отраслевых новостей. Без общей теории — конкретные шаги, инструменты, примеры кода и конфигурации. Обязательные компоненты: источник (RSS/JSON), процесс обработки (парсер), хранилище и точка выхода — REST API для публикации на сайт или в CMS.
| Слой | Рекомендованные инструменты | Примечание |
|---|---|---|
| Сбор | RSS ленты, JSON API | RSS‑парсинг предпочтителен для отраслевых агрегаторов |
| Парсинг | Python + feedparser / Node.js + rss-parser | Легко тестировать локально |
| Очистка | Bleach (Python), DOMPurify (JS) | Удалять скрипты, inline-styles |
| Публикация | REST API для публикации | Требует аутентификации и идемпотентности |
Схема: сборщик -> парсер -> очередь (Redis/RabbitMQ) -> публишер. Ключевая задача — обеспечить идемпотентность: каждое событие должно иметь уникальный ключ (GUID или хэш от source+guid+pubDate).
Правило: если запись уже опубликована, пропускаем. Храним в Redis SET последних 10k ключей.
Используем feedparser и requests. Код запускается в Docker контейнере и читает конфиг sources.json.
import feedparser
import requests
import hashlib
def uid(entry, source):
key = source + entry.get('id', entry.get('link', ''))
return hashlib.sha1(key.encode()).hexdigest()
feed = feedparser.parse('https://b2b.example.com/rss')
for e in feed.entries:
print(uid(e, 'b2b'))
Дополнительно: нормализуйте pubDate в ISO 8601 и вытаскивайте content или summary.
<script>, iframe и внешние стили.media:content или используйте Open Graph; сохраняйте CDN-бэкап по URL.Разница: публикация через CMS REST API vs. прямой в базу. Рекомендую REST API для публикации — контролируем логику, статусы и ошибки.
Пример REST API запроса (POST) для публикации:
POST https://cms.example.com/api/posts
Headers: Authorization: Bearer TOKEN
Body (JSON): {
"title": "Заголовок",
"slug": "generated-slug",
"content": "Контент
",
"published_at": "2026-02-18T10:00:00Z",
"tags": ["отрасль","новости"]
}
Реализуйте повторные попытки с экспоненциальной задержкой и логирование ответа: 200/201 — успех; 409 — конфликт, игнорируем; 429/5xx — ставим задачу в очередь назад.
Разверните в Docker Compose: сервис парсера, очередь Redis, worker публишер. Настройте crontab или systemd timer для запуска парсера каждые 5–15 минут в зависимости от плотности новостей.
Минимальная docker-compose.yml: один контейнер с приложением, Redis и volume для логов.
Проблема: REST API для публикации возвращает 502. Решение: переводим на режим backoff и переключаемся в «черновики» — сохраняем подготовленный JSON в S3 и ставим задачу на повтор. В результате 0 потерянных материалов и возможность ручного вливания.
Источник дублирует одну и ту же новость с разными guid. Решение: в uid используйте хэш от (source + normalized_title + date). Это закрывает большинство дубликатов.
| Параметр | RSS‑парсинг | Прямой API |
|---|---|---|
| Стабильность | Высока, прост в работе | Может требовать ключей и квот |
| Детализация данных | Ограничена | Больше полей, фильтры |
| Сложность реализации | Низкая | Средняя |
Следуя этому плану «Контент-Агент» сможет запустить стабильный автопостинг новостей за 7 дней, используя RSS‑парсинг и REST API для публикации. Конкретные команды и конфигурации адаптируйте под вашу CMS и требования безопасности.