Создаем свой RSS-агрегатор

Создаем свой RSS-агрегатор

RSS-каналы – это одна из возможностей получать информацию об обновлениях на понравившемся сайте. Их используют не только рядовые пользователи сети Интернет, но и продвинутые web-разработчики. В данной статье мы рассмотрим, как быстро настроить и отфильтровать RSS-каналы по ключевым словам, используя Python и библиотеку Feedparser. Цель – получить данные и сократить трудозатраты.

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
Рисунок 1 — Полученные данные в формате Excel

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

22
Начать дискуссию