Instagram y TikTok son los dos objetivos mainstream más difíciles del scraping — más difíciles que Google, más difíciles que Amazon. Ambos aplican una puntuación agresiva de IP, ambos toman la huella de tu cliente en varias capas, y ambos son famosos por el bloqueo suave (soft block): en lugar de un 403 limpio, obtienes muros de inicio de sesión, JSON vacíos, "challenge_required" o resultados truncados de forma silenciosa. Tu scraper "funciona" y tus datos son basura.
Esta guía cubre cómo cada plataforma te bloquea realmente en 2026, la configuración de proxy que sobrevive y los patrones de petición que mantienen vivas las cuentas y las sesiones. (Para la gestión de múltiples cuentas en lugar del scraping, consulta nuestras guías de AdsPower/Multilogin y GoLogin/Dolphin Anty.)
challenge_required. La tolerancia de Instagram a las IP residenciales compartidas/abusadas también es baja — la calidad del pool importa aquí más que casi en ningún otro sitio.X-Bogus/signature generados por JavaScript ofuscado. El scraping puramente HTTP implica hacer ingeniería inversa de firmas que rotan cada pocas semanas — la mayoría de los equipos ejecutan un navegador real (Playwright) en su lugar e interceptan las respuestas JSON.itemList vacías que parecen "no hay más contenido").# One identity = one sticky session, country-pinned
socks5h://USERNAME:[email protected]:913
Rotar-por-petición está bien para páginas públicas anónimas a bajo volumen. En el momento en que entra en juego una cookie de sesión o un inicio de sesión, cambia a sticky — la cookie y la IP deben moverse como una única identidad (por qué).
from curl_cffi import requests
PROXY = {"https": "socks5h://USERNAME:[email protected]:913"}
# Public profile JSON (no login) - impersonate Chrome's TLS
r = requests.get(
"https://www.instagram.com/api/v1/users/web_profile_info/?username=nasa",
impersonate="chrome",
headers={"X-IG-App-ID": "936619743392459"},
proxies=PROXY,
)
data = r.json()["data"]["user"]
print(data["edge_followed_by"]["count"])
Observa la respuesta, no el código de estado: un 200 con {"data": null} o una redirección a /accounts/login/ significa que el presupuesto de esta IP se ha agotado — rota la identidad, haz una pausa y reanuda.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
})
page = browser.new_page()
items = []
# Let TikTok's own JS sign the requests; we just read the answers
page.on("response", lambda res:
items.extend(res.json().get("itemList", []))
if "/api/post/item_list" in res.url else None)
page.goto("https://www.tiktok.com/@nasa")
for _ in range(5):
page.mouse.wheel(0, 2500)
page.wait_for_timeout(1800) # human-ish scroll cadence
print(len(items), "videos captured")
Esto evita por completo la ingeniería inversa de firmas: la página genera por sí misma un X-Bogus válido, y tú recolectas el JSON. El proxy debe configurarse al lanzar el navegador — las peculiaridades de autenticación se cubren en la autenticación de proxy en Playwright.
challenge_required, itemList vacío con hasMore: true.| TikTok | ||
|---|---|---|
| Mejor vía de acceso | Endpoints web GraphQL/API, curl_cffi | Playwright + intercepción de respuestas |
| Tipo de proxy | Residencial sticky por identidad | Residencial, geo coincidente con el mercado |
| IP de centro de datos | Muro de inicio de sesión / challenge | Captcha instantáneo |
| Señal de bloqueo suave | redirección de login, challenge_required, datos null | itemList vacío, página de captcha |
| Sensibilidad geográfica | Moderada | Alta — el contenido difiere por país |
Fijadas por país, sesiones sticky, ASN limpios — 500MB de tráfico gratis, sin tarjeta requerida.
Empezar prueba gratisLos nuevos usuarios reciben 500MB al registrarse, más un bono en la primera recarga. Oferta por tiempo limitado.