Cómo crear un Sitemap con Python

Como sabrás, los sitemaps son una parte importante de cualquier sitio web o aplicación. Un sitemap es una lista útil de todas las páginas que forman parte de un sitio web y ayuda a los motores de búsqueda a rastrearlas indicando su estructura interna. Este blog se centra en mostrarte cómo crear un sitemap que incluirá páginas dinámicas.

Antes de comenzar, ¿Qué es el contenido dinámico? Es el tipo de contenido que adapta constantemente su información de acuerdo con la forma en que el usuario interactúa con la página; usando algunos parámetros que determinan el contenido que se muestra.

En esencia, tienes una página que puede cargar diferentes tipos de información; por ejemplo, una página de usuario que recibe parámetros como user_id o slug_user ((https://mysite.com/user/123 o https://www.mysite.com/users?user_id=123 o https://www.mysite.com/user/user_example).).

Aunque esta información cambia continuamente, es posible que desee agregarlos a su sitemap. Es importante tener en cuenta que esto no afectará sus clasificaciones, pero definitivamente puede ayudar a los motores de búsqueda a rastrear esas páginas y hacer que sea más fácil indexarlas.

Empecemos...

1. Usaremos python 3.x, MySQL, Linux, algunos módulos de python (incluidos a continuación) y su hoja de estilos XSL para su archivo XML es opcional.

2. En nuestro script python, incluiremos los módulos que vamos a necesitar, por lo que la forma más sencilla de instalarlos es a través de pip. Puede instalar pip con el siguiente comando:

¿Cómo uso el comando pip?

Para instalar el nuevo tipo de paquete python:

 pip install <packageName> 

Para desinstalar el paquete de Python instalado por tipo de pip:

 pip uninstall <packageName> 

entonces esto es lo básico sobre PIP.

3. Luego, cuando tengamos instalado pip, vamos a instalar los siguientes paquetes:
MySQLdb.
xml.
lxml.
StringIO.
datetime.

3.1 Y vamos a importar estos módulos en nuestro script python.

python script for sitemap

*Nota: no se requiere que sys se instale a través de PIP. Las bibliotecas de Python también incluyen este módulo.

[ import MySQLdb
import xml.etree.cElementTree as ET
from lxml import etree
import datetime
import sys
from xml.dom import minidom
from xml.dom.minidom import parse
from StringIO import StringIO ]

4. A continuación vamos a hacer una función que nos ayudará a obtener los productos de nuestra base de datos (DB).

[def get_products():
    db = MySQLdb.connect(host='yourhost', port=3306,
                         user='youruser', passwd='somRanD0mPass',
                         db='yourDB')

    cursor = db.cursor()

    sql = \
        """
      select product_id from products where status = 1;
    """

    try:
        cursor.execute(sql)
        results = cursor.fetchall()
        products = []
        for result in results:
                products.append('https://www.mysite.com/products/'
                             + str(result[0]))
    except (RuntimeError, TypeError, NameError):
        print RuntimeError + TypeError + NameError
    db.close()
    return products]
dynamic content sitemap python

Aquí está la explicación de este fragmento de código:

Nuestra variable DB recibe el objeto MySQLdb.connect; dentro de esa función, vamos a configurar sus parámetros de acuerdo con su autenticación de base de datos, como un host, puerto, usuario, contraseña y su base de datos. A continuación, declaramos otra variable que recibirá el objeto db.cursor que nos ayudará a administrar la conexión DB actual. Luego informamos nuestra consulta SQL, en este caso, tenemos en nuestro sistema que los productos de la página solo reciben el product_id almacenado en nuestra base de datos.

*Importante:* tenemos que declarar try catch clause

5. Luego usamos el objeto del cursor con el método de ejecución y pasamos la variable de texto de consulta SQL, en la siguiente línea la variable de resultados obtiene todos los productos obtenidos de nuestra consulta; para esto, vamos a necesitar una matriz para almacenar la información.

5.1 A continuación usamos un for loop para recorrer cada producto en el objeto de resultados, de modo que la función products.append nos permite agregar el resultado a la matriz de productos. En este caso, agregamos la URL al concatenar la identificación del producto, puede ver el resultado [0] que es la identificación del producto.

5.2 Ahora, la cláusula except es nuestro método de captura que sigue a nuestro try, en python usamos el try: except. Los parámetros que esta cláusula recibe son el momento en que ocurre el error, el tipo de error y el error del nombre, esto es para fines de depuración, y luego imprimimos las variables de error.

5.3 Si hay un error, cerramos la conexión DB y devolvemos la matriz de productos que contiene las URL de los productos.

6. El siguiente caso es sobre la misma función, pero simplemente cambia el formato de URL que se realizará para las categorías que reciben slug_url.

[def get_categories():
    db = MySQLdb.connect(host='yourhost', port=3306,
                         user='youruser', passwd='somRanD0mPass',
                         db='yourDB')
    cursor = db.cursor()
    sql = \
        """
      select slug_url from categories;
    """
    try:
        categories = []
        cursor.execute(sql)
        results = cursor.fetchall()
        for result in results:
          categories.append('https://www.mysite.com/categories/'
                             + str(result[0]))
    except (RuntimeError, TypeError, NameError):
        print RuntimeError + TypeError + NameError
    db.close()
    return categories]
python sitemap

Aquí hay un ejemplo del tipo de URL: https://www.mysite.com/categories/example_category
Entonces, la explicación al respecto es la misma que la anterior.

7. Además, podemos tener URL adicionales o estáticas como: sobre la página, contáctanos, etc.
e. g. https://www.mysite.com/about_us o https://www.mysite.com/contact_us.. Entonces, haremos esto escribiendo el siguiente código:

dynamic content sitemap

*Esto es útil para ese contenido que no proviene de DB.

[def get_extras():
    extras = []
    extras.append('https://www.mysite.com/about_us')
    extras.append('https://www.mysite.com/contact_us')
    return extras]

8. Estamos en la parte difícil. Aquí vamos a crear la función que analizará todos los datos en formato XML según lo requiera python XML.

[def create_sitemap(categories, products, extras):
    try:
        root = ET.Element('urlset')
        root.attrib['xmlns:xsi']="http://www.w3.org/2001/XMLSchema-instance"
        root.attrib['xsi:schemaLocation']="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
        root.attrib['xmlns']="http://www.sitemaps.org/schemas/sitemap/0.9"
        
        dt = datetime.datetime.now().strftime ("%Y-%m-%d")
        doc = ET.SubElement(root, "url")
        ET.SubElement(doc, "loc").text = "https://www.mysite.com/"
        ET.SubElement(doc, "lastmod").text = dt
        ET.SubElement(doc, "changefreq").text = "weekly"
        ET.SubElement(doc, "priority").text = "1.0"
        for product in products:
          doc = ET.SubElement(root, "url")
          ET.SubElement(doc, "loc").text = product
          ET.SubElement(doc, "lastmod").text = dt
          ET.SubElement(doc, "changefreq").text = "weekly"
          ET.SubElement(doc, "priority").text = "0.8"

        for category in categories:
          doc = ET.SubElement(root, "url")
          ET.SubElement(doc, "loc").text = category
          ET.SubElement(doc, "lastmod").text = dt
          ET.SubElement(doc, "changefreq").text = "weekly"
          ET.SubElement(doc, "priority").text = "0.6"

        for extra in extras:
          doc = ET.SubElement(root, "url")
          ET.SubElement(doc, "loc").text = extra
          ET.SubElement(doc, "lastmod").text = dt
          ET.SubElement(doc, "changefreq").text = "weekly"
          ET.SubElement(doc, "priority").text = "0.5"

        
        tree = ET.ElementTree(root)

        tree.write('sitemap.xml', encoding='utf-8', xml_declaration=True)
        return True
    except (RuntimeError, TypeError, NameError):
        print RuntimeError + TypeError + NameError
        return False]
sitemap using python
8.1 En este fragmento de código creamos el archivo XML y asignamos las etiquetas correctas para nuestro sitemap. Verás en las primeras líneas:
create dynamic content sitemap

Esto agregará las siguientes etiquetas XML a nuestro sitemap:

[<?xml-stylesheet type="text/xsl" href="sitemap.xsl"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">]

8. 2 La variable "dt" obtiene el tiempo real en formato año-mes-día, y se agregará a cada bloque XML.
El "doc = ET.SubElement (root," url ")" especifica un nuevo bloque xml que contendrá la siguiente información.

ET.SubElement(doc, "loc").text = "https://www.mysite.com/"
        ET.SubElement(doc, "lastmod").text = dt
        ET.SubElement(doc, "changefreq").text = "weekly"
        ET.SubElement(doc, "priority").text = "1.0"

Este código es para la URL principal, que contendrá la URL como loc (location), la fecha y hora como lastmod (last modification), semanalmente como changefreq (change frequency). El nivel de prioridad, en este caso, es 1.0, dependerá de sus criterios.

8.3 Las siguientes líneas crean la misma estructura, incluidas las matrices que contienen toda nuestra información obtenida de nuestro DB. Además, el resultado será un archivo llamado sitemap.xml que tendrá la siguiente estructura básica.

phython sitemap 2
[<?xml-stylesheet type="text/xsl" href="sitemap.xsl"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
	<url>
		<loc>https://www.mysite.com/</loc>
		<lastmod>2016-11-03</lastmod>
		<changefreq>weekly</changefreq>
		<priority>1.0</priority>
	</url>
	<url>
		<loc>https://www.mysite.com/products/1</loc>
		<lastmod>2016-11-03</lastmod>
		<changefreq>weekly</changefreq>
		<priority>0.8</priority>
	</url>]

9. Ahora vamos a crear nuestra función principal que llamará a los otros métodos, los que ya vemos.

[if __name__ == '__main__':
    categories = get_categories()
    products = get_products()
    extras = get_extras()
    created=create_sitemap(categories, products, extras)
    if created==True:
      print "created"
      add_styleshet()
      prettyPrintXml("./sitemap.xml")
    else:
      print "failed"]
sitemap with python

Primero, verás las categorías de variables, productos y extras, recibirán las matrices de sus respectivas funciones. A continuación, invocaremos la función create_sitemap y pasaremos las variables para analizarlas y agregarlas a nuestro archivo XML denominado "sitemap.xml". En este punto, tenemos una condición, en caso de que el mapa del sitio haya sido creado o no. También tenemos dos funciones más, "add_stylesheet" y "prettyPrintXml". Estos serán opcionales, porque si ya tiene una hoja de estilo para su archivo XML, le recomiendo que la agregue y también que imprima su archivo XML.

Aquí está el código para ambas funciones:

[
def prettyPrintXml(xmlFilePathToPrettyPrint):
    assert xmlFilePathToPrettyPrint is not None
    parser = etree.XMLParser(resolve_entities=False, strip_cdata=False)
    document = etree.parse(xmlFilePathToPrettyPrint, parser)
    document.write(xmlFilePathToPrettyPrint, pretty_print=True, encoding='utf-8')
]
create sitemap with python

Esta función nos ayudará a formatear el archivo XML de forma legible.

[def add_styleshet():
    doc = parse('sitemap.xml')
    pi = doc.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="sitemap.xsl"')
    doc.insertBefore(pi, doc.firstChild)
    file = open('sitemap.xml', 'w')
    file.write(doc.toprettyxml())
    file.close()]
xml sitemap file

Si tiene su archivo XSL para agregar estilo al archivo XML, simplemente reemplace el nombre en la segunda línea en la etiqueta href, tan fácil como eso.

Conclusión:

Como vimos, en este blog hemos aprendido cómo crear nuestro archivo de sitemap para contenido dinámico que se registró previamente en nuestra base de datos. Este tipo de archivos son muy útiles para indexar completamente nuestro sitio y obtener más visitas con una mejor clasificación en Google o en cualquier motor de búsqueda.

Otro consejo para recomendar es, establecer correctamente las metaetiquetas para la descripción, el título y las palabras clave de la página; y así dejar que nuestros visitantes vean cómo es en un breve resumen el contenido principal de la misma.

Aquí hay un ejemplo para ver cómo se indexan el título y la descripción en Google.

sitemap to index dynamic content

Ahora que sabes cómo hacerlo, espero que lo apliques de inmediato, ya que es una parte esencial de tu práctica de SEO. En unos días publicaré más sobre una mejor gestión de SEO en nuestros sistemas. Recuerda que un mejor SEO significa más visitantes y que ClickIT siempre es tu mejor opción cuando se trata de servicios de TI. ¡Contáctanos!

Convertimos las ideas en código

Olvídate de los procesos de desarrollo sin fin y permítenos hacer el trabajo difícil.

Leave a Reply

Your email address will not be published.

Google Analytics Alternative