Entrar Registrarse
Web scraping

Proxies para web scraping que aguantan la ola de bloqueos

Un scraper necesita muchas direcciones, rotación rápida y ningún contador de tráfico. Un paquete de Advanced.name te da de 5.000 a 50.000 direcciones IPv4 en un solo enlace, hasta 5.000 hilos en paralelo y un pool en el que cada día cambia más o menos un tercio de las direcciones.

  • hasta 50.000 IP por paquete
  • hasta 5.000 hilos
  • el tráfico no se cuenta
Racks de servidores con luces turquesa: el pool de proxies para web scraping
Web scraping

Qué necesita un scraper y qué da el paquete

Cuatro cosas deciden si un rastreo termina o muere en el primer captcha.

Qué pide la tareaQué da el paquete

Direcciones de sobra para que una IP no pise el sitio dos veces por minuto

De 5.000 (paquete n.º 1) a 50.000 (paquete n.º 6) direcciones en una sola lista

Pool fresco: las IP bloqueadas deben salir antes de que llegues a ellas

Cerca de un tercio del pool rota cada 24 horas y la lista se actualiza cada 10 minutos

Conexiones en paralelo para todo el rastreo

De 500 a 5.000 hilos según el paquete, todos los protocolos en un mismo puerto

Nadie cuenta gigabytes

Sin límite de tráfico en ningún paquete ilimitado: pagas el paquete y los hilos

Proxies ilimitados

Elige el paquete según el tamaño del rastreo

Región, paquete, plazo. El precio es por una IP autorizada; cada IP extra suma un 10 %.

Región
Plazo
IP autorizadas
1 +10% por cada IP tras la primera
Recomendado para esta tarea
$0
  • Proxies en el paquete
  • Hilos
  • IP autorizadas1
  • ProtocolosHTTP / SOCKS5
Los 13 paquetes en la tabla de precios

Tres pasos del pago a la primera página

Consigue el enlace de la lista

Tras el pago, el panel muestra un enlace del tipo get.advanced.name/<ID>. Devuelve líneas ip:port, una por dirección. HTTP y SOCKS5 van por el mismo puerto.

Autoriza la IP de tu servidor

La lista solo se abre desde las IP que añadas en el panel. Nada de usuario y contraseña en la configuración del scraper: la dirección es la llave.

Rota en el código

Carga la lista, recórrela en círculo y, si una petición falla, repite la URL con el siguiente proxy. El script de abajo hace justo eso con la biblioteca estándar.

Scraper listo: rotación, reintentos y filtro por país

Apunta CSV_URL a la exportación de tu panel, fija COUNTRY y MIN_SPEED y pon las URL de destino en urls.txt. El script se queda solo con el país que necesitas, descarga cada URL por el siguiente proxy y reintenta con otra dirección cuando una falla. Revisa antes el pool con el Socks List Processor.

CSV export link from your dashboard
ISO 3166-1 alpha-2 (e.g. DE, NL, US), or "" for the whole pool
keep proxies with speed >= this value (higher is better)
parallel requests
seconds per request
proxies to try before a URL is marked failed
one target URL per line
fetched HTML is written here as 1.html, 2.html, ...
Los valores salen del formulario; copia o descarga el archivo listo.
Mostrar el código del script
Python 3.8+ · parsing.py
#!/usr/bin/env python3
"""Multithreaded scraper for Advanced.name proxies.

Reads the CSV proxy export, keeps the country and speed you need, then fetches a
list of target URLs through rotating proxies with automatic retries. Standard
library only, no pip. Edit the CONFIG block and run: python3 scrape.py
"""

# ================================ CONFIG ====================================
CSV_URL = "https://get.advanced.name/YOUR_LIST_ID.csv"  # CSV export link from your dashboard
COUNTRY = "DE"          # ISO 3166-1 alpha-2 (e.g. DE, NL, US), or "" for the whole pool
MIN_SPEED = 3           # keep proxies with speed >= this value (higher is better)
THREADS = 50            # parallel requests
TIMEOUT = 15            # seconds per request
RETRIES = 3             # proxies to try before a URL is marked failed
URLS_FILE = "urls.txt"  # one target URL per line
OUT_DIR = "pages"       # fetched HTML is written here as 1.html, 2.html, ...
# ============================================================================

