Парсинг RSS: как извлекать данные из лент и зачем это нужно

Парсинг RSS и Atom-лент: структура форматов, готовые библиотеки и мониторинг новостей и блогов без обхода страниц.

КP
Команда Parsing.agency
Сбор данных под задачи бизнеса
Опубликовано: 29 апреля 2025

RSS — один из самых недооценённых и при этом самых удобных способов получать данные с сайтов. Пока все обсуждают «сложный парсинг» с обходом JavaScript и капч, тысячи ресурсов спокойно отдают свой контент в виде аккуратного структурированного XML. Достаточно знать, где искать и как это прочитать.

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

Что такое RSS и почему его удобно парсить

RSS (Really Simple Syndication) — это стандартизированный XML-формат, в котором сайт публикует список своих свежих материалов: заголовки, ссылки, краткие описания, даты публикации, иногда полный текст и вложения. Рядом существует похожий формат Atom — он решает ту же задачу, отличается лишь деталями разметки.

Ключевое отличие RSS от обычного парсинга HTML в том, что структура ленты предсказуема и стабильна. Вам не нужно цепляться за CSS-классы, которые поменяются после ближайшего редизайна. Поля везде одни и те же:

  • title — заголовок;
  • link — ссылка на материал;
  • description или summary — краткое описание;
  • pubDate или updated — дата публикации;
  • guid или id — уникальный идентификатор записи.

Это делает RSS идеальной точкой входа, когда сайт такую ленту предоставляет.

Для чего полезен парсинг RSS

Сценариев применения много, и далеко не все они очевидны:

Агрегаторы новостей и контента. Самый классический случай — собрать в одном месте публикации из десятков источников. Так работают читалки, тематические дайджесты и нишевые медиа.

Мониторинг упоминаний и трендов. Отслеживание появления ключевых слов (название компании, бренда, персоны) в лентах СМИ и блогов почти в реальном времени, без задержек и ручного обхода сайтов.

Наполнение и автоматизация. Автопостинг в соцсети и Telegram-каналы, обновление витрин, подготовка контент-планов — всё это можно строить на свежих данных из лент.

Конкурентная разведка. Многие компании ведут блоги с RSS. Подписавшись на них программно, вы первыми узнаёте о релизах, статьях и анонсах.

Данные для аналитики и ML. RSS-ленты — дешёвый и чистый источник текстов для обучения моделей, анализа тональности, кластеризации тем и построения новостных графов.

Уведомления. Личные алерты на новые вакансии, объявления, посты на форумах, обновления документации.

Главное преимущество перед скрейпингом HTML — скорость разработки, стабильность и низкая нагрузка как на вас, так и на источник.

Как искать сайты и ленты с RSS

Многие сайты публикуют RSS, но не выводят кнопку на видное место. Вот рабочие способы найти ленту.

1. Метатег в HTML-коде страницы

Корректно настроенные сайты указывают ленту в <head>:

html
<link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml">
<link rel="alternate" type="application/atom+xml" title="Atom" href="/atom.xml">

Достаточно открыть исходный код страницы (Ctrl+U) и поискать application/rss+xml или application/atom+xml. Этот же тег можно вытаскивать программно при автоматическом обнаружении лент.

2. Типовые URL-адреса

Огромная часть лент лежит по предсказуемым путям. Стоит просто проверить их перебором:

code
/rss
/rss.xml
/feed
/feed.xml
/feeds
/atom.xml
/index.xml
/rss/all.xml

Отдельно стоит знать про популярные платформы:

  • WordPress: /feed/, /?feed=rss2, для рубрики — /category/название/feed/;
  • Blogger: /feeds/posts/default;
  • YouTube: https://www.youtube.com/feeds/videos.xml?channel_id=ID_КАНАЛА;
  • Reddit: к любому разделу можно добавить .rss, например /r/programming.rss;
  • Substack / Medium: /feed.

3. Поисковые операторы и сервисы

В поисковике помогают запросы вида site:example.com rss или inurl:feed site:example.com. Существуют и сервисы обнаружения лент (например, RSS.app, Feedly), которые сами находят доступные ленты по адресу сайта. Если же официальной ленты нет вовсе, некоторые инструменты генерируют RSS из обычных HTML-страниц — но это уже ближе к классическому парсингу.

Примеры реализации на разных языках

Ниже — минимальные рабочие примеры чтения ленты. Везде используются проверенные библиотеки, которые сами разбирают и RSS, и Atom, и снимают головную боль с разными версиями стандарта.

Python

Библиотека feedparser — фактический стандарт в экосистеме Python.

python
# pip install feedparser
import feedparser

feed = feedparser.parse("https://example.com/feed.xml")

print(f"Источник: {feed.feed.get('title', 'без названия')}")

for entry in feed.entries:
    print("—" * 40)
    print("Заголовок:", entry.get("title"))
    print("Ссылка:   ", entry.get("link"))
    print("Дата:     ", entry.get("published", "неизвестно"))
    print("Описание: ", entry.get("summary", "")[:200])

