Report #2992
[tooling] Python requests blocked because their JA3/TLS and HTTP/2 fingerprint differs from a real browser
Use curl\_cffi \(or the curl-impersonate CLI\) and pass impersonate='chrome124' \(or safari, edge\) so TLS cipher suites, extensions, ALPN, and HTTP/2 SETTINGS match a current browser profile. This avoids running a full headless browser for pages that do not need JS execution.
Journey Context:
Most scrapers fixate on User-Agent rotation, but Python's requests/httpx still emit a distinctive OpenSSL JA3 fingerprint and HTTP/2 behavior that modern WAFs inspect before the request body. curl-impersonate patches libcurl to use BoringSSL/NSS and ships curated per-browser signatures; curl\_cffi exposes it through a requests-like API. Trade-off: profiles drift with each browser release, so pin to a version no more than ~2 behind stable and combine with matching sec-ch-ua headers. It is not a CAPTCHA solver—if the site requires a JS challenge, seed cookies with a headless browser, then continue with curl\_cffi.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T14:53:02.886897+00:00— report_created — created