Scraping de resultados de búsqueda de Google con proxies (SERP, 2026)

Publicado el 12 de junio de 2026 · ≈9 min de lectura

Google es el objetivo convencional más difícil de scrapear, y la razón es simple: ve más tráfico que nadie, así que tiene el modelo más rico de cómo es un buscador real. Golpéalo desde una IP de centro de datos a cualquier volumen y obtienes un 429, una página de "sorry/index" o un bloqueo suave donde los resultados se adelgazan silenciosamente. Esta guía cubre qué dispara realmente los bloqueos de Google y la estrategia de proxy y limitación de tasa que mantiene vivo un scraper de SERP en 2026.

Qué dispara un bloqueo de Google

Google no se basa en una sola señal: apila varias y banea cuando la puntuación combinada cruza un umbral:

Aquí el residencial es innegociable

Para la mayoría de objetivos puedes salirte con la tuya usando IPs de centro de datos en datos públicos. Google es la excepción: su puntuación de reputación de ASN es lo bastante agresiva como para que los proxies de centro de datos sean limitados casi de inmediato. Los exits residenciales — ASNs de consumidores reales — son los que permiten a un scraper de SERP sostener el volumen. Reserva el centro de datos para todo lo demás y gasta el presupuesto residencial donde realmente marca la diferencia.

Rota, pero limita la tasa por exit

La rotación reparte la carga para que ninguna IP individual parezca un bot, pero la disciplina que te mantiene con vida es la tasa por exit, no solo el tamaño del pool. Mil proxies igual son baneados si los disparas todos a fondo. Marca el ritmo de cada exit como una persona:

import time, random, itertools
from curl_cffi import requests   # browser TLS fingerprint, see notes below

PROXIES = [
    "socks5h://USERNAME:[email protected]:913",
    "socks5h://USERNAME:[email protected]:913",
]
pool = itertools.cycle(PROXIES)

def serp(query, page=0):
    proxy = next(pool)
    params = {"q": query, "start": page * 10, "hl": "en"}
    r = requests.get("https://www.google.com/search", params=params,
                     impersonate="chrome",
                     proxies={"http": proxy, "https": proxy}, timeout=30)
    if r.status_code == 429 or "/sorry/" in r.url:
        raise RuntimeError("rate-limited - back off and rotate")
    return r.text

for q in queries:
    html = serp(q)
    parse(html)
    time.sleep(random.uniform(2.0, 5.0))   # human-paced gap between queries

El retraso aleatorizado hace un trabajo real: un sleep(3) fijo es en sí mismo una huella. Varíalo, y reparte las consultas entre los exits para que cada uno se mantenga por debajo del umbral por IP de Google.

Sesiones sticky y geolocalización

Los resultados localizados (rankings, idioma, moneda) dependen de la ubicación del exit, así que elige proxies en la geografía que quieres medir y mantén una sesión sticky (persistente) durante una consulta de varias páginas para que todas las páginas de una búsqueda vengan del mismo lugar. Mezclar exits a mitad de la consulta te da resultados cosidos de distintas regiones: inútil para el seguimiento de rankings.

No olvides la huella

Google también lee tu handshake de TLS. Una simple llamada con requests envía un JA3 que grita Python, lo que se suma a la puntuación de la IP. Envía una huella de navegador real con curl_cffi (usado arriba) o un navegador real — consulta Evade el fingerprinting de TLS con curl_cffi. Si Google empieza a poner barreras con un muro de consentimiento de JS, escala a un motor de navegador real como se cubre en la guía de Turnstile — aplica la misma lógica de "necesita un runtime de JS".

Maneja el bloqueo con elegancia

Lista de comprobación

Para todos los productos IP · un enorme pool de nodos disponibles en cualquier momento

Regístrate ahora y obtén hasta un 100% de reembolso en tu recarga

Los nuevos usuarios reciben 500MB al registrarse, más un bono en la primera recarga. Oferta por tiempo limitado.