How to Avoid Getting Blocked While Scraping
To avoid getting blocked while scraping, make every request look like it comes from an ordinary visitor and keep the load low: rotate residential IPs, send a real browser's headers, pause randomly between requests, keep cookies within a session, render JavaScript only where the page needs it, and back off as soon as you see a 403, a 429 or a CAPTCHA. Most blocks come from three signals: the IP's network and reputation, too many requests from one IP, and a client that does not behave like a browser. ProxyField rotates requests across 412M+ residential IPs from $1.95/GB, at a 99.6% success rate, according to our service data; start with the Easy Trial: 1 GB for $2.95.
- residential IPs
- 412M+
- from, traffic never expires
- $1.95/GB
- Easy Trial
- 1 GB for $2.95
On this page 11 sections
- Why websites block scrapers
- The checklist
- IPs: rotation, sessions and the right type
- Headless browsers and stealth plugins
- CAPTCHAs and challenge pages
- How to spot and avoid honeypot links and crawler traps
- What to do when you get blocked
- Stay within the rules
- Guides on avoiding blocks
- Sources
- Blocks and anti-bot FAQ
In this guide
- Why Is My IP Address Blocked? IP Bans and How to Fix One.
- Residential Proxy Detection: Can Websites Detect Proxies? Yes: Cloudflare (detection ID 50331651, bot score 29) and MaxMind flag them. How detection works, by proxy type.
- CAPTCHA Proxies: How Proxies Reduce CAPTCHAs Proxy CAPTCHA: How Proxies Cut CAPTCHAs, When to Solve.
- HTTP Headers for Web Scraping Which to Send, Python and Scrapy.
- What Is a User Agent? How to Read and Check One.
- List of User Agents for Scraping The 15 strings below are a current list of user agents for scraping: Chrome 156 on Windows, macOS, Linux and Android; Edge 156 on Windows and macOS…
Why websites block scrapers
Websites block scrapers to protect their servers, their data and their users' accounts, and bot-protection services score every request on a handful of signals. Knowing the signal tells you the fix.
Most blocks are made by an anti-bot service sitting in front of the site, not by the site's own code. The service scores each request and decides to allow it, slow it, challenge it with a CAPTCHA or block it. That is why a scraper can work for days and then fail everywhere at once: the scoring model changed, not your code.
| Signal the site checks | What gives a scraper away | The fix | Guide |
|---|---|---|---|
| IP network and reputation | A datacenter IP, or an IP with a history of abuse | Residential or mobile IPs | Why is my IP address blocked?, can websites detect proxies |
| Request rate per IP | Hundreds of requests a minute from one address | Rotation, pauses, fewer threads per site | 429 errors |
| HTTP headers | A library's default User-Agent, missing Accept-Language, odd header order | Copy a real browser's full header set | Headers for web scraping, what is a user agent |
| TLS and HTTP/2 fingerprint | A Python or Go TLS handshake under a Chrome user agent | A client that imitates the browser's handshake, or a real browser | TLS and TCP fingerprinting |
| Browser fingerprint and JavaScript checks | navigator., headless traces, a fingerprint that matches no real device | A full browser, stealth patches, consistent profiles | What is a browser fingerprint, browser fingerprinting in scraping |
| Behavior | Perfectly regular timing, no mouse or scroll, deep links with no referrer | Natural pacing and navigation order | Item 10 of the checklist below |
| Traps | Following links that no human can see, or endless URL spaces | Skip hidden links; normalize URLs and cap depth | Honeypots and crawler traps below |
Blocks rarely come from one signal alone. A datacenter IP with perfect headers may pass a news site and fail a retailer; a residential IP with a script's TLS handshake can still meet a challenge page. Fix the signals that are easiest to change first: rate, headers and IP type.
The checklist
Work through the list in order: the first five items are the easiest to change, and the later ones matter on sites with a dedicated anti-bot service.
- Read the rules. Check
robots.txtand the terms, and collect only public data.robots.txtrules "are not a form of access authorization" (RFC 9309), but they tell you which paths the site wants left alone: skip them. More: how to check if a website allows scraping. - Look for an API or embedded JSON first. Many pages load their data from a JSON endpoint you can call directly, with fewer requests and fewer blocks.
- Don't download what hasn't changed. Cache pages and send conditional requests:
If-None-Matchwith the storedETag, orIf-Modified-Sincewith the stored date. An unchanged page comes back as304 Not Modifiedwith no body (MDN: conditional requests), so a re-crawl costs a fraction of the requests and traffic. - Slow down. Start with one request every few seconds per site, add random jitter, and raise the rate only while responses stay clean.
- Rotate IPs. Spread requests over many residential IPs; use a sticky session only when several requests must come from one visitor.
- Send headers that fit the site. On sites that welcome crawlers, a descriptive
User-Agentwith a contact URL is the lowest-friction choice, for examplePriceWatchBot/1.2 (+https://example.com/bot; [email protected]): the operator can see who you are and reach you instead of blocking you. On sites that serve only browsers, send a current browserUser-Agentwith the matchingAccept,Accept-LanguageandAccept-Encoding, in the browser's order, and rotate whole header sets, not single fields. User agent list. - Keep sessions consistent. One IP, one user agent and one cookie jar per session; a session that changes IP or browser in the middle looks like a takeover.
- Match the location. Use IPs in the country, and if needed the city, of the content you need; set the matching language and time zone in a browser.
- Use a browser only where needed. Plain HTTP for server-rendered pages; a headless browser for pages built by JavaScript: scrape dynamic web pages.
- Act like a visitor. Follow links rather than jumping to deep URLs in a perfect sequence, load the pages a visitor would load, and vary the timing.
- Fix your browser's fingerprint. Remove automation flags and keep fingerprints consistent with the user agent: fingerprint spoofing.
- Avoid traps. Never follow hidden links, fill hidden form fields or wander into endless URL spaces: honeypots and crawler traps.
- Back off by the numbers. On a 429 or 503, wait the
Retry-Aftertime if the response sends one: it holds either a number of seconds (Retry-After: 120) or an HTTP date (Retry-After: Wed, 28 Oct 2026 07:28:00 GMT), so parse both (MDN: Retry-After); otherwise wait 2, 4, 8, then 16 seconds with random jitter, and give up on the URL after 5 tries. After a 403 or a CAPTCHA, wait longer (20, 40, then 80 seconds, at most 3 tries) and continue on a new session. Never retry in a tight loop. Details: 429 errors, CAPTCHAs. - Monitor. Log status codes and response sizes per site; a rise in 403s or in tiny pages is the early warning.
IPs: rotation, sessions and the right type
The IP is the first thing a site checks and the easiest one to change.
- Residential IPs belong to home internet providers and look like ordinary visitors; they are the default for protected sites. Mobile IPs are shared by many phone users behind carrier NAT, so blocking one can lock out many real visitors; that makes them the next step for the strictest sites. Datacenter IPs cost less per GB ($0.29 down to $0.22 at ProxyField) but sit in ranges that sites can block by network. The types compared: types of proxies.
- Rotation gives each request a new IP, so no single address crosses a rate limit. ProxyField can give you a new IP on every request.
- Sticky sessions keep one IP for a set time, for logins, carts and paginated searches; ProxyField's last from 30 seconds to 36 hours.
- Location matters: many sites serve or block by country. ProxyField targets country, region and city, in 195+ countries and all 50 US states.
- IP ranges: sites and anti-bot services often block a whole subnet, or every range that belongs to a hosting provider, which is why datacenter proxies on one subnet can fail together. Residential IPs spread across many home internet providers and many ranges, so a range block hits far fewer of them.
- Google: the pool is clean for Google, checked and segmented. If you want Google results as data rather than pages, the Google SERP API returns the results page as JSON, at $1.20 down to $0.80 per 1,000 successful results.
A proxy changes the IP and nothing else. If headers, fingerprints or behavior give you away, a new IP only moves the block to the next request; the rest of this checklist matters as much.
Headless browsers and stealth plugins
A headless browser renders JavaScript like a real browser, but out of the box it leaves automation traces such as navigator.webdriver set to true. Stealth plugins patch the best-known traces.
| Tool | Stealth add-on | What it does |
|---|---|---|
| Puppeteer (Node.js) | puppeteer-extra with puppeteer-extra-plugin-stealth | A set of evasions for headless Chrome's known tells |
| Playwright (Node.js) | playwright-extra with the same stealth plugin | The Puppeteer evasions, through Playwright |
| Playwright (Python) | playwright-stealth | A port of the same evasions for Python |
| Selenium (Python) | selenium-stealth | Similar patches for Selenium with Chrome or Chromium |
A minimal Playwright example in Node.js, with a ProxyField residential IP in New York:
// npm install playwright playwright-extra puppeteer-extra-plugin-stealth
const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();
chromium.use(stealth);
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyfield.io:7000',
username: '<login>-country-us-city-new_york',
password: '<password>',
},
});
const page = await browser.newPage();
await page.goto('https://api.ipify.org');
console.log(await page.textContent('body')); // the proxy's IP
await browser.close();
})();Region, session and session time go in the same username: -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default), as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600; every part after the login is optional.
Does playwright-stealth or puppeteer-extra-plugin-stealth still work?
Not reliably. The Node.js puppeteer-extra-plugin-stealth has had no release since 2.11.2 on March 1, 2023, and stealth plugins pass simple checks and public bot-test pages but, on their own, not a dedicated anti-bot service such as Cloudflare or DataDome. The Python playwright-stealth is maintained (2.0.3, April 4, 2026), and its own README warns it handles only "the simplest of bot detection methods". The Puppeteer plugin patches named traces of headless Chrome, with evasion modules such as navigator.webdriver, navigator.plugins, chrome.runtime, iframe.contentWindow, webgl.vendor, user-agent-override and window.outerdimensions. Its README says it passes "all public bot tests" (it links bot.sannysoft.com) and names the fpscanner, Intoli and areyouheadless tests. The same README calls the work "a rather interesting cat and mouse game", says "it's probably impossible to prevent all ways to detect headless chromium", and sets a narrower goal: to make detection so difficult "that it becomes cost-prohibitive or triggers too many false-positives". On reCAPTCHA v3 it says stealth "seems to help with maintaining a normal reCAPTCHA v3 score", calls the evidence "anecdotal observations", and warns that the score "is calculated individually per site". The Python playwright-stealth README is blunter: "Don't expect this to bypass anything but the simplest of bot detection methods."
Passing a public test page is not passing Cloudflare or DataDome, which also score the TLS handshake, the IP's reputation, the request rate and behavior. Cloudflare's bot detection engines, for example, run heuristics on every request, a machine-learning model that gives each request a bot score from 1 to 99, and optional JavaScript detections that, in Cloudflare's words, identify "headless browsers and other malicious fingerprints".
The same setup in Python with playwright-stealth 2.x (its Stealth().use_async wrapper applies the evasions to every page) and a ProxyField IP in New York:
# pip install playwright playwright-stealth && playwright install chromium
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import Stealth
PROXY = {"server": "http://gate.proxyfield.io:7000",
"username": "<login>-country-us-city-new_york", "password": "<password>"}
async def main():
async with Stealth().use_async(async_playwright()) as p:
browser = await p.chromium.launch(proxy=PROXY)
page = await browser.new_page()
print(await page.evaluate("navigator.webdriver")) # no longer True once stealth is applied
await page.goto("https://api.ipify.org")
print(await page.text_content("body")) # the proxy's IP
await browser.close()
asyncio.run(main())| What stealth patches can fix | What they cannot change |
|---|---|
navigator.webdriver set to true | The TLS and HTTP/2 fingerprint of the connection |
HeadlessChrome in the user agent | The IP's network and reputation |
Missing plugins, languages and chrome.runtime objects | Your request rate and timing |
| WebGL vendor and window-size tells | Behavior: navigation order, no scrolling, deep links |
Maintenance, from the npm and PyPI registries on October 27, 2026 (the release dates are the registries', not the READMEs'):
| Package | Latest version | Released |
|---|---|---|
puppeteer-extra-plugin-stealth (npm) | 2.11.2 | March 1, 2023 |
playwright-extra (npm) | 4.3.6 | March 1, 2023 |
playwright-stealth (PyPI) | 2.0.3 | April 4, 2026 |
selenium-stealth (PyPI) | 1.0.6 | November 5, 2020 |
The Node.js plugins and selenium-stealth have had no release since 2023 or earlier, while browsers and detection keep changing; playwright-stealth for Python had a release in 2026. Use any of them together with residential IPs, real headers and calm pacing, not instead of them. More: can Playwright, Puppeteer and Selenium be detected, and the setup guides for Playwright, Puppeteer and Selenium.
CAPTCHAs and challenge pages
A CAPTCHA or "checking your browser" page means the site's protection has already scored your request as suspicious. The better answer is to avoid the score that triggers it, through the checklist above, rather than to solve challenges at scale. The guides:
- How to avoid and solve CAPTCHAs when scraping and CAPTCHA solver services compared.
- CAPTCHA proxies: how the IP type changes how often challenges appear.
- Why Cloudflare thinks you are a bot, scraping sites behind Cloudflare and Cloudflare error codes.
- DataDome, PerimeterX and hCaptcha challenges.
How often a site challenges you depends on your whole request, not only the IP.
How to spot and avoid honeypot links and crawler traps
Follow only links a person could see, normalize and deduplicate URLs, cap depth and pages per site, skip what robots.txt disallows, and never follow links that change something. That covers the two kinds of trap a crawler meets.
Honeypots are links or form fields that real visitors never see, placed so that only a bot follows them. Typical forms: links hidden with CSS (display: none, visibility: hidden, zero size, off-screen), links in the same color as the background, and hidden form inputs. A scraper that follows every href on a page walks into them and gets its IP flagged.
Crawler traps are URL spaces with no end, often not built as traps at all: calendars with a "next month" link forever, search results that link to more searches, filter combinations that multiply, and session IDs or timestamps in the query string that make every visit a "new" URL.
| Check | Rule |
|---|---|
| Visibility | Follow only links a person could see and click; skip elements hidden by CSS, zero-size or off-screen |
| Forms | Never fill hidden form fields |
robots.txt | Skip disallowed paths. RFC 9309 says its rules "are not a form of access authorization": they are the site's request, and following them keeps you out of the areas it marks off |
| Actions | Never follow links that change state, such as logout, delete, add to cart or buy, with a GET request |
| URL shape | Normalize URLs (lowercase host, drop fragments, sort query parameters, drop session and tracking parameters) and skip any URL you have already seen |
| Limits | Cap crawl depth, pages per host and query parameters per URL; stop a path whose URLs keep growing |
| Start point | Crawl from the sitemap or a known URL pattern instead of following every link |
How a trap shows up in your logs, so you can stop it while the crawl runs:
- one path keeps growing: thousands of queued URLs under
/calendar/or/search/while the rest of the site has hundreds; - URLs that differ only in a query parameter (
?page=,?sort=,?date=, a session ID) return pages of the same size and content; - the URL gets longer with each hop, with repeated path segments such as
/a/b/a/b/a/; - the queue grows faster than pages are fetched, long after the sitemap's URLs are done;
- one IP, or every IP at once, starts getting 403s right after the crawler fetched a URL no visible link points to: a honeypot.
Stop a path when it passes your cap, for example 500 pages per path prefix, and review it by hand.
This Playwright (Python) check keeps only the links a visitor can see, then applies the URL rules before a link enters the queue:
from urllib.parse import urlsplit, urlunsplit, parse_qsl, urlencode
VISIBLE_LINKS = """els => els.filter(a => {
const s = getComputedStyle(a), r = a.getBoundingClientRect();
return s.display !== 'none' && s.visibility !== 'hidden' && s.opacity !== '0'
&& r.width > 0 && r.height > 0 && r.right > 0 && r.bottom > 0;
}).map(a => a.href)"""
VISIBLE_INPUTS = """els => els.filter(i => {
const s = getComputedStyle(i), r = i.getBoundingClientRect();
return i.type !== 'hidden' && s.display !== 'none' && s.visibility !== 'hidden'
&& s.opacity !== '0' && r.width > 0 && r.height > 0;
}).map(i => i.name)"""
DROP_PARAMS = {"sessionid", "sid", "phpsessid", "utm_source", "utm_medium", "utm_campaign"}
ACTION_SEGMENTS = {"logout", "signout", "delete", "remove", "cart", "add-to-cart", "checkout", "buy"}
MAX_DEPTH, MAX_PARAMS = 5, 4 # example defaults: tune them per site
def normalize(url):
p = urlsplit(url)
query = sorted((k, v) for k, v in parse_qsl(p.query) if k.lower() not in DROP_PARAMS)
return urlunsplit((p.scheme, p.netloc.lower(), p.path or "/", urlencode(query), ""))
def next_links(page, depth, seen, allowed_by_robots):
if depth >= MAX_DEPTH:
return []
out = []
for href in page.eval_on_selector_all("a[href]", VISIBLE_LINKS):
url = normalize(href)
segments = set(urlsplit(url).path.lower().strip("/").split("/"))
if (url in seen or len(parse_qsl(urlsplit(url).query)) > MAX_PARAMS
or segments & ACTION_SEGMENTS # whole path segments only: /cart, not /carter
or not allowed_by_robots(url)):
continue
seen.add(url)
out.append(url)
return out
def fields_to_fill(page, form_selector="form"):
# the names of the inputs a visitor can see; leave every other field empty, as a person would
return page.eval_on_selector_all(f"{form_selector} input[name], {form_selector} textarea[name]",
VISIBLE_INPUTS)Pass allowed_by_robots from Python's urllib.robotparser (RobotFileParser.can_fetch), and keep a page cap per host in the loop that calls it. When the crawler submits a search form, fill only the fields fields_to_fill returns; a hidden field that comes back filled is how many honeypot forms spot a bot. A parser such as BeautifulSoup sees only inline styles and the hidden attribute, not the site's CSS files, so use a browser where visibility matters.
What to do when you get blocked
When a site starts blocking you, step back before you push harder.
-
Stop and look at the response
A 403 page, a 429 with
Retry-After, a CAPTCHA or a 200 with an empty page each mean something different: proxy errors, 403 errors. -
Lower the rate
And widen the pauses for that site.
-
Check the request
Against a real browser's: headers, cookies, TLS client.
-
Change the IP type
If datacenter IPs are refused: residential first, mobile for the strictest sites.
-
Switch to a browser
If the content needs JavaScript or the site sends a JavaScript check.
-
Consider a scraping API
If you would rather not run the browsers yourself: scraper API vs proxies. The ProxyField Web Scraping API fetches any URL, with JS rendering when the page needs it, billed on successful results only.
Change one thing at a time and measure the success rate after each step. If a site still refuses after all of this, stop: it is telling you it does not want automated visitors, and its terms may say the same.
Stay within the rules
Avoiding blocks is about not overloading sites and not looking like an attacker; it is not a license to take data you are not allowed to take. Scrape public pages, respect robots.txt and rate limits, never use logins you are not entitled to, and read what data is legal and safe to scrape. ProxyField's acceptable use policy forbids attacks, fraud, spam and access to data behind logins you are not entitled to.
Guides on avoiding blocks
- IPs: why is my IP address blocked, can websites detect proxies, CAPTCHA proxies.
- Headers: HTTP headers for web scraping, what is a user agent, user agents for scraping.
- Fingerprints: what is a browser fingerprint, browser fingerprinting in scraping, TLS and TCP fingerprinting, fingerprint spoofing.
- CAPTCHAs: avoid and solve CAPTCHAs, CAPTCHA solver services, CAPTCHA solver extensions, CAPTCHA providers compared, DataDome, PerimeterX and hCaptcha.
- Cloudflare: why Cloudflare thinks you are a bot, scraping behind Cloudflare, human verification extensions.
Sources
Checked on October 27, 2026:
- puppeteer-extra-plugin-stealth README and playwright-extra README; versions and dates from the npm registry.
- playwright-stealth (Python) README; version and date from PyPI.
- selenium-stealth README; version and date from PyPI.
- RFC 9309: Robots Exclusion Protocol (September 2022).
- MDN: HTTP conditional requests.
- MDN: Retry-After.
- Cloudflare: bot detection engines.
Blocks and anti-bot FAQ
How do I avoid getting blocked while web scraping?
ProxyField's rule from 412M+ residential IPs: keep the load low and look like an ordinary visitor. Rotate IPs across requests, start at one request every few seconds per site with jitter, send a real browser's full headers, keep each session on one IP and one cookie jar, render JavaScript only where the page needs it, and back off on the first 403, 429 or CAPTCHA (2, 4, 8, then 16 seconds) instead of retrying hard. ProxyField residential proxies cost from $1.95/GB, with a 99.6% success rate according to our service data.
What are web scraping practices to evade blockers?
The practices that work are the ones that make you look like a calm, ordinary visitor: modest request rates with jitter, residential IP rotation, realistic and consistent headers, a real browser for JavaScript pages, and no hidden-link crawling. Pair them with respect for robots.txt and the site's terms, which keeps you clear of the blocks aimed at abusive traffic.
How do I crawl a website without getting blocked?
Crawl from the sitemap or a known URL pattern, limit concurrency per host, honor robots.txt and any crawl delay, and spread requests over rotating IPs. Cache what you have already fetched so a re-crawl requests only new or changed pages.
Why do websites block web scrapers?
To protect their servers from load, their content and prices from competitors, and their users' accounts from abuse such as credential stuffing. Most blocking is automatic: a bot-protection service scores each request and blocks or challenges the ones that look automated.
How does bot detection affect web scraping?
It decides whether your request gets the real page, a challenge or an error. Detection combines the IP's network and reputation, the request rate, headers, the TLS fingerprint and, in browsers, JavaScript checks, so a scraper has to look ordinary on all of them, not just one.
How do I reduce bot detection when web scraping?
Remove the signals detection relies on rather than attacking the protection: use residential IPs, a real browser's headers and TLS handshake, a full browser with stealth patches for JavaScript checks, and human-like pacing. If a site still challenges every request, use its API, a scraping API or a slower schedule, or leave it.
How do I avoid getting blocked while scraping websites, beyond just adding proxies?
A proxy changes only the IP, so fix the other signals too: follow robots.txt, start at one request every few seconds per site with jitter, cache pages and send If-None-Match or If-Modified-Since so unchanged pages return 304, and send headers that fit the site. On a 429, wait the Retry-After time, or 2, 4, 8 and 16 seconds, at most 5 tries. Keep one IP and one cookie jar per session, use a real browser only for JavaScript pages, and skip hidden links and endless URL spaces.
My scraper got blocked. What should I do?
Stop sending from that IP, read the response (403, 429, CAPTCHA or an empty page), and lower the rate. Then compare your request with a real browser's, switch datacenter IPs for residential ones if they are refused, and resume slowly with retries and backoff.
How often can I scrape without getting blocked?
There is no universal number: it depends on the site's limits and your IPs. Start at one request every few seconds per IP with random pauses, watch the share of 403 and 429 responses, and raise the rate only while it stays near zero; with rotation, the per-IP rate stays low as the total grows.
Does playwright-stealth or puppeteer-extra-plugin-stealth still keep a headless scraper from being flagged as a bot?
Not reliably. The Node.js plugin's latest release, 2.11.2, dates from March 1, 2023; they hide traces such as navigator.webdriver and pass public test pages like bot.sannysoft.com, but not Cloudflare or DataDome on their own, and the Puppeteer plugin's author calls preventing all detection "probably impossible". They don't change your TLS handshake, IP reputation or behavior, so pair them with residential IPs and calm pacing; the Python playwright-stealth (2.0.3, April 2026) is maintained but warns it handles only the simplest checks.
Show 7 more questionsShow fewer questions
How does the Puppeteer stealth plugin hide automation?
It runs a set of evasions before each page loads: it removes navigator.webdriver, fills in browser objects and properties that headless Chrome lacks, and fixes details such as the Accept-Language header. You load it through puppeteer-extra with puppeteer.use(StealthPlugin()), or through playwright-extra for Playwright.
How do I avoid bot detection with Selenium?
Remove the automation switches (excludeSwitches: enable-automation), use a patched driver or the selenium-stealth package, and run a full rather than headless browser where possible. Keep the window size, language and time zone consistent with your user agent and IP location, and route the browser through rotating residential IPs in the site's country with natural timing. Proxy setup for Selenium is in our Selenium guide.
How do I spot and avoid honeypot links and other traps when crawling a website?
Follow only links a person could see: skip links hidden with CSS (display: none, zero size, off-screen, colored like the background) and never fill hidden form fields. Against endless URL spaces such as calendars and search pages, normalize and deduplicate URLs and cap depth, pages per host and query parameters, for example a depth of 5 and at most 4 query parameters per URL. Skip paths robots.txt disallows, never follow logout, delete or buy links with a GET, and stop any path whose URL count keeps growing in your logs.
Why does Google block my scraper?
Google limits automated queries and checks the IP, the request rate and the client, so a script sending many searches from one IP soon meets an "unusual traffic" page. Spread queries over rotating residential IPs, keep the rate per IP low and send a real browser's headers. If you need the results as data, the ProxyField Google SERP API returns the results page as JSON, at $1.20 down to $0.80 per 1,000 successful results.
Can a website block an entire IP range?
Yes. Sites and anti-bot services often block a whole subnet or every range that belongs to a hosting provider, which is why datacenter proxies on one subnet can fail together. Residential IPs belong to many home internet providers and spread across many ranges, so a range block hits far fewer of them.
Does Node Unblocker help with web scraping?
Only a little. Node Unblocker is an open-source web proxy for Node.js that fetches pages through your own server and rewrites their links, so every request still leaves from that server's single IP. It can help with testing or with reaching a page from your server's location, but it adds no IP rotation, so it does not stop rate limits or IP blocks.
How do I check whether my proxy leaks my real IP in its headers?
Send a request through the proxy to a page that echoes the headers it receives and look for your own IP in X-Forwarded-For, Forwarded, Via or X-Real-IP; also check that the IP shown is the proxy's. The proxy checker runs the same test in a browser.
Every guide in this series
- What Is a Browser Fingerprint?
- CAPTCHA Solver Services and APIs Compared
- How to Avoid and Solve CAPTCHAs When Scraping
- How to Bypass Cloudflare When Scraping
- Cloudflare Human Verification Bypass Extensions
- How to Unblock Cloudflare: Why Cloudflare Thinks You Are a Bot
- Why Is My IP Address Blocked?
- HTTP Headers for Web Scraping
- Captcha Solver Extensions for Chrome
- Browser Fingerprinting in Web Scraping
- TLS (JA3/JA4) and TCP Fingerprinting
- CAPTCHA Providers Compared: reCAPTCHA, GeeTest, Yandex
- Residential Proxy Detection: Can Websites Detect Proxies?
- DataDome CAPTCHA and Blocks, With PerimeterX and hCaptcha
- List of User Agents for Scraping
- What Is a User Agent?
- Fingerprint Spoofing: Will Websites Notice Fake Values?
- Canvas and WebGL Fingerprinting
- Blacklisted IP Address: Why It Happens and How to Get Removed
- CAPTCHA Proxies: How Proxies Reduce CAPTCHAs
- Web Scraping Without Getting Blocked in Python
- Does CAPTCHA Stop Bots? The CAPTCHA Types Scrapers Meet
- Can Residential Proxies Prevent IP Bans? What They Can and Cannot Fix
Related pages
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.