import csv
import io
import itertools
import os
import sys
import threading
import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed

# CSV columns from the dashboard export, ';' separated:
# ip ; port ; country ; speed ; uptime ; exit_ip
COL_IP, COL_PORT, COL_COUNTRY, COL_SPEED, COL_UPTIME = 0, 1, 2, 3, 4
UA = "Mozilla/5.0 (compatible; scraper/1.0)"


def load_proxies():
    """Download the CSV list, keep the wanted country and speed, fastest first."""
    raw = urllib.request.urlopen(CSV_URL, timeout=30).read().decode("utf-8", "replace")
    pool = []
    for row in csv.reader(io.StringIO(raw), delimiter=";"):
        if len(row) <= COL_SPEED or not row[COL_PORT].strip().isdigit():
            continue
        country = row[COL_COUNTRY].strip().upper()
        speed = int(row[COL_SPEED] or 0)
        if COUNTRY and country != COUNTRY.upper():
            continue
        if speed < MIN_SPEED:
            continue
        pool.append((row[COL_IP].strip() + ":" + row[COL_PORT].strip(), speed))
    pool.sort(key=lambda item: -item[1])
    return [addr for addr, _ in pool]


def opener_for(proxy):
    handler = urllib.request.ProxyHandler({"http": "http://" + proxy, "https": "http://" + proxy})
    return urllib.request.build_opener(handler)


def main():
    proxies = load_proxies()
    if not proxies:
        sys.exit("No proxies match COUNTRY=%r and MIN_SPEED=%d." % (COUNTRY, MIN_SPEED))
    with open(URLS_FILE, encoding="utf-8") as fh:
        urls = [u for u in map(str.strip, fh) if u and not u.startswith("#")]
    os.makedirs(OUT_DIR, exist_ok=True)
    print("proxies: %d (%s), urls: %d, threads: %d" % (len(proxies), COUNTRY or "any", len(urls), THREADS))

    rotation = itertools.cycle(proxies)
    lock = threading.Lock()
    done = {"ok": 0, "fail": 0}

    def fetch(index, url):
        for _ in range(RETRIES):
            with lock:
                proxy = next(rotation)
            req = urllib.request.Request(url, headers={"User-Agent": UA})
            try:
                body = opener_for(proxy).open(req, timeout=TIMEOUT).read()
            except Exception:
                continue
            with open(os.path.join(OUT_DIR, "%d.html" % index), "wb") as out:
                out.write(body)
            return True
        return False

    with ThreadPoolExecutor(max_workers=THREADS) as pool:
        futures = {pool.submit(fetch, i, u): u for i, u in enumerate(urls, 1)}
        for fut in as_completed(futures):
            ok = fut.result()
            with lock:
                done["ok" if ok else "fail"] += 1
                total = done["ok"] + done["fail"]
            sys.stderr.write("\r%d/%d  ok %d  fail %d" % (total, len(urls), done["ok"], done["fail"]))
            sys.stderr.flush()
    print("\nsaved %d pages to %s/ (%d failed)" % (done["ok"], OUT_DIR, done["fail"]))


if __name__ == "__main__":
    main()
Configuración

Cómo conectar el pool a tu scraper

requests y urllib

Pasa el proxy en cada petición: crea un opener con ProxyHandler o dale a requests proxies={'http': 'http://ip:port', 'https': 'http://ip:port'}. HTTP y SOCKS comparten puerto, así que http:// cubre ambos; para SOCKS5 en requests instala requests[socks] y usa socks5h://ip:port para que el DNS se resuelva en el lado del proxy.

