Tag: Python

  • Herramientas modernas para scraping en Python: decisiones clave

    Herramientas modernas para scraping en Python: decisiones clave

    Python para scraping moderno (2026 edition)

    Tiempo estimado de lectura: 4 min

    • Decisión principal: cliente HTTP (httpx/curl_cffi) para endpoints JSON estables; Playwright cuando hay interacción humana o JS complejo.
    • Identidad de scraping: IP, cookies, headers y huella TLS (JA3) determinan la detección.
    • Rotación práctica: proxies según el objetivo, mantener sesiones lógicas y backoff exponencial ante 429.
    • Límites éticos/legal: respeta robots.txt, evita PII y prioriza APIs oficiales cuando existan.
    • Regla operacional: si el coste de mantener el scraper supera el valor, para o usa la API.

    Python para scraping moderno (2026 edition) ya no es escribir 20 líneas con BeautifulSoup y listo. En 2026 el scraping es ingeniería defensiva: WAFs con ML, TLS fingerprinting (JA3) y detección de comportamiento te obligan a elegir herramientas, identidad y límites éticos con criterio desde el primer diseño.

    Resumen rápido (lectores con prisa)

    Elige cliente HTTP (httpx/curl_cffi) para endpoints JSON estables y alta velocidad; usa Playwright cuando necesites emular interacción humana o bypass de JS. Rotación no es sólo User-Agent: incluye IP, cookies y huella TLS. Respeta robots.txt, evita PII y prioriza APIs oficiales.

    Python para scraping moderno (2026 edition): Requests vs Playwright

    HTTP clients modernos (httpx, curl_cffi)

    Uso: APIs públicas/ocultas, feeds RSS, sitios estáticos.

    Ventaja: muy rápido, bajo consumo de recursos, fácil de escalar.

    Riesgo 2026: librerías como requests son detectadas por su huella TLS (JA3). Usa curl_cffi para impersonation: https://github.com/yifeikong/curl_cffi y httpx para asincronía: https://www.python-httpx.org/

    from curl_cffi import requests
    r = requests.get("https://example.com/data", impersonate="chrome120")
    print(r.text)

    Buen patrón: localizar el endpoint JSON que alimenta la UI y consumirlo directo (Network → Fetch/XHR).

    Automatización con navegador (Playwright)

    Uso: SPAs dinámicas, login, captchas complejos, scroll infinito.

    Ventaja: le “hablas” al sitio como un humano y puedes interceptar requests de red. Docs: https://playwright.dev/python/

    Coste: alto consumo de CPU/RAM, menor throughput por instancia.

    from playwright.async_api import async_playwright
    
    async def get_data(url):
        async with async_playwright() as p:
            browser = await p.chromium.launch(headless=True)
            page = await browser.new_page()
            await page.goto(url)
            # Captura del endpoint que cargó los datos
            data = await page.evaluate("() => window.__INITIAL_DATA__")
            await browser.close()
            return data

    Tabla corta de decisión

    • Si hay un endpoint JSON estable → usa httpx/curl_cffi.
    • Si necesitas emular interacciones humanas o bypass de JS → usa Playwright.

    Rotación básica: IPs, headers y sesiones

    Proxies

    Datacenter: baratos para tasks no sensibles, pero fácilmente detectables.

    Residenciales: caros, menor tasa de detección; úsalos para targets de alta seguridad.

    Rotación práctica: cambia la IP cada 50–200 requests, nunca en mitad de un flujo lógico (login → acciones).

    Headers y TLS

    Usa impersonation a nivel TLS (curl_cffi) en lugar de solo headers.

    Headers “realistas” incluyen: Accept, Sec-Fetch-* y cookies coherentes.

    Evita patrones deterministas (mismos intervalos, mismas cabeceras siempre).

    Sesiones lógicas

    Mantén cookies y la misma IP para acciones que pertenecen a un mismo usuario.

    Cambiar IP entre login y uso suele activar mecanismos de “impossible travel”.

    Rate limiting y retries

    Respeta backoff exponencial ante 429.

    Reintentos con jitter (tenacity): https://github.com/jd/tenacity

    import httpx
    client = httpx.AsyncClient(proxies="http://user:pass@proxy:port")
    resp = await client.get("https://example.com/api")

    El scraping se mueve en una zona gris. Un criterio senior no busca atajos; busca sostenibilidad.

    Robots.txt

    Robots.txt: empieza respetándolo. Es la intención del site. Más info: https://www.robotstxt.org/

    PII

    Evita recolectar o almacenar datos personales identificables (GDPR: https://gdpr.eu/). Si los necesitas para el negocio, consulta legal.

    Carga del servidor

    Limita tu tráfico a <1% del tráfico normal del host; trata el scraping como “cliente respetuoso”.

    Términos de Servicio

    Términos de Servicio: leerlos te ahorra juicios y bloqueos activos. Extraer datos para replicar un servicio suele crear riesgos legales y reputacionales.

    No usar scraping para evadir pagos o acceso protegido; eso es casi siempre ilegal.

    Si tienes dudas, opta por la alternativa oficial: API pública o proveedor de datos.

    Cuándo parar y cuándo NO scrapear

    Parar antes de empezar es la regla más rentable.

    Scrapea si

    • Los datos son públicos y agregados (precios, productos, inventario público).
    • Hay endpoints JSON estables y no requieren autenticación.
    • El coste de mantener el scraper es menor que el valor que aporta.

    No scrapear si

    • Requiere acceso privado (login personal ajeno) o datos PII.
    • El target tiene una API paga: comprarla suele ser más barato a largo plazo.
    • La estructura cambia semanalmente y el mantenimiento es alto.
    • La operación pone en riesgo la disponibilidad del servicio objetivo.

    Alternativas: usar API oficial, comprar feed de datos o usar proveedores especializados (Apify, Bright Data).

    Conclusión

    Python para scraping moderno es ingeniería, no trucos. Diseña híbridos: Playwright para la fase humana (auth/token), curl_cffi/httpx para extracción masiva con impersonation y proxies adecuados. Prioriza la ingeniería inversa de APIs, respeta límites éticos y mide el coste total de propiedad. Un scraper robusto vive meses; uno agresivo no pasa de horas.

    Dominicode Labs

    Si tu flujo incluye automatización, agentes o workflows para integración de scraping con pipelines, revisa recursos y experimentos en Dominicode Labs. Es una continuación práctica para probar híbridos de Playwright + httpx y patrones de rotación.

    FAQ

    ¿Cuándo usar curl_cffi en lugar de requests?

    Usa curl_cffi cuando necesites impersonation a nivel TLS (JA3) para reducir la detección; requests puede exponer huellas TLS detectables.

    ¿Playwright siempre evita las detecciones?

    No. Playwright emula un navegador y reduce algunos riesgos, pero sigue siendo detectable si no gestionas identidad, timing y comportamiento; además tiene coste mayor.

    ¿Con qué frecuencia debo rotar IPs?

    Rotación práctica: cada 50–200 requests, y nunca en mitad de un flujo lógico como un login seguido de acciones.

    ¿Debo respetar robots.txt?

    Sí: empieza respetándolo; refleja la intención del sitio y reduce riesgos legales y reputacionales.

    ¿Qué hacer ante datos PII?

    Evítalos o consulta legal. El GDPR y regulaciones equivalentes aplican; almacenar PII sin autorización es un riesgo serio.

    ¿Cuál es el patrón recomendado para retries?

    Usa backoff exponencial con jitter y bibliotecas como tenacity para evitar picos y bloqueos.