Scraper de datos estructurados en Python

Last Updated on mayo 8, 2024 by Álvaro

Muchas veces los plugins SEO como Yoast SEO o Rank Math son bastante limitados a la hora de crear datos estructurados. Lo mismo sucede, a mi juicio, con los típicos generadores de schema que hay por internet. Por eso, yo soy de la escuela de crear el schema de manera artesanal. Aunque tardo más, esta es la única forma que tengo de asegurarme que se tratan las propiedades que considero relevante.

Pero no creáis que soy una especie de psicópata que crea cada fragmento de datos estructurados desde 0. Obviamente tengo plantillas. Pero cuando no las tengo… pues choriceo. Y para eso desarrollé este scraper, para tomar prestados los datos estructurados de aquellas webs que los utilizan de manera correcta y que utilizan las propiedades que considero necesarias.

El proceso que sigo es el siguiente:

  1. Identifico que schema necesito.
  2. Escaneo las SERPs donde presupongo que encontraré resultados con ese schema.
  3. Selecciono los resultados que me interesan.
  4. Verifico que el schema que utilizan sea correcto en la Prueba de resultados enriquecidos de Google o en el Validador de Schema.org.
  5. Le paso el scraper a la URL elegida y extraigo el código.
  6. Modifico los valores de las propiedades y los cargo en mi CMS de confianza. (Si queréis tutorial de como los incluyo a mano en mis posts de WordPress dejádmelo en comentarios 😁 )

El código en Python del scraper

Yo lo ejecuto a través de Jupyer Notebooks porque para mí es la manera más cómoda de trabajar con pequeños scripts de Python. Si no tienes mucha experiencia en el mundo de la programación, te recomiendo hacer lo mismo.

import requests
from bs4 import BeautifulSoup
import json

def scrape_schema_org_data(url):
    # Paso 1: Obtener el HTML
    response = requests.get(url)
    html = response.text

    # Paso 2: Parsear el HTML
    soup = BeautifulSoup(html, 'html.parser')

    # Paso 3: Extraer los datos estructurados
    scripts = soup.find_all('script', type='application/ld+json')
    data_list = []
    for script in scripts:
        try:
            data = json.loads(script.string)
            data_list.append(data)
        except json.JSONDecodeError:
            continue

    return data_list

def pretty_print_json(data):
    # Imprime cada elemento JSON de la lista de manera bonita
    for item in data:
        print(json.dumps(item, indent=2, ensure_ascii=False))

# Prueba con una URL específica
url = 'https://www.sanmiguel.com/es/cervezas/san-miguel-00/'
data = scrape_schema_org_data(url)
pretty_print_json(data)

El funcionamiento es muy sencillo. Tan solo sustituye la URL de ejemplo que presento en la variable URL (ubicada al final del script), por la URL que quieras scrapear. No necesitarás hacer nada más, una vez ejecutes el script, se pintará el schema de manera estructurada.

Output del scraper.

¿Cómo crees que se podría mejorar este script? Déjamelo en los comentarios.

2 comentarios en “Scraper de datos estructurados en Python”

  1. Buenas Álvaro,
    En primer lugar agradecerte el trabajo, me ha encantando tu recurso, pero la verdad que con temas de programación, soy torpe o nulo… y estoy haciendo pruebas pero no consigo obtener resultados…
    Copio tu código y lo «lanzo» en Jupyter notebook o viscual code.. pero nada… no se si pudieras hacerme un mini resumen de como es el proceso..

    1. ¡Hola Oscar!

      Necesitaría saber qué mensaje de error te sale.

      Si has copiado y pegado directamente el código y no funciona, lo que podría estar pasando es que no tengas las librerías necesarias instaladas. Antes de ejecutar el código, escribe y ejecuta los siguientes comandos:

      pip install requests
      pip install beautifulsoup4
      pip install lxml

      Eso instalaría las librerías.

      Si no lo consigues, escríbeme a cualquiera de mis redes sociales, puedes acceder desde el menú a la que te venga mejor.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *