Scraping web enfocado a SEO: Técnicas, Herramientas y Flujo con LLMs

scrap seo

En el mundo del SEO técnico, web scraping se ha convertido en una herramienta esencial para recolectar datos a gran escala. El scraping consiste en extraer información de sitios web de forma automatizada, permitiendo monitorear resultados de búsqueda, analizar la competencia, rastrea enlaces y mucho más. Por ejemplo, los SEO pueden extraer las posiciones de sus palabras clave en Google, recopilar los contenidos de sitios competidores o auditar millones de páginas en busca de errores, todo de manera eficiente.

Ahora bien, el scraping web presenta desafíos: los sitios pueden tener contenido dinámico que requiere ejecutar JavaScript, o protecciones anti-scraping (CAPTCHAs, bloqueos por IP, rate limiting).

En este artículotécnico, vermos técnicas tradicionales de scraping con Python (usando librerías como Requests/BeautifulSoup, Selenium, Playwright, Scrapy), así como herramientas modernas potenciadas con IA (como Crawl4AI, ScrapeGraph AI, Jina AI Reader y servicios especializados como SerpAPI). También veremos un flujo detallado de scraping con Python integrado con LLMs (por ejemplo, GPT o Claude) para extraer información estructurada de páginas web, y cómo este enfoque aprovecha modelos de lenguaje para interpretar contenido.

Técnicas tradicionales de scraping con Python

En el ecosistema Python existen métodos clásicos y ampliamente probados para realizar scraping. Estas técnicas requieren programar la extracción de datos definiendo qué elementos del HTML nos interesan y manejando manualmente los posibles obstáculos (paginación, contenido dinámico, etc.). A continuación, describimos las principales.

1. Requests + BeautifulSoup (scraping HTML estático)

Para páginas con contenido estático (que no requieren ejecutar JavaScript para mostrar los datos), la combinación de Requests (o librerías similares como httpx o urllib3) con BeautifulSoup es una solución sencilla y efectiva. Requests permite descargar el HTML de la página como si fuéramos un navegador, y BeautifulSoup4 (BS4) es una librería que facilita parsear el HTML y navegar por su estructura DOM para extraer la información deseada. Es una técnica ligera y rápida, ideal para sitios que no tienen protección anti-bot agresiva.

Ventajas: Es fácil de implementar y no requiere mucho overhead. Con unas pocas líneas se obtiene el HTML y se busca en él por etiquetas, clases o identificadores. BeautifulSoup proporciona métodos como find() o select() (que acepta selectores CSS) para localizar elementos. Por ejemplo, se puede extraer el título de una página o una lista de enlaces sin complicaciones.

Desventajas: No puede manejar contenido dinámico generado por JavaScript, ya que solo ve el código HTML inicial. Además, cuando la página a extraer es compleja, a veces hace falta escribir reglas de parsing muy precisas o expresiones regulares para llegar al dato correcto. De hecho, BeautifulSoup es una herramienta tradicional que requiere reglas complejas y regex para extraer datos de forma fiable. Si el HTML cambia con frecuencia (por rediseños del sitio), el scraper puede romperse, lo que implica mantenimiento continuo.

A continuación, un ejemplo simple de scraping con Requests + BeautifulSoup en Python. Supongamos que queremos obtener los títulos de los resultados orgánicos de una búsqueda en Google (ignorando que Google bloquea scrapers directamente, es solo ilustrativo):

import requests

from bs4 import BeautifulSoup

url = "https://www.google.com/search?q=ejemplo+de+busqueda+SEO"

headers = {"User-Agent": "Mozilla/5.0"}  # cabecera para emular un navegador

resp = requests.get(url, headers=headers)

html = resp.text

soup = BeautifulSoup(html, "html.parser")

results = soup.select('h3')  # Google pone los títulos en <h3>

for idx, r in enumerate(results, start=1):

    print(f"Resultado {idx}: {r.get_text()}")

En este código, hacemos una solicitud HTTP GET al URL de búsqueda (añadiendo un User-Agent para no parecer un bot trivial), parseamos el HTML resultante con BeautifulSoup, y luego seleccionamos todos los elementos <h3> que en la página de resultados de Google corresponden a los títulos de cada resultado. Finalmente, imprimimos el texto de esos títulos. En un contexto real, Google suele detectar y bloquear scrapers no autorizados, pero este ejemplo demuestra la mecánica básica.

Para otro escenario, por ejemplo extraer datos de una página de producto, podríamos buscar por el identificador o clase de los elementos de precio, nombre, disponibilidad, etc., usando métodos similares. La clave está en inspeccionar el HTML objetivo (usando herramientas de desarrollador en el navegador) para identificar patrones que nuestro código pueda buscar.

2. Selenium (navegación con navegador real)

Cuando nos enfrentamos a sitios web con contenido dinámico (JS) o interacciones complejas (scroll infinito, clics, etc.), necesitamos simular un navegador real. Selenium es la solución clásica para esto. Selenium controla un navegador (Chrome, Firefox, etc.) mediante un WebDriver, permitiendo cargar páginas completas, ejecutar JavaScript y obtener el DOM resultante tras la renderización. Podemos incluso interactuar: hacer clic en botones, rellenar formularios, navegar a la siguiente página, etc., todo de forma automatizada.

