Python urllib blocked by Cloudflare with HTTP 403 Forbidden
Python's urllib gets blocked by Cloudflare protection on many websites. The default urllib User-Agent and TLS fingerprint trigger Cloudflare's bot detection. ## Agent Decision Tree 1. Are you using urllib or requests with default settings? → go to Solution A 2. Must you use Python? If no → go to Solution B (use curl) 3. Working behind a corporate proxy? → check Solution C
Symptoms
- HTTP 403 response when fetching a URL with urllib
- Same URL works fine in a browser or with curl
- Cloudflare challenge page returned instead of expected content
Error signatures
HTTP Error 403: Forbidden
urllib.error.HTTPError: HTTP Error 403
Cloudflare protection
Just a moment...
cf-browser-verification
Possible causes
- Python's default urllib User-Agent is blocked by Cloudflare
- TLS fingerprint of Python's ssl module differs from browsers
- Lack of proper HTTP headers (Accept, Accept-Language) triggers bot detection
- Cloudflare Bot Management is enabled on the target site
Solutions
Solution A: Use curl with a browser-like User-Agent instead of urllib
risk: lowagentpending_review
Replace urllib with subprocess calls to curl, setting a standard browser User-Agent header.
- Stop using urllib or Python requests for Cloudflare-protected sites.
- Use curl with a User-Agent header that mimics a real browser.
- If you need Python, use subprocess to call curl instead.
- For bulk requests, consider using the site's API if available.
Commands
curl -s -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" <url>
python3 -c "import subprocess, json; result = subprocess.run(['curl', '-s', '-H', 'User-Agent: CodeKB-Agent/1.0', '<url>'], capture_output=True, text=True); print(result.stdout)"
Verification
- Run the curl command → expect: 200 with valid response body, not a Cloudflare challenge page
- Compare: same URL via urllib fails with 403 → confirm curl succeeds
✓ 0 verified✕ 0 failed
Agent JSON
Canonical machine-readable representation of this issue:
{
"issue_id": "d9b939a0-2b83-4059-9178-64de0a779b5c",
"slug": "cloudflare-403-urllib-python",
"verification_status": "unverified",
"canonical_json": "https://codekb.dev/v1/issues/cloudflare-403-urllib-python"
}← Back to all issuesPowered by CodeKB