Starting from 403/429, fingerprinting, CAPTCHAs, dynamic pages, and login sessions, this article explains the real reasons web scraping is restricted and outlines an approach that puts authorized APIs first, with rate limiting, backoff, incremental caching, and compliant account environments.
When a web scraping job hits 403, 429, a CAPTCHA, or recurring login failures, the right move is not to rotate IPs, mask fingerprints, or try to "mimic a real person." These signals usually mean the request rate, the scope of access, the authentication method, or the automated behavior has crossed a boundary the site is willing to allow. Pushing past the limit tends to escalate a temporary block and may also breach terms of service, contracts, copyright, or data protection rules.
A more stable path is to first confirm authorization and the available interfaces, then reduce traffic, cache where appropriate, and back off when needed. Browser automation should only come into play for pages that genuinely require JavaScript rendering or a human login. Treat a CAPTCHA as a signal to pause, not a technical barrier to break.
Start with the symptom and narrow down the cause
| Symptom | Common cause | Compliant response |
|---|---|---|
| 429 Too Many Requests | Requests too fast, too parallel, or repetitive | Lower the rate, honor Retry-After, use exponential backoff |
| 403 Forbidden | Unauthorized path, policy block, missing session | Check permissions, terms, robots.txt, and authentication |
| CAPTCHA appears | Site requires human verification or blocks automation | Pause the task, complete it manually, or request an API |
| Login keeps failing | Expired cookies, sessions overwritten, failed auth | Use official OAuth or service accounts, hand off sessions cleanly |
| Page has content but the script cannot read it | JavaScript rendering, async API loading | Use the official API; with permission, render in a browser then read the DOM |
| Selectors suddenly fail | DOM redesign, A/B test, language changes | Rely on semantic locators, structural tests, and alerts; avoid hard-coded hierarchies |
| Duplicate or missing data | Pagination, cursors, time zones, update windows | Use unique keys, an incremental watermark, and rerun mechanisms |
Change one variable at a time and keep logs. If you swap IP, User-Agent, account, and parser at once, you may succeed by accident but still cannot tell which change actually fixed the issue.
Step 1: Confirm you are allowed to collect this data
Before you start, answer four questions:
- Is the data public, or is it only available after login, payment, or to specific roles?
- Does the site offer an API, an export, a feed, a webhook, or a partner data interface?
- Do the terms of service, robots.txt, contracts, and local law permit the intended use?
- Does the data include personal information, copyrighted material, or other sensitive fields?
robots.txt is the standard way for a site to express which paths it allows or disallows to automated clients. RFC 9309 defines the syntax and matching rules of the Robots Exclusion Protocol and makes it clear that robots.txt is not an access grant. In other words, being allowed by robots.txt does not give you the full right to copy, process, or commercially use the data; paths that are disallowed should not be reached by some other entry point.
Enterprise projects should keep records of data sources, the basis for access, the intended use, the fields, the retention period, and the deletion mechanism. When aggregate data can solve the problem, avoid collecting personally identifiable information.
Step 2: Prefer stable data entry points
The usual priority order is:
- Official APIs, webhooks, or data exports;
- Public feeds, sitemaps, or bulk files;
- Permitted ordinary HTTP pages;
- Browser automation only when JavaScript really must be rendered;
- Pages that require a human account and interaction as the last resort.
APIs usually come with field definitions, pagination, rate limits, and error codes, so they are cheaper to maintain than parsing a UI. A web page is a surface for human eyes; it can change at any time and should not be treated as a stable database.
If a site has no suitable interface, contact the data owner first and explain the use case, frequency, fields, and commercial scope. A clear data license is usually cheaper than a long fight against restrictions.
Step 3: Address 429 and IP bans by reducing load, not hiding your source
Set rate and concurrency ceilings
Start with a single worker and a generous interval, and watch the response time and error rate. When the server returns Retry-After, wait exactly that long. When it does not, use exponential backoff with random jitter so that multiple tasks do not all retry at the same instant.
A simple policy:
wait = min(cap, base * 2^retries) + random_jitter
Stop and raise an alert once you hit the maximum retry count. Do not loop forever.
Cache and use incremental updates
Cache the same URL and, where supported, send conditional requests with ETag or Last-Modified. Record the last update time or cursor so you only fetch new or changed content. Separating the full refresh from daily incremental jobs can significantly reduce traffic.
Identify your client honestly
A compliant crawler uses a stable, real User-Agent, states its purpose, and provides a contact page or email. Pretending to be a generic browser and changing identity often makes it harder for a site to tell good traffic from bad, which raises the chance of being blocked.
If a particular IP is restricted, pause the task and check the cause. Continuing to rotate proxies may be seen as circumventing access controls, not fixing the problem.
Step 4: Handle fingerprinting and behavioral analysis
Browser fingerprints combine signals such as the User-Agent, operating system, language, time zone, screen resolution, Canvas, and WebGL. A site may also analyze request cadence, navigation paths, and session behavior. OWASP lists Fingerprinting, Scraping, CAPTCHA Defeat, Credential Stuffing, and similar patterns as distinct automated threat categories, which is why a site often combines many signals to judge automated risk.
For authorized work, the goal is not to produce many identities that look "human," but to keep the environment stable and explainable:
- Use a fixed environment and normal authentication for the same business account;
- Keep browser parameters consistent with the actual region and device;
- Do not randomize fingerprints to dodge blocks;
- Log the scraping rate, task ID, and responsible person;
- Agree with the site on the number of accounts, concurrency, and data scope it will allow.
If the site still misclassifies an authorized task, share timestamps, User-Agent, egress IP, and request samples with the site and ask to be added to a whitelist or to be given a dedicated interface.
Step 5: Stop automation when a CAPTCHA appears
A CAPTCHA is there to confirm a human or to block suspicious automation. Do not use OCR, CAPTCHA solving services, CAPTCHA-breaking plugins, or any other method to bypass it automatically.
The correct flow is:
- Pause the current account and task queue immediately;
- Save the request rate, paths, and error log that triggered it;
- Have an authorized person complete the verification on the official page;
- Check whether requests were too fast, the session had expired, or the path was not allowed;
- For long-term automation, contact the site to request an API, a service account, or a whitelist.
Even if a human completes one CAPTCHA, that does not give you the right to run unlimited automated requests afterwards. Fix the trigger first.
Step 6: Treat logins and multi-account access with proper permissions
Data behind a login is more sensitive than public pages. Prefer OAuth, service accounts, API tokens, or permissions granted by the platform's official team. Do not let a script store someone's primary password.
When a browser session is really required:
- One legitimate business account maps to one stable environment;
- Store cookies encrypted, with an expiry and a way to revoke them;
- Turn on MFA, and never let automation bypass a second factor;
- Do not let multiple people reset passwords or copy cookies at the same time;
- Record who started which task and when;
- Revoke access immediately when someone leaves, a project ends, or a role changes.
Multi-account setups are only for accounts you actually own or are authorized to use. When a site limits one entity to a single account, environment isolation should not be used to break that limit.
Step 7: Make dynamic-page parsing more resilient to redesigns
Use semantic and stable attributes
Prefer titles, headers, accessibility attributes, and any public test identifiers the site publishes. Avoid brittle hierarchies like div:nth-child(7). Re-read the DOM after a page refresh; do not assume yesterday's node still exists.
Separate extraction from business logic
The collection layer only turns a page into structured fields. The validation layer checks types, ranges, unique keys, and required items. With that split, a redesign only touches the parser, not the downstream analysis.
Keep samples and alerts
Save a small number of compliant HTML or structural snapshots as test samples. Do not store full account pages or sensitive data. Monitor field-missing rates, record counts, duplication rates, and page titles; stop writing to production data when the numbers go off.
Where PurpleMark fits in authorized scraping
When a team needs to maintain several authorized accounts, different client environments, or different regions at the same time, it can use the PurpleMark web app to build an independent browser environment for each business account and store the matching cookies, the page that should open by default, and the normal network configuration. Reopening that environment later returns the browser to the same session and starting page, so multiple people do not share one set of cookies and the team does not have to log in again from scratch.
When accounts need to be split by client, platform, or region, environment groups can keep different business accounts in different folders, and member permissions, sharing, and transfer can decide who is allowed to open which environment. Operation logs record who opened or changed which environment and when, so when an authorized scraping job is questioned, the team can trace it back to a specific account and a specific owner.
PurpleMark helps a team keep accounts, environments, sessions, and accountability in one workspace over time. It is not meant to be used to bypass IP bans, CAPTCHAs, account number limits, or a site's anti-automation controls. Get the authorization first, then talk about automation.
A maintainable scraping architecture
A practical split is five layers:
- Scheduling layer: controls rate, concurrency, task priority, and pause;
- Access layer: API, HTTP, or an authorized browser session;
- Parsing layer: turns responses into structured fields;
- Quality layer: deduplication, type checks, missing-field alerts, and version records;
- Governance layer: permissions, source, purpose, retention period, and deletion.
Every record keeps the source URL, the collection time, and the parser version. When something goes wrong, you can locate and rerun the affected records instead of re-crawling the whole site.
Frequently asked questions
Will rotating proxies solve an IP ban?
It can change the egress address for a while but does not fix the rate, permissions, or behavior problem. Rotating proxies to keep accessing a site may count as circumvention. Stop the task, lower the rate, and contact the site first.
Can a CAPTCHA be solved automatically?
No. A CAPTCHA is a signal to pause or to ask a human to confirm. For ongoing automation, request an API, a service account, or a whitelist.
If robots.txt allows it, can I always scrape it?
Not necessarily. robots.txt is not a grant of access; you also need to consider the terms, copyright, privacy, contracts, and the intended use of the data.
Can a fingerprint browser make scraping "undetectable"?
No, and that should not be the goal. It is more useful for separating legitimate account sessions from team permissions and reducing cookie mix-ups and mistakes.
Closing thoughts
Web scraping restrictions are not just an "anti-bot technology problem." 403, 429, fingerprinting, CAPTCHAs, and multi-account limits all point back to permissions, load, and identity management.
A stable approach always comes back to APIs first, clear authorization, restrained requests, incremental caching, testable parsing, and auditable accounts. When a CAPTCHA or a block shows up, stop and fix the process instead of continuing to hide the source of the automation.