Lee la lista una vez, recórrela en círculo y toma la siguiente dirección en cada petición. Reintenta una URL fallida con otro proxy dos o tres veces antes de descartarla; el script de arriba ya lo hace.

Scrapy, Octoparse y crawlers ya hechos

En Scrapy pon la dirección en request.meta['proxy'] o usa un middleware de rotación de proxies que lea el archivo que escribe el generador, y deja CONCURRENT_REQUESTS en el límite de hilos de tu paquete o por debajo. Los crawlers visuales como Octoparse y ParseHub aceptan la misma lista ip:port en su configuración de proxies.

Antes de un rastreo largo, filtra el pool una vez con el Socks List Processor para que ninguna dirección muerta llegue al parser. Para una prueba rápida del código basta con la lista de proxies gratis.

En la práctica

Dónde vive el pool

Cuatro hábitos que mantienen vivo un rastreo

  1. Actualiza la lista cada 10 minutos y descarta las direcciones que desaparezcan de ella: salieron de la rotación por algo.
  2. Usa una IP en un sitio durante unas pocas peticiones y pasa a la siguiente. Un ciclo de 20.000 direcciones da a cada IP un descanso largo.
  3. Pon un timeout de 10 a 15 segundos y reintenta con el siguiente proxy en vez de esperar.
  4. Ajusta la región al sitio: tiendas europeas por Europa, clasificados rusos por la CEI, marketplaces chinos por China.
FAQ

Preguntas sobre esta tarea

¿Cuántos hilos tiene un scraper?
Tantos como permita el paquete: 500 en el paquete #1, 5000 en el paquete #6. Resi Core y Resi Prime no tienen límite de hilos. Un hilo es una conexión abierta al pool.
¿Los proxies rotan solos?
Rota la lista: cada día cambia cerca de un tercio de las direcciones. En tu código eliges tú la siguiente dirección, así controlas el ritmo.
¿HTTP o SOCKS5 para scraping?
Cualquiera. Los dos protocolos responden en el mismo puerto, así que usa el que admita tu biblioteca. Con urllib y curl, HTTP es el camino más corto.
¿Puedo probar antes de pagar?
Sí. Una hora gratis en cualquier paquete con todos los hilos y sin tarjeta. Basta para lanzar un rastreo real y ver la tasa de errores.
¿Cuándo necesita un scraper Resi en lugar de un paquete?
Cuando un sitio bloquea las direcciones de las listas compartidas más rápido de lo que las recorres. Resi Core da una IP doméstica en cada petición, y Resi Prime añade la elección de ciudad. El resto del rastreo sale más barato con un paquete, donde el tráfico no se cuenta.
Planes para esta tarea

Qué tomar para web scraping

El rastreo en volumen sale más barato con un paquete ilimitado. Pasa por los sitios que bloquean las direcciones de las listas con Resi Core, y saca datos por ciudad con Resi Prime.

Proxies ilimitados

Rastreo en volumenLa mejor opción

Paquete #3 · World MIX · 20 000 IP · 2000 hilos

El tráfico no se cuenta: los gigabytes de HTML e imágenes no cambian el precio. Un tercio de las direcciones cambia cada día, y las bloqueadas salen de la lista.

$700 al meso $2.70 por hora

Resi Core

Sitios protegidos

2M+ IP · más de 200 países · sin límite de hilos

Una IP doméstica nueva en cada petición. Tómalo para sitios donde las direcciones de paquete topan con captcha. El país lo fijas en la cadena de conexión.

desde $0.49 por GB1 GB por $0.85

Resi Prime

Datos por ciudad

30M+ IP · 220 países · sin límite de hilos

Ciudad, región, ISP y ASN en la cadena de conexión. Lo necesitas cuando un sitio da datos distintos a ciudades distintas.

desde $1.39 por GB1 GB por $2.29

Arranca el rastreo en menos de una hora

Elige un paquete, usa la hora de prueba gratis y lanza tu scraper sobre el pool real.

Precios Prueba una hora gratis