Instagram et TikTok sont les deux cibles grand public les plus difficiles du scraping — plus difficiles que Google, plus difficiles qu'Amazon. Les deux appliquent une notation d'IP agressive, les deux relèvent l'empreinte de votre client sur plusieurs couches, et les deux sont célèbres pour le blocage doux (soft block) : au lieu d'un 403 net, vous obtenez des murs de connexion, des JSON vides, « challenge_required » ou des résultats silencieusement tronqués. Votre scraper « fonctionne » et vos données sont des déchets.
Ce guide couvre comment chaque plateforme vous bloque réellement en 2026, la configuration de proxy qui survit et les schémas de requête qui maintiennent les comptes et les sessions en vie. (Pour la gestion de plusieurs comptes plutôt que le scraping, consultez nos guides AdsPower/Multilogin et GoLogin/Dolphin Anty.)
challenge_required. La tolérance d'Instagram aux IP résidentielles partagées/abusées est également faible — la qualité du pool compte ici plus que presque partout ailleurs.X-Bogus/signature générés par du JavaScript obfusqué. Le scraping purement HTTP implique de faire de la rétro-ingénierie sur des signatures qui tournent toutes les quelques semaines — la plupart des équipes exécutent plutôt un vrai navigateur (Playwright) et interceptent les réponses JSON.itemList vides qui ressemblent à « plus de contenu »).# One identity = one sticky session, country-pinned
socks5h://USERNAME:[email protected]:913
Faire tourner à chaque requête convient pour les pages publiques anonymes à faible volume. Dès qu'un cookie de session ou une connexion entre en jeu, passez en sticky — le cookie et l'IP doivent se déplacer comme une seule identité (pourquoi).
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"])
Observez la réponse, pas le code de statut : un 200 avec {"data": null} ou une redirection vers /accounts/login/ signifie que le budget de cette IP est épuisé — faites tourner l'identité, faites une pause et reprenez.
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")
Ceci évite entièrement la rétro-ingénierie des signatures : la page génère elle-même un X-Bogus valide, et vous récoltez le JSON. Le proxy doit être configuré au lancement du navigateur — les particularités d'authentification sont couvertes dans l'authentification de proxy dans Playwright.
challenge_required, itemList vide avec hasMore: true.| TikTok | ||
|---|---|---|
| Meilleure voie d'accès | Endpoints web GraphQL/API, curl_cffi | Playwright + interception des réponses |
| Type de proxy | Résidentiel sticky par identité | Résidentiel, géo-concordant au marché |
| IP de centre de données | Mur de connexion / challenge | Captcha instantané |
| Signal de blocage doux | redirection de login, challenge_required, données null | itemList vide, page de captcha |
| Sensibilité géographique | Modérée | Élevée — le contenu diffère selon le pays |
Fixées par pays, sessions sticky, ASN propres — 500 Mo de trafic gratuit, sans carte requise.
Démarrer l'essai gratuitLes nouveaux utilisateurs reçoivent 500 Mo à l'inscription, plus un bonus sur la première recharge. Offre à durée limitée.