Script en Python 3 para la creación de un Feed RSS apto para Google News

El objetivo de este tutorial es la creación de un fichero RSS.xml apto para ser cargado en google news .

¿Por qué es útil tener un fichero RSS.xml?

Básicamente por la automatización de tareas. A partir de este fichero puedes ejecutar tareas automáticas de publicación de tweets o post automáticos en Facebook.

Pueden consultar el repositorio https://github.com/al118345/rss-python dónde está almacenado el ejemplo citado en esta web. Además, tenéis el siguiente video ejemplo para su consulta https://www.youtube.com/watch?v=k8mVioEJLL8:

Estructura rss.xml

Primero de todo, un ejemplo de este fichero lo encontráis en la siguiente dirección del New York Times https://rss.nytimes.com/services/xml/rss/nyt/World.xml. Su estructura es parecida a la de la siguiente extracción:

<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:nyt="http://www.nytimes.com/namespaces/rss/2.0" version="2.0">
  <channel>
    <title>NYT > World News</title>
    <link>https://www.nytimes.com/section/world</link>
    <atom:link href="https://rss.nytimes.com/services/xml/rss/nyt/World.xml" rel="self" type="application/rss+xml"/>
    <description/>
    <language>en-us</language>
    <copyright>Copyright 2022 The New York Times Company</copyright>
    <lastBuildDate>Sat, 19 Mar 2022 09:46:36 +0000</lastBuildDate>
    <pubDate>Sat, 19 Mar 2022 09:08:28 +0000</pubDate>
    <image>
      <title>NYT > World News</title>
      <url>https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png</url>
      <link>https://www.nytimes.com/section/world</link>
    </image>
    <item>
      <title>The Battle for Kyiv Looms as a Long and Bloody Conflict</title>
      <link>https://www.nytimes.com/2022/03/19/world/europe/kyiv-ukraine-russia-war.html</link>
      <guid isPermaLink="true">https://www.nytimes.com/2022/03/19/world/europe/kyiv-ukraine-russia-war.html</guid>
      <atom:link href="https://www.nytimes.com/2022/03/19/world/europe/kyiv-ukraine-russia-war.html" rel="standout"/>
      <description>Ukraine’s capital is the biggest prize of all for the Russian military. If Russia tries to take control, it could lead to one of the biggest urban conflicts since World War II.</description>
      <pubDate>Sat, 19 Mar 2022 09:00:22 +0000</pubDate>
      <category domain="http://www.nytimes.com/namespaces/keywords/nyt_geo">Ukraine</category>
      <category domain="http://www.nytimes.com/namespaces/keywords/nyt_geo">Russia</category>
      <category domain="http://www.nytimes.com/namespaces/keywords/des">Russian Invasion of Ukraine (2022)</category>
      <category domain="http://www.nytimes.com/namespaces/keywords/des">War and Armed Conflicts</category>
      <category domain="http://www.nytimes.com/namespaces/keywords/nyt_geo">Kyiv (Ukraine)</category>
      <category domain="http://www.nytimes.com/namespaces/keywords/des">Defense and Military Forces</category>
    </item>
  </channel>
</rss>

De todos estos elementos, los principales campos que necesitamos rellenar son:
Elementos obligatoriosFunción
titleEl elemento title contiene el título del canal RSS.
linkEl elemento link contiene el enlace a la página web.
descriptionEl elemento description contiene una descripción del canal RSS.

Implementación

Con este ejemplo y toda la información recopilada se ha generado el siguiente repositorio https://github.com/al118345/rss-python que contiene el siguiente código:

# -*- coding: utf-8 -*-

from feedgen.feed import FeedGenerator
import pandas as pd
#parametros a rellenar
nombre_autor = "1938.com.es"
email=  "1938web@gmail.com"
titulo=  "Web 1938.com.es"
logo= "https://1938.com.es/assets/imagenes/logo.png " #opcional
url = "https://1938.com.es/";
descripcion ="Videos sobre la información de interes sobre el diseño de aplicaciones moviles, ciencia de datos (BigData) y tecnologías de la información"

fg = FeedGenerator()
fg.id(1)
fg.title(titulo)
fg.author(
    {"name": nombre_autor, "email": email}
)
fg.logo(logo)
fg.link(href=url, rel="self")
fg.language("es")
fg.description(descripcion)

nombre_fichero ="rss.csv"
df = pd.read_csv(nombre_fichero, sep=';' ,header=0)
for index, row in df.iterrows():
    fe = fg.add_entry(order="append")
    fe.id(row['url'])
    fe.title(row['titulo'])
    fe.content(row['tematica'])
    fe.author(
        {"name": "Rubén Pérez ", "email": "1938web@gmail.com"}
    )
    fe.link({"href":  row['url'], "title": row['titulo']})

rssfeed = fg.rss_str(pretty=True)
fg.rss_file("rss_video.xml")

Cómo veis, no tiene ningún misterio. Primero de todo hay que rellenar una parte estática cómo el nombre de la web, correo, etc.

Una vez rellenado, estos datos son utilizados para identificar el sitio web y su autor.

Posteriormente, cargamos el documento csv con la siguiente estructura
titulourltemática
Fundamentos de redes bayesianashttps://1938.com.es/redes-bayesianas matemáticas
Introducción a MongoDB. Ejemplos de consultas en documentos.https://1938.com.es/mongodbmongodb nosql

La estructura es muy simple, tres columnas con el título, url y temática. Este fichero es leído por el script para generar las diferentes entradas de forma automática.

El resultado obtenido ha sido el siguiente:

<?xml version='1.0' encoding='UTF-8'?>
<rss
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
	<channel>
		<title>1938.com.es</title>
		<link>https://1938.com.es/</link>
		<description>Videos sobre la información de interes sobre el diseño de aplicaciones moviles, ciencia de datos (BigData) y tecnologías de la información</description>
		<atom:link href="https://1938.com.es/" rel="self"/>
		<docs>http://www.rssboard.org/rss-specification</docs>
		<generator>python-feedgen</generator>
		<image>
			<url>https://1938.com.es/assets/imagenes/logo.png</url>
			<title>1938.com.es</title>
			<link>https://1938.com.es/</link>
		</image>
		<language>es</language>
		<lastBuildDate>Sat, 19 Mar 2022 10:25:30 +0000</lastBuildDate>
		<item>
			<title>Fundamentos de redes bayesianas</title>
			<link>https://1938.com.es/redes-bayesianas</link>
			<description> matematicas</description>
			<author>1938web@gmail.com (Rubén Pérez )</author>
			<guid isPermaLink="false">https://1938.com.es/redes-bayesianas</guid>
		</item>
		<item>
			<title>Introducción a MongoDB. Ejemplos de consultas en documentos.</title>
			<link>https://1938.com.es/mongodb</link>
			<description>mongodb nosql</description>
			<author>1938web@gmail.com (Rubén Pérez )</author>
			<guid isPermaLink="false">https://1938.com.es/mongodb</guid>
		</item>
	</channel>
</rss>