Instagram e TikTok são os dois alvos mainstream mais difíceis de scraping — mais difíceis que o Google, mais difíceis que a Amazon. Os dois aplicam pontuação agressiva de IP, os dois fazem fingerprint do seu cliente em várias camadas e os dois são famosos pelo bloqueio suave: em vez de um 403 limpo, você recebe muros de login, JSON vazio, "challenge_required" ou resultados silenciosamente truncados. Seu scraper "funciona" e seus dados são lixo.
Este guia mostra como cada plataforma realmente bloqueia você em 2026, a configuração de proxy que sobrevive e os padrões de requisição que mantêm contas e sessões vivas. (Para gerenciamento de múltiplas contas em vez de scraping, veja nossos guias de AdsPower/Multilogin e GoLogin/Dolphin Anty.)
challenge_required. A tolerância do Instagram a IPs residenciais compartilhados/abusados também é baixa — a qualidade do pool importa mais aqui do que em quase qualquer outro lugar.X-Bogus/assinatura gerados por JavaScript ofuscado. Scraping puro-HTTP significa fazer engenharia reversa de assinaturas que mudam a cada poucas semanas — a maioria dos times roda um navegador real (Playwright) e intercepta as respostas JSON.itemList vazias que parecem "sem mais conteúdo").# One identity = one sticky session, country-pinned
socks5h://USERNAME:[email protected]:913
Rotação por requisição é aceitável para páginas públicas anônimas em baixo volume. No momento em que um cookie de sessão ou um login entram em jogo, mude para sticky — cookie e IP precisam se mover como uma única identidade (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"])
Observe a resposta, não o código de status: um 200 com {"data": null} ou um redirecionamento para /accounts/login/ significa que o orçamento deste IP acabou — rotacione a identidade, recue e retome.
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")
Isso evita por completo a engenharia reversa de assinaturas: a própria página gera um X-Bogus válido e você colhe o JSON. O proxy precisa ser definido na inicialização do navegador — as peculiaridades de autenticação são cobertas em autenticação de proxy no Playwright.
challenge_required, itemList vazio com hasMore: true.| TikTok | ||
|---|---|---|
| Melhor caminho de acesso | Endpoints web GraphQL/API, curl_cffi | Playwright + interceptação de resposta |
| Tipo de proxy | Residencial sticky por identidade | Residencial, com geo correspondente ao mercado |
| IPs de datacenter | Muro de login / challenge | Captcha instantâneo |
| Sinal de bloqueio suave | redirecionamento de login, challenge_required, data nulo | itemList vazio, página de captcha |
| Sensibilidade geográfica | Moderada | Alta — o conteúdo difere por país |
Fixados por país, sessões sticky, ASNs limpos — 500MB de tráfego grátis, sem cartão.
Comece o teste grátisNovos usuários recebem 500MB ao se cadastrar, mais um bônus na primeira recarga. Oferta por tempo limitado.