feedparser сам нормализует поля, поэтому entry.title и entry.link доступны независимо от того, RSS это или Atom.

JavaScript / Node.js

Пакет rss-parser удобно работает с async/await.

javascript
// npm install rss-parser
import Parser from "rss-parser";

const parser = new Parser();

async function readFeed(url) {
  const feed = await parser.parseURL(url);
  console.log(`Источник: ${feed.title}`);

  feed.items.forEach((item) => {
    console.log("—".repeat(40));
    console.log("Заголовок:", item.title);
    console.log("Ссылка:   ", item.link);
    console.log("Дата:     ", item.pubDate);
  });
}

readFeed("https://example.com/feed.xml").catch(console.error);

PHP

В PHP есть библиотека SimplePie, но для базовых задач хватает встроенного SimpleXML.

php
<?php
// Вариант без зависимостей — встроенный SimpleXML
$feed = simplexml_load_file("https://example.com/feed.xml");

echo "Источник: " . $feed->channel->title . PHP_EOL;

foreach ($feed->channel->item as $item) {
    echo str_repeat("—", 40) . PHP_EOL;
    echo "Заголовок: " . $item->title . PHP_EOL;
    echo "Ссылка:    " . $item->link . PHP_EOL;
    echo "Дата:      " . $item->pubDate . PHP_EOL;
}

Для продакшена лучше взять SimplePie (composer require simplepie/simplepie) — он умеет кэширование, обработку Atom и устойчив к «грязному» XML.

Go

В экосистеме Go популярна gofeed, понимающая оба формата сразу.

go
// go get github.com/mmcdole/gofeed
package main

import (
    "fmt"

    "github.com/mmcdole/gofeed"
)

func main() {
    fp := gofeed.NewParser()
    feed, err := fp.ParseURL("https://example.com/feed.xml")
    if err != nil {
        panic(err)
    }

    fmt.Println("Источник:", feed.Title)
    for _, item := range feed.Items {
        fmt.Println("————————————————")
        fmt.Println("Заголовок:", item.Title)
        fmt.Println("Ссылка:   ", item.Link)
        fmt.Println("Дата:     ", item.Published)
    }
}

Ruby

Гем feedjira лаконично решает задачу.

ruby
# gem install feedjira
require "feedjira"
require "httparty"

xml  = HTTParty.get("https://example.com/feed.xml").body
feed = Feedjira.parse(xml)

puts "Источник: #{feed.title}"
feed.entries.each do |entry|
  puts "—" * 40
  puts "Заголовок: #{entry.title}"
  puts "Ссылка:    #{entry.url}"
  puts "Дата:      #{entry.published}"
end

Подводные камни, о которых стоит помнить

Парсинг RSS прост, но в реальной работе всплывают нюансы:

  • Дедупликация. Одна и та же запись приходит в ленте многократно. Храните уже обработанные guid/id, чтобы не дублировать материалы.
  • Неполный контент. Часто лента отдаёт только анонс, а не полный текст. Тогда придётся дополнительно загружать страницу по ссылке и парсить её.
  • Кодировки и «грязный» XML. Не все ленты валидны. Хорошие библиотеки прощают ошибки, самописные парсеры — нет.
  • Частота опроса. Не дёргайте ленту каждую секунду. Уважайте заголовки ETag и Last-Modified, чтобы не качать одно и то же и не получить блокировку.
  • Лимиты ленты. Обычно RSS отдаёт лишь последние 10–50 записей. Историю так не собрать — нужен либо архив, либо постоянный мониторинг с накоплением.
  • Масштаб. Когда источников становятся сотни, появляется задача планировщика, очередей, мониторинга «упавших» лент и хранилища. Простой скрипт превращается в полноценную инфраструктуру.

Когда стоит доверить это профессионалам

Прочитать одну ленту — дело пяти минут. А вот собрать стабильный поток новостей с сотен источников, привести разнородные форматы к единой структуре, обеспечить дедупликацию, дозагрузку полного текста, очистку и бесперебойную работу 24/7 — это уже серьёзная инженерная задача.

Если вам нужен готовый результат, а не поддержка собственного парсинг-конвейера, обратите внимание на нашу услугу «Парсинг новостей». Мы берём на себя поиск и подключение источников (включая сайты без явного RSS), нормализацию данных, фильтрацию по вашим темам и ключевым словам и доставку чистого структурированного потока новостей в удобном формате — через API, выгрузку или прямую интеграцию в вашу систему. Вы получаете готовые данные, а всю рутину с лентами, кодировками и нестабильными источниками берём на себя мы.


RSS остаётся одним из самых эффективных способов получать данные там, где он доступен: предсказуемая структура, низкая нагрузка и быстрая разработка. Начните с поиска лент на нужных сайтах, попробуйте примеры выше на своём языке — а когда задача перерастёт рамки скрипта, вы всегда знаете, к кому обратиться.