Время прочтения: 3 мин.

RSS (Rich Site Summary) — семейство форматов XML для описания новостных каналов, статей, изменений блогов и т.д. Данная технология экономит время и помогает получить необходимую информацию, как только она будет размещена на сайте.

В данной статье, мы разберем как написать свой RSS-агрегатор.

Давайте выясним, что такое RSS технически. Изнутри этот файл включает три структуры блоков:

  • Метаданные – заголовки, подзаголовки, изображения, описания, основной текст.
  • Гиперссылки — для чтения полной версии новостей
  • Категории статей и другие дополнительны метаданные

Принцип использования RSS-канала можно представить как беглое знакомство с оглавлением книги или просмотр газетных заголовков. Теперь информацию с сайта можно предоставить в двух видах — полная версия статьи или название с объявлением.

Для начала предлагаем разобраться в фрагменте объекта исследования.

<rss xmlns:news="/" version="2.0">
<channel>
<title>Сейчас.ру</title>
<description>Сейчас.ру</description>
<link>/</link>
<image>
<link>"/"</link>
<url>/images/logo100.gif</url>
<title>Сейчас.ру</title>
</image>
<item>
<title>
ЦИК: возможно проведение досрочного голосования по Конституции на протяжении недели
</title>
<description>
<![CDATA[
Окончательное решение по каждому региону будут принимать избирательные комиссии на местах
]]>
</description>
<pubDate>Fri, 20 Mar 2020 17:41:46 +0300</pubDate>
<link>/state/15616</link>
<category>NEWS</category>
<author>Карина Мелова</author>
<guid isPermaLink="true">/state/15616</guid>
</item>
<item>
<title>
На дорогах Подмосковья устанавливается ограничение скорости 50 км/ч
</title>
<description>
<![CDATA[
Нововведение будет действовать с 1 июня в 36 подмосковных муниципалитетах
]]>
</description>
<pubDate>Fri, 20 Mar 2020 16:23:58 +0300</pubDate>
<link>/transport/15615</link>
<category>NEWS</category>
<author>Карина Мелова</author>
<guid isPermaLink="true">/transport/15615</guid>
</item>
…
</channel>
</rss>

В данном случае, мы получаем такие данные:

  • Наименование источника: Сейчас.ру
  • Ссылка на канал: https://www.lawmix.ru/
  • Заголовок: ЦИК: возможно проведение досрочного голосования по Конституции на протяжении недели
  • Описание: Окончательное решение по каждому региону будут принимать избирательные комиссии на местах.
  • Ссылка на новость: https://www.lawmix.ru/state/15616
  • Время публикации: Fri, 20 Mar 2020 17:41:46 +0300.

Мы же будем приводить в более удобный для нас вид дату публикации и скачивать метаданные в виде файла Excel в формат xlsx. Так же статья имеет и другие метаданные которые нам не интересны (автора и категорию статьи).

Для начала работы нам нужно импортировать необходимые нам библиотеки.

import feedparser
import pandas as pd
import re

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

df = pd.DataFrame(columns=['Наименование источника', 'Ссылка на канал', 'Заголовок', 'Описание', 'Ссылка на новость', 'Дата новости'])

sites = ['http://www.lawmix.ru/rss.php', 'https://www.mk.ru/rss/index.xml']

words = [r'\bВтор\S*', r'\bРосси\S*', r'\bСША\S*', r'\bГерман\S*', r'\bТурц\S*', r'\bУкраин\S*', r'\bРФ\S*']

Теперь приступим к добыванию информации с rss-ссылок и обработке каждой статьи.

for site in sites: 
    d = feedparser.parse(site)
    print("\nИдет работа с сайтом: ", site)
    d.feed.title = (d.feed.title).replace('<![CDATA[ ','')
    print("Наименование канала: \"", (d.feed.title).replace(']]>',''), "\"")
    print('Кол-во постов (всего):', len(d.entries))

for post in range(0,len(d.entries)):
        for word in words:
            kol_posts_site+=1
            match1 = re.search(word.lower(), (d.entries[post].description).lower())
            match2 = re.search(word.lower(), (d.entries[post].title).lower())
            if match1 or match2:
                df.loc[post]=[d.feed.title,d.feed.link,d.entries[post].title,d.entries[post].description,d.entries[post].link,d.entries[post].published] 
                break

df.drop_duplicates(['Описание'],inplace=True)
df.reset_index(inplace=True) 
del df['index'] 
df.to_excel('RSS_stat.xlsx')

В конечном счете, мы добыли информацию с сайтов, при помощи RSS.

Рисунок 1 — Полученные данные в формате Excel

Теперь мы можем оформить их в любом удобном для нас виде и использовать в дальнейшем.