Ventajas: Podemos extraer prácticamente cualquier contenido que un usuario humano pueda ver en pantalla, incluyendo los que requieren login (proporcionando credenciales) o paginación vía clics. Selenium es compatible con múltiples lenguajes (Python, Java, C#, etc.), aunque en SEO técnico Python es muy popular. En Python, librerías como selenium junto con un driver de Chrome headless (sin interfaz gráfica) nos permiten obtener el HTML completamente procesado.

Desventajas: Es más pesado y lento. Cada página implica iniciar una instancia de navegador que consume más recursos que una simple petición HTTP. Esto hace que escalabilidad sea menor (scrapear cientos de miles de páginas con Selenium puede ser muy lento comparado con soluciones más livianas). También requiere instalar drivers y manejar posibles incompatibilidades de versiones. Además, algunos sitios detectan navegadores automatizados por su “fingerprint” (aunque existen técnicas para evadir detección).

Veamos un ejemplo abreviado usando Selenium en Python para extraer el mismo tipo de información (títulos de resultados de búsqueda). Este ejemplo asume que tenemos ChromeDriver instalado y en PATH, y usaremos Chrome en modo headless:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# Configurar opciones de Chrome en modo headless

options = Options()

options.headless = True  # ejecutar sin ventana gráfica

options.add_argument("--no-sandbox")

options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(options=options)

driver.get("https://www.google.com/search?q=ejemplo+de+busqueda+SEO")

# Esperar a que carguen los resultados (podríamos usar WebDriverWait si fuera necesario)

titles = driver.find_elements(By.TAG_NAME, "h3")

for t in titles:

    print("Título:", t.text)

driver.quit()

En este código, inicializamos Chrome de forma invisible, navegamos a la URL de búsqueda, y luego usamos find_elements para obtener todos los elementos <h3> por tag (similar a lo que hicimos con BS4). Selenium se encargó de que cualquier contenido dinámico (como carga de JavaScript para resultados adicionales) se ejecutara antes de obtener los elementos. Al final cerramos el navegador con quit().

Este mismo método se puede aplicar a cualquier sitio. Por ejemplo, para extraer datos de un competidor que carga productos al hacer scroll, podríamos en Selenium simular el scrolling y seguir recolectando elementos. También es útil para sitios que protegen contenido hasta que se ejecuta cierto script (por ejemplo, frameworks frontend tipo React).

3. Playwright (navegación headless más moderna)

Playwright es una librería más reciente (desarrollada por Microsoft) que, al igual que Selenium, permite controlar navegadores (Chrome, Firefox, Safari) de forma automatizada. Playwright ha ganado popularidad porque ofrece mejor rendimiento y un API más moderno, con soporte nativo para JavaScript asíncrono, interceptación de red, etc. Además, soporta múltiples lenguajes (en Python, a través de playwright-python) y puede lanzar navegadores headless fácilmente.

En contexto SEO, Playwright puede usarse como reemplazo de Selenium para scraping de sitios complejos o anti-bots. Tiene la ventaja de manejar detalles como espera automática de elementos (auto-wait) y puede emular múltiples dispositivos o usuarios con menos configuración que Selenium.

Ejemplo básico con Playwright en Python (usando su modo síncrono para simplicidad) para extraer, digamos, la meta descripción de una página (contenido dentro de <meta name=»description»>):

# pip install playwright && playwright install

from playwright.sync_api import sync_playwright

with sync_playwright() as p:

    browser = p.chromium.launch(headless=True)

    page = browser.new_page()

    page.goto("https://www.ejemplo.com/articulo.html")

    # Extraer el contenido del meta description

    description = page.locator("meta[name=description]").get_attribute("content")

    print("Meta descripción:", description)

    browser.close()

Este fragmento inicia un navegador Chromium headless, navega a una URL dada, y usa un selector CSS (meta[name=description]) para encontrar el elemento meta description, obteniendo su atributo content. Playwright se encarga de esperar a que la página cargue completamente antes de interactuar, lo que simplifica el código.

Comparado con Selenium: Playwright suele ser más rápido y confiable en entornos modernos. Selenium ha sido la herramienta clásica por años, pero muchos SEO técnicos están migrando a Playwright por su eficiencia. Además, Playwright tiene características útiles como interceptar peticiones (por ejemplo, para bloquear trackers o anuncios durante el scraping, reduciendo ruido) y browser context isolation (puedes lanzar varias instancias independientes para simular múltiples usuarios concurrentes de forma más sencilla que con Selenium).

4. Scrapy (framework de crawling escalable)

Para proyectos de scraping masivo, Python ofrece Scrapy, un framework orientado a desarrollar crawlers completos. A diferencia de BeautifulSoup+Requests, Scrapy maneja la concurrencia, la cola de URLs por visitar y muchas funciones out-of-the-box (respeta robots.txt si se configura, permite rotar user-agents o proxies fácilmente, exportar datos a CSV/JSON, etc.). Scrapy es ideal si queremos crawlear un sitio entero o un listado grande de URLs con alta eficiencia.

Ventajas: Muy eficiente en la descarga de múltiples páginas en paralelo gracias a su motor asíncrono. Ofrece una estructura organizada: defines Spiders (arañas) con métodos para parsear las respuestas y generar nuevas solicitudes. Tiene middleware para gestionar cookies, proxies, manejo de errores, etc. Muchas empresas lo usan para proyectos de data mining en web.

Desventajas: Tiene una curva de aprendizaje mayor que simplemente usar Requests. Requiere pensar en términos de un framework (similar a cómo Django lo es para la web) y estructurar el proyecto. Además, no maneja JavaScript por defecto. Si necesitamos JS, hay que integrar herramientas como Splash (un servidor headless que se comunica con Scrapy) o combinar Scrapy con Playwright (existe Scrapy Playwright). Esto añade complejidad.

Un ejemplo muy simplificado (no ejecutable directamente aquí por brevedad) de un Spider Scrapy para, digamos, extraer los títulos y precios de productos de una categoría en un e-commerce:

# Un Spider Scrapy teórico

import scrapy

class ProductosSpider(scrapy.Spider):

    name = "productos"

    start_urls = ["https://tienda.com/categoria/productos?page=1"]

    def parse(self, response):

        # Extraer productos de la página actual

        for producto in response.css(".producto"):

            titulo = producto.css("h2::text").get()

            precio = producto.css(".precio::text").get()

            yield {"titulo": titulo, "precio": precio}

        # Seguir al siguiente paginado si existe

        next_page = response.css("a.siguiente::attr(href)").get()

        if next_page:

            yield response.follow(next_page, callback=self.parse)

En este pseudo-código, el Spider comienza en la página 1 de una categoría. En parse(), usamos selectores CSS para cada producto (asumiendo que cada producto tiene clase .producto, etc.), y hacemos yield de un diccionario con título y precio – Scrapy se encargará de colectar estos resultados. Luego vemos si hay un enlace de página siguiente y en tal caso generamos una nueva request (response.follow) para continuar la extracción. Scrapy manejará la cola de páginas automáticamente. Este ejemplo ilustra la potencia de Scrapy para crawling profundo.

En resumen, las técnicas tradicionales con Python nos dan un control granular. BeautifulSoup y Requests son geniales para tareas sencillas o sitios estáticos; Selenium/Playwright nos permiten llegar a donde un navegador llega (dinámico, interactivo) a cambio de más costo computacional; Scrapy es la opción para escalar a miles o millones de páginas con eficiencia, siempre que la web destino no requiera mucho JavaScript. Como nota, muchas veces se combinan estas herramientas: por ejemplo, usar Selenium solo para obtener el HTML inicial de una página con JS y luego pasar ese HTML a BeautifulSoup para el parsing, reduciendo la complejidad.

Antes de pasar a herramientas más modernas, cabe mencionar que la comunidad SEO técnico ha abrazado estas técnicas. Expertos como Hamlet Batista (pionero del SEO con Python) enfatizaban que Python ayuda a eliminar tareas SEO repetitivas mediante la automatización. Muchos de los procesos que antes se hacían manualmente (como revisar cada ficha de producto de la competencia) hoy se automatizan con scrapers personalizados, liberando tiempo para el análisis estratégico.

Herramientas de scraping potenciadas con IA

En los últimos años han surgido nuevas herramientas y librerías que combinan scraping tradicional con capacidades de Inteligencia Artificial (particularmente Large Language Models o LLMs). Estas herramientas buscan simplificar la extracción de datos y hacerla más inteligente, por ejemplo, estructurando la información automáticamente o integrándose con flujos de Retrieval-Augmented Generation (RAG) para alimentar modelos tipo GPT. Aquí revisaremos algunas destacadas, incluyendo opciones gratuitas y de pago, enfocadas en casos de uso SEO.

1. Crawl4AI (Open-source, LLM-friendly crawler)

Crawl4AI es un proyecto de código abierto (licencia Apache 2.0) creado en 2023, pensado desde cero para ser “LLM-friendly”. Es esencialmente un crawling framework optimizado para obtener contenido web en formato apto para modelos de lenguaje. Bajo el capó utiliza Playwright para renderizar páginas (de forma asíncrona, soportando Python async), y luego convierte el contenido a un formato limpio, por ejemplo Markdown, reduciendo la paja (navegación, scripts) y conservando la información textual principal.

Características clave: Es muy veloz y flexible, soportando diferentes estrategias de rastreo y segmentación de contenido. Por ejemplo, permite particionar el contenido en chunks (trozos) óptimos para enviarlos a un LLM, o usar estrategias de crawling BFS/DFS (anchura/profundidad) según convenga. También ofrece un API local (vía FastAPI) para lanzar tareas de scraping y recuperar resultados, y puede ejecutar JavaScript en página. Según su documentación, ofrece estrategias avanzadas de fragmentación y extracción, y soporta la ejecución de scripts JS en las páginas.

Uso: Se instala vía pip install crawl4ai y luego se puede usar programáticamente o ejecutando un servidor de crawling. Un ejemplo de uso sencillo podría ser:

# Ejemplo de uso de Crawl4AI a través de su API local

import requests

# Suponiendo que Crawl4AI está corriendo en http://localhost:11235

job = {"urls": ["https://www.example.com"], "priority": 10}

response = requests.post("http://localhost:11235/crawl", json=job)

task_id = response.json().get("task_id")

# Esperar a que la tarea termine

result = requests.get(f"http://localhost:11235/task/{task_id}")

data = result.json()

print(data.keys())

En este flujo, enviamos una solicitud POST al endpoint de Crawl4AI con la URL que queremos scrapear. La respuesta inicial nos da un task_id de la tarea encolada. Luego hacemos polling al endpoint de la tarea hasta que esté completa. El resultado (data) podría contener la página en markdown, texto extraído u otro formato según la configuración. Este enfoque es útil porque podemos levantar un servicio de scraping y consultarlo desde distintos scripts.

Integrar Crawl4AI en SEO nos permitiría, por ejemplo, crawlear el sitio de un competidor entero y obtener su contenido limpio listo para analizar con un LLM (por ejemplo preguntarle al modelo: «¿Qué categorías de productos ofrece este competidor y cuáles destacan?»). Al ser open-source, no tiene coste directo, pero requiere infraestructura propia si vamos a procesar muchos sitios, y conocimiento técnico para su despliegue. Es relativamente nuevo, pero ha ganado miles de estrellas en GitHub en poco tiempo, indicando gran adopción en la comunidad de IA.

2. ScrapeGraph AI (scraping con lógica de grafos y LLM)

ScrapeGraph AI es una librería Python también open-source (MIT) que combina scraping web con la construcción de grafos de conocimiento e integración de LLMs para procesar esos datos. Fue diseñada para simplificar la extracción y estructuración de datos tanto de la web como de documentos locales (HTML, JSON, Markdown, etc.). Su enfoque es permitir definir pipelines de scraping declarativas, donde se pueden encadenar pasos que involucren llamadas a modelos de lenguaje para interpretar o resumir datos.

Características: Soporta múltiples LLMs como backend (OpenAI GPT-4, Azure, modelos locales vía Ollama, etc.), y ofrece pipelines ya hechas como SmartScraperGraph (scraping inteligente con LLM), SearchGraph (combina búsqueda + scraping) o SpeechGraph (incluso lectura de texto a voz). En esencia, uno puede plantear una consulta en lenguaje natural y una fuente, y ScrapeGraph se encarga de obtener la info y devolverla estructurada usando el LLM. Esto es potente para preguntas del tipo: «Dame los 10 productos más baratos de X categoría en tal sitio con sus precios» – ScrapeGraph podría buscar en el sitio y usar GPT para extraer justo esos datos y retornarlos en JSON.

Uso: Se instala con pip install scrapegraphai (requiere también instalar Playwright como dependencia para el navegador headless). Un ejemplo adaptado de su documentación para usar SmartScraperGraph sería:

from scrapegraphai.graphs import SmartScraperGraph

graph_config = {

    «llm»: {

        «model»: «openai/gpt-3.5-turbo»,  # modelo LLM a usar

        «api_key»: «TU_API_KEY»,

        «temperature»: 0,

        «format»: «json»

    }

}

prompt = «Lista los 5 principales titulares de noticias en example.com y sus URLs»

smart_graph = SmartScraperGraph(prompt=prompt, source=»https://www.example.com», config=graph_config)

result = smart_graph.run()

print(result)

Fuente: Este código está basado en los ejemplos de la documentación oficial. En él, definimos una configuración donde indicamos qué modelo LLM usar (por ejemplo, GPT-3.5 de OpenAI, con su API key), fijamos temperature=0 para respuestas deterministas y pedimos formato JSON. Luego instanciamos SmartScraperGraph pasando un prompt en lenguaje natural y la URL fuente. Internamente, ScrapeGraph navegará la URL, posiblemente haciendo varias peticiones si es necesario, y usará el modelo para interpretar el contenido y formatearlo. El resultado result idealmente sería una lista de objetos JSON con campos como titular y URL.

ScrapeGraph se destaca en casos donde la información que buscas no está simplemente en un solo selector CSS, sino que requiere cierta comprensión. Para SEO, esto puede ahorrar tiempo al no tener que codificar muchas reglas específicas para cada sitio. Por ejemplo, para extraer preguntas frecuentes de distintos blogs, podrías dar un prompt genérico «Extrae las preguntas frecuentes y respuestas de esta página» y el LLM entenderá el contexto (siempre que el prompt esté bien diseñado y el modelo sea competente).

Limitaciones: Aunque suena mágico, depende de las capacidades del LLM y consume tokens, lo cual tiene coste (si usas la API de OpenAI, por ejemplo). Además, hay que tener cuidado de validar lo que el modelo devuelve, ya que podría cometer errores o alucinar datos si el prompt no está bien acotado. En entornos críticos se recomienda verificar la salida. Aun así, ScrapeGraph es una pieza interesante para automatizar tareas de scraping + análisis en un solo paso.

3. Jina AI Reader (extracción de datos estructurados)

Jina AI Reader (también llamada solo Jina Reader) es un componente de la plataforma Jina AI enfocado en extraer texto de páginas web o PDFs y formatearlo de manera útil, por ejemplo en Markdown enriquecido con enlaces, listo para alimentar a un LLM. No es exactamente un crawler completo (no hará múltiples saltos entre páginas), sino más bien una herramienta para limpiar y estructurar una página individual.

Según un análisis de herramientas de 2024, el Reader de Jina es un servicio gratuito de última generación que provee markdown bien estructurado a partir de páginas web y PDFs, muy elogiado por su facilidad de uso y alta calidad de resultados . A diferencia de construir tu propio parser con BeautifulSoup, aquí un servicio (en la nube o local, Jina ofrece ambos modos) se encarga de quitar todo el HTML innecesario, convertir los enlaces a formato Markdown, preservar la jerarquía de títulos, etc. El resultado es similar a un documento Markdown legible que representa el contenido principal de la página.

Uso: Para usar Jina Reader, se puede utilizar su API REST en la nube (Jina ofrece un endpoint al que le pasas la URL y devuelve el markdown), o instalar el paquete jina con el módulo de reader (pip install jina[reader]). Internamente, Jina Reader aprovecha técnicas de neural search y NLP para identificar contenido relevante. Un ejemplo simplificado utilizando Jina en Python:

from jina import Flow, Document

flow = Flow().add(uses='jinahub://TextReader')  # cargar el componente Reader

urls = ["https://www.example.com"]

docs = [Document(uri=url) for url in urls]

with flow:

    results = flow.post(on='/', inputs=docs, return_results=True)

    for doc in results:

        markdown_text = doc.text

        print(markdown_text[:500])  # imprimir primeros 500 caracteres del markdown

Este código crea un flujo de Jina con el TextReader (componente de Jina Hub) y procesa una lista de Documentos con URIs (las URLs objetivo). Al ejecutar el flujo (flow.post), cada documento es enriquecido con su text en formato markdown extraído. La salida markdown_text contendrá por ejemplo el título del artículo como # Título, subsecciones con ##, los párrafos en texto plano, etc., y enlaces marcados con [texto del enlace](url). Es una forma rápida de obtener contenido limpio y estructurado.

Aplicaciones SEO: Jina Reader es útil para alimentar modelos o algoritmos sin meter ruido. Por ejemplo, si quisieras hacer summaries o resúmenes de contenido de la competencia usando GPT, conviene darle un input limpio para ahorrar tokens. También podría servir para extraer solo el texto visible de una página y luego hacer análisis de densidad de palabras clave, sentimiento, etc. Su limitación principal es que no ejecuta JavaScript ni recorre múltiples páginas (no es crawler). Sitios muy dinámicos podrían no funcionar bien (páginas vacías si el contenido se genera client-side). Aun así, para la mayoría de páginas de artículos o tiendas funciona correctamente. Tiene una generosa capa gratuita y opciones de pago si necesitas muchísimas llamadas.

4. SerpAPI (API especializada en SERPs)

En el contexto SEO, uno de los casos de scraping más importantes es la extracción de datos de los motores de búsqueda (SERPs): posiciones orgánicas, resultados de pago, snippets, People Also Ask, mapas, etc. Scrappear Google u otros buscadores es notoriamente difícil por las medidas anti-scraping que implementan (CAPTCHAs, bloqueos, IP banning) y por la complejidad de sus páginas (muy dinámicas y con HTML ofuscado). Aquí es donde SerpAPI brilla: es un servicio API (Software as a Service) que se especializa en entregar los datos de búsquedas de Google, Bing, YouTube, Amazon, entre otros, de forma limpia y estructurada en JSON.

¿Por qué usar SerpAPI? En lugar de construir un scraper propio para Google y actualizarlo cada vez que Google cambie su HTML, SerpAPI lo hace por ti. Tú realizas una llamada a su API con la consulta deseada, y SerpAPI devuelve un JSON con todos los elementos del resultado ya parseados (títulos, URLs, descripciones, posiciones, información de los knowledge panels, etc.). Además, resuelve automáticamente cualquier CAPTCHA y se encarga de rotar IPs globalmente, garantizando resultados consistentes. Incluso permite especificar la ubicación geográfica, idioma, dispositivo, para emular búsquedas locales o móviles con precisión. Esto es invaluable para SEO, donde a menudo queremos saber cómo aparece nuestra web en distintas ciudades, o comparar resultados.

Coste: SerpAPI no es gratuito, aunque ofrece pruebas gratuitas limitadas. Sus planes comienzan con algunos miles de búsquedas por mes por decenas de dólares. En entornos profesionales de SEO (agencias, herramientas) suele valer la pena por el tiempo y fiabilidad que brinda. Como alternativa gratuita limitada, a veces Google permite usar su API de Búsqueda JSON para 100 consultas al día, pero es muy restringida en los datos que devuelve (solo resultados orgánicos básicos).

Uso: Usar SerpAPI desde Python es sencillo gracias a su librería oficial google-search-results. Veamos un ejemplo de cómo obtener resultados de Google:

!pip install google-search-results    # instalar la librería de SerpAPI

from serpapi import GoogleSearch

params = {

    "q": "mejor herramienta SEO", 

    "location": "Madrid, Spain",

    "hl": "es",  # idioma español

    "api_key": "TU_API_KEY"

}

search = GoogleSearch(params)

result = search.get_dict()

print("Consulta:", result.get("search_parameters", {}).get("q"))

for i, res in enumerate(result.get("organic_results", []), start=1):

    print(f"{i}. {res.get('title')} - {res.get('link')}")

En este código, proporcionamos los parámetros de búsqueda: la consulta q, la ubicación (Madrid) y el idioma hl, además de nuestra API key de SerpAPI. Al llamar get_dict(), la librería hace la petición a SerpAPI y recibe el JSON ya convertido a diccionario Python. Luego iteramos por organic_results que contiene los resultados orgánicos: podemos acceder al title, link, snippet, etc. (Nota: este código requiere una API key válida de SerpAPI para funcionar).

La salida serían líneas con los títulos y URLs de los resultados orgánicos para «mejor herramienta SEO». Adicionalmente, result podría tener answer_box (si hubo un cuadro de respuesta), knowledge_graph, local_results, etc., cada uno estructurado.

SerpAPI soporta muchos motores (Google, Bing, Yahoo, Yandex, YouTube, Amazon, eBay, Yelp, entre otros, lo que lo hace útil no solo para SEO tradicional sino también para mercados específicos (por ejemplo, extraer precios de productos de Amazon, o reseñas de Yelp). En SEO puro, es ampliamente usado para rank tracking, monitorizar SERP features, o recolectar datos para estudios (por ejemplo, cuántas veces aparece un Feature Snippet para ciertas keywords). De hecho, muchas herramientas de tracking internas se construyen sobre SerpAPI u otros proveedores similares, porque construir y mantener un scraper propio de SERPs es costoso.

5. Otras herramientas destacables

Además de las anteriores, vale la pena mencionar brevemente otras soluciones de scraping usadas en la industria:

  • FireCrawl (Mendable): Similar a Jina Reader, convierte páginas a Markdown limpiamente. Ofrece créditos gratuitos y la posibilidad de correr localmente. Es open-source y se integra bien con flujos LLM (de hecho, es usado por empresas como Nvidia, Zapier, etc. para conectar sus AIs a la web.
  • Octoparse: Una plataforma de scraping no-code. Permite configurar scrapers mediante interfaz visual, lo que es útil para quienes no programan. Tiene plan gratuito limitado y planes de pago. Para SEO puede servir para extraer datos de sitios específicos sin escribir código, aunque su curva de aprendizaje de interfaz existe.
  • Apify: Plataforma SaaS que ofrece actors (scripts pre-construidos) para scraping común, incluyendo scrapers de Google Search, Google Maps, ecommerces, etc. Tiene un modelo de pago por consumo y escalabilidad en la nube.
  • Zyte (antes ScrapingHub): Ofrece infraestructura de proxies, rotación de IPs, y un servicio llamado Crawlera para evadir bloqueos, además de mantener Scrapy. Es usado por proyectos grandes de scraping para garantizar que las tasas de éxito se mantengan altas incluso con defensas anti-bot.

Cada herramienta tiene su nicho; la elección depende de las necesidades: ¿Necesitas código a medida o prefieres soluciones listas? ¿Quieres integrar un modelo de IA para interpretar los datos en vivo? ¿Es scraping de buscadores o de sitios arbitrarios? En la siguiente sección, resumiremos comparativamente las herramientas vistas.

Comparación técnica de herramientas de scraping

A continuación se presenta una tabla comparativa de las herramientas y enfoques mencionados, evaluadas en varios aspectos clave:

DispositivoHash Rate (TH/s)Probabilidad por bloqueProbabilidad diariaProbabilidad anual / Tiempo medio
NerdMiner0.000055~6.6×10⁻¹⁷
(1 en 1.5×10¹⁶)
~3.5×10⁻¹²
(1 en 2.8×10¹¹)
Bitaxe mini-ASIC~3~3.6×10⁻¹²
(1 en 2.8×10¹¹)
~1 en 1.2×10⁶Bloque cada ~3500 años
Antminer S913~1×10⁻¹¹
(1 en 1×10¹¹)
~1 en 8.6×10⁶~1 en 60,000
(~60,000 años)
Antminer S19 XP140~1.7×10⁻¹⁰
(1 en ~6×10⁹)
~1 en 48,000~1 en 133
(~133 años)
Antminer S21 Ultra200~2.9×10⁻¹⁰
(1 en 3.48×10⁶)
~1 en 24,000~1 en 66
(~66 años)
Antminer S21 Ultra (Hidro-enfriado)335Mejora a ~1 en 2.08×10⁶~1 en 40
(~40 años)

Nota: En precisión de datos, todas las herramientas aquí listadas tienden a ser fiables extrayendo el contenido visible. Sin embargo, en el caso de las asistidas por IA (ScrapeGraph, etc.), la precisión puede interpretarse como qué tanto logran estructurar o resumir correctamente el contenido, lo cual depende del modelo. Por ejemplo, SerpAPI tiene precisión alta en el sentido de que entrega exactamente lo que hay en la SERP sin errores de parsing, porque ellos mismos verifican y mantienen su parser.

Flujo de scraping con LLM paso a paso (Python + GPT)

Después de haber explorado técnicas y herramientas, combinemos varios conceptos para describir un flujo moderno de scraping enfocado a SEO usando Python e integrando un modelo de lenguaje (LLM). El escenario es: queremos extraer información específica de una página web y obtener un resultado estructurado (por ejemplo en JSON) utilizando la ayuda de un LLM para interpretar el contenido. Este enfoque es poderoso para resumir o normalizar datos heterogéneos. Los pasos son:

1. Descargar el DOM de la página web: Empezamos por obtener el HTML completo de la página de interés. Podemos usar requests si es estática o selenium/playwright si necesita renderizado. La salida de este paso es el código HTML (el DOM, Document Object Model, representado en texto). En este ejemplo, digamos que queremos scrapear una página de noticias y extraer de cada noticia: título, fecha y autor. Usaremos requests para simplicidad (asumiendo que la página entrega el contenido directamente):

import requests

url = "https://www.ejemplo.com/noticias"

headers = {"User-Agent": "Mozilla/5.0"}

html = requests.get(url, headers=headers).text

Ahora html contiene el DOM crudo. Si la página requiere JavaScript, aquí consideraríamos usar Playwright: e.g., page.content() tras cargar. Pero sigamos con este caso simple.

2. Sanitizar y reducir el DOM: El HTML obtenido suele contener mucho contenido irrelevante para nuestra tarea (menus, footers, anuncios, scripts de seguimiento, etc.). Además, los LLM tienen límites de contexto y coste, así que conviene enviarles solo lo necesario. Para sanitizar, podemos usar BeautifulSoup para quitar etiquetas no deseadas y posiblemente extraer solo secciones relevantes. Por ejemplo:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

# Eliminar scripts y estilos para no enviar eso al LLM

for script in soup(["script", "style"]):

    script.decompose()

# Extraer el texto limpio de la sección principal de noticias

main_content = soup.find("div", {"id": "contenido-noticias"})

text = main_content.get_text(separator="\n")

print(text[:300])  # imprimir primeros 300 caracteres

Aquí buscamos un <div id=»contenido-noticias»> imaginario que encierra las noticias (suponiendo conocemos la estructura). Eliminamos <script> y <style> con decompose(). Luego tomamos todo el texto dentro de esa sección, usando un separador de salto de línea para preservar cierta estructura visual. La variable text ahora contiene esencialmente el texto principal de la página, con saltos de línea entre noticias quizás.

Podríamos ser más sofisticados y dividir por noticia si cada una está en, digamos, <article> o una clase específica. Ejemplo: articles = main_content.find_all(«article») y luego para cada article extraer subtrozos. Pero supongamos que el prompt del LLM se encargará de segmentar.

También podríamos hacer algunas reducciones: si sabemos que solo nos importa título, fecha, autor, podríamos intentar aislar esos elementos con selectores y concatenarlos en un texto estructurado. Sin embargo, a veces es más sencillo dejar que el modelo lo haga con las pistas adecuadas en el prompt. Lo importante es haber quitado basura que pueda confundir (publicidad, navegación, etc.).

3. Enviar el DOM limpio al LLM con un prompt personalizado: Ahora viene la parte de IA. Formularemos un prompt claro que instruya al modelo a extraer la info en formato JSON. Por ejemplo, un prompt en español podría ser:

«Eres un asistente que extrae datos estructurados de texto HTML. Se te proporcionará el texto de varias noticias consecutivas de una página web. Debes identificar para cada noticia: el título, la fecha de publicación y el autor. Devuelve un JSON con una lista de noticias, donde cada noticia tenga los campos ‘titulo’, ‘fecha’ y ‘autor’. Si algún dato no está presente, deja el campo vacío.»

Luego le adjuntamos el texto de la página (el text obtenido). Este prompt guía al modelo a devolver JSON.

En Python, usando la API de OpenAI (suponiendo tenemos openai instalado y una API Key configurada), haríamos:

import openai

prompt = (

    "Eres un asistente que extrae datos estructurados de texto HTML. "

    "Se te proporcionará el texto de varias noticias consecutivas de una página web. "

    "Debes identificar para cada noticia: el título, la fecha de publicación y el autor. "

    "Devuelve un JSON con una lista de noticias, donde cada noticia tenga los campos "

    "'titulo', 'fecha' y 'autor'. Si algún dato no está presente, deja el campo vacío.\n"

    "===\n"

    f"{text}\n"

    "==="

)

response = openai.ChatCompletion.create(

    model="gpt-3.5-turbo",

    messages=[{"role": "user", "content": prompt}],

    temperature=0

)

output_text = response['choices'][0]['message']['content']

print(output_text)

Hemos construido un mensaje de usuario concatenando la instrucción y el contenido text (separado por delimitadores «===» para que el modelo distinga claramente las secciones). Usamos temperature=0 para obtener salidas deterministas dado el mismo input. El modelo elegido es GPT-3.5 Turbo por economía; GPT-4 podría dar resultados más precisos pero a mayor costo.

El output_text debería ser un JSON (en texto) siguiendo nuestras instrucciones. Por ejemplo, podría verse así:

{

  "noticias": [

    {

      "titulo": "Lanzamiento del nuevo producto X",

      "fecha": "2025-04-01",

      "autor": "Juan Pérez"

    },

    {

      "titulo": "Conferencia anual de tecnología",

      "fecha": "2025-03-30",

      "autor": "María García"

    }

  ]

}

Asumiendo que el modelo entendió bien el prompt y el contenido, nos devuelve algo en este estilo. Ahora debemos parsear este JSON para usarlo en nuestro programa:

import json

data = json.loads(output_text)

for noticia in data.get("noticias", []):

    print(noticia["titulo"], "-", noticia["fecha"], "-", noticia["autor"])

Y ya tenemos estructurados los datos listos para guardar en una base de datos, hoja de cálculo o alimentar otro proceso.

Consideraciones: Este flujo demuestra cómo un LLM puede ahorrarnos tener que programar parseos específicos para cada página. Le dimos un texto bastante bruto y pudo localizar la info. Sin embargo, no es infalible. Es importante validar que el JSON efectivamente se pueda cargar (a veces el modelo podría olvidar una coma, por eso es útil indicarle que solo devuelva JSON y nada más). Podemos hacer que el código verifique si json.loads falla, y en tal caso, intentar limpiar la respuesta o re-intentar.

Además, hay que tener en cuenta el costo de las llamadas a la API de LLM. En el ejemplo anterior, si text tenía, digamos, 5000 caracteres (unas 1000 palabras), enviar eso a GPT-3.5 es ~1000 tokens de prompt, y la respuesta quizá 100-200 tokens. No es caro para una sola página, pero scrapear 1000 páginas de esa manera podría costar varios dólares en tokens. Por eso, optimizar la reducción del DOM (paso 2) es fundamental. También se puede optar por modelos open-source locales (como StarCoder, GPT4All, etc.) si la privacidad o costo es un tema, aunque su rendimiento puede ser inferior a GPT-4.

Un flujo similar se puede implementar con otras combinaciones: por ejemplo, usando Crawl4AI para obtener markdown y luego enviarlo a GPT, o con ScrapeGraph como ya vimos, que integra todo en una librería. La idea central es que el LLM actúa como un «parser inteligente» capaz de entender contexto semántico, no solo patrones exactos. Esto abre posibilidades como: «extrae las opiniones positivas vs negativas de estos reviews» o «categoriza las noticias por tema», tareas que con regex o selectores serían muy difíciles.

Como mencionan en SearchEngineJournal, el scraping combinado con IA permite a los profesionales SEO obtener insights valiosos de la competencia y del algoritmo de búsqueda. Ya no solo recogemos datos, sino que podemos interpretarlos a gran escala.

Aplicaciones y estadísticas del scraping en SEO

Para poner en perspectiva la importancia del scraping en la industria SEO, revisemos algunas aplicaciones comunes y datos relevantes:

  • Monitorización de SERPs y Rank Tracking: Saber en qué posición aparece tu web (y la de tus competidores) para cientos o miles de palabras clave es vital. Los SERPs son volátiles; como vimos, Google realiza cambios constantes en su algoritmo y resultados (13 cambios diarios en promedio, además de pruebas A/B y personalización por ubicación. Por ello, las herramientas SEO efectúan scraping (o consultas API) diario o incluso horario de las SERPs. Un estudio indica que Google procesa ~8.5 mil millones de búsquedas al día, dando idea del volumen de datos. Lógicamente, no se pueden verificar manualmente tantas consultas, de ahí que el scraping sea la única vía. Empresas como Ahrefs, Semrush, etc., mantienen motores de scraping masivo para sus bases de datos de rankings. Muchas implementaciones caseras utilizan SerpAPI o ScraperAPI para obtener estos resultados.
  • Análisis de competidores: El scraping permite realizar un competitive intelligence exhaustivo. Por ejemplo, se puede scrapear el sitio de un competidor para ver su estructura (qué categorías tienen, cuántos productos o artículos publican, con qué frecuencia actualizan su blog). También extraer sus títulos y meta descripciones para ver su estrategia de keywords, o monitorear cambios en su sitio (Visual Ping y otras herramientas verifican cambios en páginas clave vía scraping). Un consejo común es revisar periódicamente (trimestral o semestralmente) a los competidores top en tu nicho . Pero en ciertos sectores muy dinámicos, esta monitorización es continua. Como menciona Search Engine Journal, los dueños de negocios pueden beneficiarse de scrapear ideas de contenido que sus competidores no tienen – es decir, analizar mediante scraping qué temas cubren otros y encontrar brechas para explotarlas con contenido propio único.
  • Tracking de backlinks y menciones: La construcción de enlaces (link building) y el monitoreo de backlinks es fundamental en SEO off-page. Herramientas como Ahrefs, Moz, Majestic tienen bots que crawlean la web entera en busca de enlaces. Ahrefs, por ejemplo, reportó tener indexados 3.3 billones de enlaces externos en 2022, creciendo a 35 billones en 2025 (un aumento de 960%) . ¡35 trillones en notación anglosajona, es decir 35 billones en español, de backlinks! Y actualizan su índice cada 15-20 minutos . Esto ilustra la escala: sin web scraping, sería imposible catalogar quién enlaza a quién. A nivel particular, un SEO puede usar scraping en menor escala para vigilar, por ejemplo, qué nuevos enlaces obtiene la competencia (usando APIs de esas herramientas o scrapers propios sobre páginas de referencia).
  • Auditorías técnicas y detección de problemas: Un crawler SEO (como Screaming Frog, Sitebulb, etc.) no es más que un scraper especializado que recorre tu sitio para detectar enlaces rotos, problemas de contenido duplicado, faltas de etiquetas, etc. Muchos SEOs utilizan scraping para sus auditorías: por ejemplo, un script en Python que visita todas las URLs de un sitemap y extrae el <title> y <h1> de cada una para ver si coinciden o están optimizados. O revisar todas las páginas de producto para ver si muestran “out of stock” en el HTML (indicador de problemas de inventario). Estas tareas pueden automatizarse y correr semanalmente, ahorrando muchísimo tiempo. Como dijo Hamlet Batista, automatizar tareas repetitivas con Python permite a los SEO enfocarse en estrategias de mayor nivel
  • Extracción de datos para contenido o estudios: Los profesionales SEO a veces actúan como data scientists. Por ejemplo, para un estudio de mercado se puede scrapear las descripciones de 1000 productos de la categoría para analizar tendencias de palabras clave. O scrapear resultados de Google Noticias para ver cobertura mediática de cierto evento. Incluso para alimentar algoritmos de Machine Learning (e.g., entrenar un modelo que prediga CTR en función del título y posición, usando datos scraped de SERPs). Las posibilidades son amplias.
  • Local SEO y fichas de Google Business: Otra aplicación es scrapear información local, por ejemplo horarios y reseñas de Google Maps (aunque Google tiene APIs oficiales para parte de esto), o usar scraping para monitorear cuándo un competidor actualiza su ficha de Google My Business, etc.

Citas de expertos: La comunidad SEO reconoce la importancia del scraping. El especialista Patrick Stox ha mencionado en conferencias cómo la recopilación de datos a gran escala ayuda a tomar decisiones informadas (por ejemplo, comparar miles de SERPs para entender qué factores correlacionan con el posicionamiento). Aleyda Solís, experta en SEO internacional, suele recomendar en sus charlas aprovechar datos estructurados y automatización (lo cual incluye scraping) para escalar esfuerzos de SEO técnico. Por su parte, Search Engine Land ha publicado que Google está cada vez más atento a los scrapers no autorizados y toma medidas para bloquearlos, lo que implica que los SEO debemos ser creativos y éticos al hacerlo (usando APIs oficiales cuando existan, respetando límites, etc.).

Sin embargo, scraping bien empleado no es “black hat” ni mucho menos; se trata de acceder a datos públicos de forma eficiente. Como dice Forbes, puede dar una ventaja competitiva al analizar las estrategias de tus rivales. En definitiva, quienes dominan el scraping pueden convertir la web en su base de datos personal para SEO, encontrando insights que otros pasan por alto.

Para la industria SEO, el scraping se ha vuelto indispensable

El web scraping enfocado a SEO es un campo apasionante que combina programación, análisis de datos y entendimiento de buscadores. A lo largo de este ensayo hemos profundizado en las técnicas clásicas (desde parsear HTML con BeautifulSoup hasta controlar navegadores headless con Selenium/Playwright), y cómo han evolucionado hacia soluciones inteligentes con IA, capaces de entregar datos estructurados listos para consumir. También vimos que hay herramientas para todos los niveles: gratuitas y open-source para los más técnicos, así como APIs y plataformas de pago que simplifican la vida a cambio de un costo.

Para la industria SEO, el scraping se ha vuelto indispensable. Las estadísticas lo respaldan: el volumen de datos a monitorear (billones de páginas, SERPs cambiantes, trillones de enlaces) es inabarcable manualmente. Por ello, los profesionales exitosos adoptan estas herramientas. De hecho, se suele decir que en SEO técnico, saber programar y hacer scraping es el “superpoder” que separa a un buen SEO de uno excelente. Esto permite anticiparse a movimientos de la competencia, detectar oportunidades antes que nadie y medir resultados con precisión.

Al implementar proyectos de scraping, es importante también actuar con responsabilidad: respetar archivos robots.txt (si bien legalmente no es obligatorio, éticamente es recomendable), no sobrecargar servidores ajenos con demasiadas peticiones (usar rate limiting y buenas prácticas) o preferir fuentes de datos oficiales cuando estén disponibles (por ejemplo, la API de Google Search Console para obtener posiciones en lugar de scrapear SERPs ciegamente para tus propios sitios).

Daniel Pajuelo
Daniel Pajuelo es ingeniero informático y SEO Senior, actualmente trabajando en Guruwalk. En su blog personal escribe sobre Inteligencia Artificial, SEO, Vibe Coding, Blockchain... Ver más

Continua leyendo

Leer más sobre: SEO, Programación