Spaces:
Paused
Paused
File size: 7,009 Bytes
bcf46c3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Fix: Cloudflare 403 Forbidden Scraping — OpticParse</title>
<meta name="description" content="Getting a 403 Forbidden or 401 error when scraping with Python Requests? Learn how to bypass Cloudflare and Datadome using OpticParse Vision AI." />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" onload="this.onload=null;this.rel='stylesheet'" />
<noscript>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" />
</noscript>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0a0a12; --bg2: #0f0f1a; --bg3: #13131f;
--border: rgba(255,255,255,0.07); --text: #e8e8f0; --muted: #a1a1aa;
--purple: #8b5cf6; --purple2: #6d28d9; --cyan: #06b6d4; --cyan2: #0891b2;
}
html { scroll-behavior: smooth; }
body { font-family: 'Inter', sans-serif; background: var(--bg); color: var(--text); line-height: 1.6; overflow-x: hidden; }
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 1rem 2rem;
background: rgba(10,10,18,0.85); backdrop-filter: blur(16px);
border-bottom: 1px solid var(--border);
}
.nav-logo { font-weight: 800; font-size: 1.1rem; letter-spacing: -0.5px; }
.nav-logo span { background: linear-gradient(135deg, var(--purple), var(--cyan)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.nav-links { display: flex; gap: 2rem; }
.nav-links a { color: var(--muted); text-decoration: none; font-size: 0.9rem; font-weight: 500; transition: color .2s; }
.nav-links a:hover { color: var(--text); }
.nav-cta { background: linear-gradient(135deg, var(--purple), var(--cyan)); color: #fff; border: none; padding: .5rem 1.2rem; border-radius: 8px; font-weight: 600; font-size: .85rem; cursor: pointer; text-decoration: none; transition: opacity .2s; }
.nav-cta:hover { opacity: .85; }
.hero { min-height: 50vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 8rem 2rem 4rem; text-align: center; position: relative; overflow: hidden; }
.hero h1 { font-size: clamp(2rem, 4vw, 3rem); font-weight: 900; line-height: 1.1; margin-bottom: 1.5rem; }
.hero p { font-size: 1.2rem; color: var(--muted); max-width: 600px; margin-bottom: 2rem; }
.code-block { background: #000; border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; text-align: left; font-family: 'JetBrains Mono', monospace; font-size: 0.9rem; color: #ff5f5f; margin-bottom: 2rem; overflow-x: auto; }
section { padding: 4rem 2rem; max-width: 900px; margin: 0 auto; }
.section-label { display: inline-block; font-size: .75rem; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: var(--muted); margin-bottom: 1rem; }
.section-title { font-size: clamp(1.5rem, 3vw, 2.2rem); font-weight: 800; letter-spacing: -1px; line-height: 1.1; margin-bottom: 1.5rem; }
.content-block { color: var(--text-muted); font-size: 1.1rem; line-height: 1.8; margin-bottom: 2rem; }
.content-block p { margin-bottom: 1.5rem; color: var(--muted); }
.feature-list { list-style: none; display: flex; flex-direction: column; gap: .8rem; margin-bottom: 1.5rem; }
.feature-list li { display: flex; align-items: flex-start; gap: .6rem; font-size: 1.05rem; color: var(--muted); }
.feature-list li::before { content: '→'; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
.divider { height: 1px; background: var(--border); margin: 0 2rem; }
footer { border-top: 1px solid var(--border); padding: 2.5rem 2rem; text-align: center; color: var(--muted); font-size: .85rem; }
footer a { color: var(--muted); text-decoration: none; }
footer a:hover { color: var(--text); }
.footer-links { display: flex; gap: 2rem; justify-content: center; flex-wrap: wrap; margin-bottom: 1rem; }
@media (max-width: 768px) {
.nav-links { display: none; }
}
</style>
</head>
<body>
<nav>
<div class="nav-logo"><span>Opticparse</span> & PhishVision</div>
<div class="nav-links">
<a href="/">Home</a>
<a href="/phishvision.html">PhishVision</a>
<a href="/api-docs.html">Docs</a>
</div>
<a href="https://dashboard.opticparse.com" target="_blank" class="nav-cta">Start Free →</a>
</nav>
<main>
<div class="hero">
<h1>Fix: Cloudflare 403 Forbidden while scraping</h1>
<div class="code-block">requests.exceptions.HTTPError: 403 Client Error: Forbidden for url</div>
<p>Are your Python requests or basic scrapers getting blocked by Cloudflare or Datadome? Stop fighting bot protection manually.</p>
</div>
<section>
<div class="section-label">The Problem</div>
<h2 class="section-title">Why am I getting a 403?</h2>
<div class="content-block">
<p>If you're using `requests.get()` or a simple HTTP client to scrape a website, Cloudflare detects immediately that you are not a real browser. They check your TLS fingerprint, JavaScript execution capabilities, and headers.</p>
<p>Faking headers (`User-Agent`) doesn't work anymore. Cloudflare expects your client to execute a complex JavaScript challenge. If you can't run JS, you get a 403 Forbidden.</p>
</div>
</section>
<div class="divider"></div>
<section>
<div class="section-label">The Fix</div>
<h2 class="section-title">Visual Browsers bypass WAFs</h2>
<div class="content-block">
<p>The only reliable way to bypass modern bot protection is to use a real, headful browser that can execute the JavaScript challenge perfectly. But managing headless browsers and rotating proxies is expensive and complex.</p>
<p>That's where <strong>OpticParse</strong> comes in.</p>
<ul class="feature-list">
<li>OpticParse manages real Chromium browsers automatically.</li>
<li>We handle the JS execution to bypass Cloudflare challenge pages seamlessly.</li>
<li>Instead of parsing HTML, we take a screenshot and use AI to extract the JSON you want.</li>
</ul>
<p>Stop fighting WAFs and bot detection. Send us the URL and a prompt, and we'll return the data.</p>
</div>
</section>
</main>
<footer>
<div class="footer-links">
<a href="https://dashboard.opticparse.com" target="_blank">Opticparse Dashboard</a>
<a href="/api-docs.html">API Documentation</a>
<a href="/sitemap.xml">Sitemap</a>
</div>
<p>© 2026 OpticParse</p>
</footer>
</body>
</html>
|