w3.org returns HTTP 403 to a browser User-Agent string and 200 to plain curl — a detection rule pointed the opposite way from the ones this page is about.This is an old revision of the document!
A crawl that is blocked does not fail loudly. It returns a page, a status code and a timestamp, and your pipeline records all three. What it does not record is that the page you got is not the page a person gets — and every number you compute downstream inherits that difference without carrying a flag for it.
This page is about that difference: what makes an automated client identifiable, what happens when it is identified, and what a reviewer will expect you to have measured. It is not an anti-detection cookbook. Evading a site's access controls is a research-ethics decision before it is an engineering one, and it belongs on Ethics. The advice here points the other way: measure the obstruction and report it, because the obstruction is data about your sample, and the sample is what your paper is actually about.
Three neighbours cover adjacent ground. Crawler compares the libraries that drive a browser and how visible each is. Crawling location covers the one detection input you choose before you write any code — where your packets come from. LLM Agents covers a different surface entirely: an LLM-driven agent is detected, and blocked, by mechanisms aimed at a category that did not exist when most of this literature was written.
The reason to care is not that you lose sites. It is which sites you lose.
Bot management is not deployed at random. It is bought by sites with something to protect and the budget to protect it: large e-commerce, banking, ticketing, travel, social platforms, anything behind an enterprise CDN. Those are disproportionately the high-ranked, high-traffic sites — the ones your top-N list oversamples on purpose, and the ones whose behaviour your paper is most likely to be about. A 10% non-load rate that falls entirely on the top 2,000 sites is not 10% noise; it is a systematic hole exactly where your signal is.
That last step is an inference, not a measurement, and this page is careful about saying so: no paper in this corpus reports a block rate broken down by popularity rank. It follows from where the products are sold and it is consistent with the shape of the losses individual papers report, and it is the first of the open questions below. What is measured is everything after it.
Ahmad et al. [1Ahmad, Syed Suleman; Dar, Muhammad Daniyal; Zaffar, Muhammad Fareed; Vallina-Rodriguez, Narseo; Nithyanand, Rishab (2020): "Apophanies or Epiphanies? How Crawlers Impact Our Understanding of the Web", in: Proceedings of The Web Conference, pp. 271-280. (DOI)] make the general form of this argument: what a crawler sees is a function of how the crawler is built, and conclusions drawn from crawl data can be artefacts of the instrument. Jueckstock et al. [2Jueckstock, Jordan; Sarker, Shaown; Snyder, Peter; Beggs, Aidan; Papadopoulos, Panagiotis; Varvello, Matteo; Livshits, Benjamin; Kapravelos, Alexandros (2021): "Towards Realistic and Reproducible Web Crawl Measurements", in: Proceedings of the ACM Web Conference. (DOI)] measured the specific version of it — crawl configuration and vantage point change what the web shows you — and Zeber et al. [3Zeber, David; Bird, Sarah; Oliveira, Camila; Rudametkin, Walter; Segall, Ilana; Wolls´en, Fredrik; Lopatka, Martin (2020): "The Representativeness of Automated Web Crawls as a Surrogate for Human Browsing", in: Proceedings of The Web Conference 2020, pp. 167–178. Association for Computing Machinery, New York, NY, USA. (DOI) (Link)] measured how far automated crawls diverge from real human browsing. Annamalai et al. [4Annamalai, Meenatchi Sundaram Muthu Selva; De Cristofaro, Emiliano; Bilogrevic, Igor (2025): "Beyond the Crawl: Unmasking Browser Fingerprinting in Real User Interactions", in: Proceedings of the ACM Web Conference. (DOI)] ran the comparison again in 2025 with real users alongside a crawler and found the crawler's failures concentrated in 4XX responses tied to bot detection.
Four shapes of obstruction, in increasing order of danger:
| Shape | What you get | Why it ranks here |
|---|---|---|
| Hard block | HTTP 403, 429, a connection reset, or an “Access Denied” page | Loud. Your pipeline sees a non-200 and you can count it. |
| Interactive challenge | A CAPTCHA, a JavaScript challenge, an interstitial | Loud if you look. A challenge page is HTTP 200 with a full DOM, so a crawler that only checks the status code records it as a successful visit. |
| Degraded response | The page loads, but third-party scripts, ads or personalisation do not | Quiet. You measure “this site has fewer trackers” and publish it. |
| Cloaking | A different, plausible page, served only to you | Silent and indistinguishable from a finding. This is the one that ends up in the abstract. |
Cloaking is not hypothetical and it is not confined to phishing. Wang et al. [5Wang, David Y.; Savage, Stefan; Voelker, Geoffrey M. (2011): "Cloak and dagger: dynamics of web search cloaking", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] characterised search cloaking as far back as 2011; Invernizzi et al. [6Invernizzi, Luca; Thomas, Kurt; Kapravelos, Alexandros; Comanescu, Oxana; Picod, Jean-Michel; Bursztein, Elie (2016): "Cloak of Visibility: Detecting When Machines Browse a Different Web", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] built the canonical measurement of it, showing systematic serving of different content to machines; Zhang et al. [7Zhang, Penghui; Oest, Adam; Cho, Haehyun; Sun, Zhibo; Johnson, RC; Wardman, Brad; Sarker, Shaown; Kapravelos, Alexandros; Bao, Tiffany; Wang, Ruoyu; Shoshitaishvili, Yan; Doupé, Adam; Ahn, Gail-Joon (2021): "CrawlPhish: Large-scale Analysis of Client-side Cloaking Techniques in Phishing", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] measured client-side cloaking specifically aimed at security crawlers; and Szurdi et al. [8Szurdi, Janos; Luo, Meng; Kondracki, Brian; Nikiforakis, Nick; Christin, Nicolas (2021): "Where are you taking me?Understanding Abusive Traffic Distribution Systems", in: Proceedings of the ACM Web Conference. (DOI)] showed the quantitative form directly — driving the same traffic distribution systems with a crawler persona and a human persona, the crawler was explicitly blocked 5 percentage points more often, and covertly blocked — sent to a parked or error page — at least 8 points more often. The covert number is larger than the overt one. That is the whole problem in one measurement.
The practical consequence. A status-code check is not a load check. If your
pipeline's definition of “successfully crawled” is response.status == 200, you are
counting challenge pages, interstitials and cloaked pages as successes, and their
content is flowing into your denominators.
A bot-management product does not run one test. It scores a request against signals from several layers at once, and the layers differ in how cheap they are to read and how much you can do about them. Ordered from the network up:
| Layer | What it reads | How much it costs the site | What you can honestly do |
|---|---|---|---|
| Network | ASN and IP reputation, datacenter vs residential vs mobile address space, request rate per address | Nothing — it is a lookup | Choose the vantage point deliberately and report it. See Crawling location. |
| Transport | The TLS ClientHello fingerprint (JA3/JA4): cipher order, extension order, ALPN | Nothing — the handshake is already parsed | Nothing, if you use a normal browser. A raw HTTP client fingerprints as a raw HTTP client. |
| HTTP | Header set, header order, HTTP/2 SETTINGS and priority frames, User-Agent coherence | Nothing | Drive a real browser rather than an HTTP library. |
| Browser runtime | navigator.webdriver, missing or extra JS APIs, headless-specific values, CDP artefacts, fingerprint self-contradictions | One script execution | This is where a headless/headful choice and a driver choice actually land. |
| Behaviour | Mouse movement, scroll, timing between actions, dwell time, navigation graph | Telemetry over a session | Interact realistically if your research question needs interaction — see Interaction. |
| Challenge | Whatever the client does when handed a CAPTCHA, a proof-of-work puzzle or a JS challenge | User friction, so it is reserved for suspicious scores | Detect it and count it. |
This is the layer the literature has actually studied, and the layer that has moved most.
navigator.webdriver is a specification, not a bug. WebDriver Level 1 has been a W3C Recommendation since 05 June 2018 and defines the property as returning true when the browser's webdriver-active flag is set; Level 2 is still a Working Draft, dated 02 July 2026, and carries the same definition.1) Any Selenium, Puppeteer or Playwright session sets it by default. It is the single cheapest automation check in existence and the field barely discusses it: 11 papers in the whole corpus name it.–enable-automation and the “controlled by automated test software” infobar are both present in the Chromium tree today.2)chrome-headless-shell binary; plain –headless now selects a unified mode that shares its code with headful Chrome.3) Playwright still ships a regular Chromium for headed runs and a separate headless shell for headless ones.4) So “we ran headless Chrome” is now an ambiguous sentence, and which binary you meant changes how detectable you were. Only 12.5% of crawling papers say headless or headful at all.The corpus rewards methods that were written up, which biases any ranking toward whatever was fashionable mid-window. Dating each strand explicitly:
| Strand | Peak in this corpus | Status now |
|---|---|---|
| Breaking text CAPTCHAs with a bespoke solver | 2010–2020 | Superseded as a research question. Shi et al. [13Shi, Chenghui; Ji, Shouling; Liu, Qianjun; Liu, Changchang; Chen, Yuefeng; He, Yuan; Liu, Zhe; Beyah, Raheem; Wang, Ting (2020): "Text Captcha Is Dead? A Large Scale Deployment and Empirical Study", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] asked whether text CAPTCHA was dead in 2020; the answer settled. |
| Cloaking measurement against security crawlers | 2011–2022 | Still current, still under-cited outside phishing research. [5Wang, David Y.; Savage, Stefan; Voelker, Geoffrey M. (2011): "Cloak and dagger: dynamics of web search cloaking", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] [6Invernizzi, Luca; Thomas, Kurt; Kapravelos, Alexandros; Comanescu, Oxana; Picod, Jean-Michel; Bursztein, Elie (2016): "Cloak of Visibility: Detecting When Machines Browse a Different Web", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] [7Zhang, Penghui; Oest, Adam; Cho, Haehyun; Sun, Zhibo; Johnson, RC; Wardman, Brad; Sarker, Shaown; Kapravelos, Alexandros; Bao, Tiffany; Wang, Ruoyu; Shoshitaishvili, Yan; Doupé, Adam; Ahn, Gail-Joon (2021): "CrawlPhish: Large-scale Analysis of Client-side Cloaking Techniques in Phishing", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] [14Zhang, Penghui; Sun, Zhibo; Kyung, Sukwha; Behrens, Hans Walter; Basque, Zion Leonahenahe; Cho, Haehyun; Oest, Adam; Wang, Ruoyu; Bao, Tiffany; Shoshitaishvili, Yan; Ahn, Gail-Joon; Doupé, Adam (2022): "I'm SPARTACUS, No, I'm SPARTACUS: Proactively Protecting Users from Phishing by Intentionally Triggering Cloaking Behavior", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] |
| Using a human-verification step as the cloak | 2020–2024 | Current, and the reason a CAPTCHA is not only your problem. Maroofi et al. [15Maroofi, Sourena; Korczynski, Maciej; Duda, Andrzej (2020): "Are You Human?: Resilience of Phishing Detection to Evasion Techniques Based on Human Verification", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] showed phishing pages putting a human-verification step in front of content specifically to defeat detection crawlers; Teoh et al. [16Teoh, Xiwen; Lin, Yun; Liu, Ruofan; Huang, Zhiyong; Dong, Jin Song (2024): "PhishDecloaker: Detecting CAPTCHA-cloaked Phishing Websites via Hybrid Vision-based Interactive Models", in: Proceedings of the USENIX Security Symposium. (Link)] built the counter-measurement. |
| Server-side bot classification from request logs | 2020–2022 | Current but industrial. [17Jan, Steve T. K.; Hao, Qingying; Hu, Tianrui; Pu, Jiameng; Oswal, Sonal; Wang, Gang; Viswanath, Bimal (2020): "Throwing Darts in the Dark? Detecting Bots with Limited Data using Neural Data Augmentation", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] [18Li, Xigao; Azad, Babak Amin; Rahmati, Amir; Nikiforakis, Nick (2021): "Good Bot, Bad Bot: Characterizing Automated Browsing Activity", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] [19Herley, Cormac (2022): "Automated Detection of Automated Traffic", in: Proceedings of the USENIX Security Symposium. (Link)] |
| Browser-fingerprint inconsistency detection | 2018–2025 | Current state of the art. [9Vastel, Antoine; Laperdrix, Pierre; Rudametkin, Walter; Rouvoy, Romain (2018): "Fp-Scanner: The Privacy Implications of Browser Fingerprint Inconsistencies", in: Proceedings of the USENIX Security Symposium. (Link)] [10Wu, Shujiang; Sun, Pengfei; Zhao, Yao; Cao, Yinzhi (2023): "Him of Many Faces: Characterizing Billion-scale Adversarial and Benign Browser Fingerprints on Commercial Websites", in: Proceedings of the Network and Distributed System Security Symposium. (Link)] [11Venugopalan, Hari; Munir, Shaoor; Ahmed, Shuaib; Wang, Tangbaihe; King, Samuel T.; Shafiq, Zubair (2025): "FP-Inconsistent: Measurement and Analysis of Fingerprint Inconsistencies in Evasive Bot Traffic", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] |
| CAPTCHA solved by a general-purpose model | 2023–2026 | The live front. [20Searles, Andrew; Nakatsuka, Yoshimichi; Ozturk, Ercan; Paverd, Andrew; Tsudik, Gene; Enkoji, Ai (2023): "An Empirical Study & Evaluation of Modern CAPTCHAs", in: Proceedings of the USENIX Security Symposium. (Link)] [21Teoh, Xiwen; Lin, Yun; Li, Siqi; Liu, Ruofan; Sollomoni, Avi; Harel, Yaniv; Dong, Jin Song (2025): "Are CAPTCHAs Still Bot-hard? Generalized Visual CAPTCHA Solving with Agentic Vision Language Model", in: Proceedings of the USENIX Security Symposium. (Link)] [22Qi, Minfeng; He, Dongyang; Wang, Qin; Zhang, Lefeng (2026): "VIPER Strike: Defeating Visual Reasoning CAPTCHAs via Structured Vision–Language Inference", in: Proceedings of the USENIX Security Symposium. (Link)] |
| Blocking crawlers because they are AI training crawlers | 2025–2026 | New, and orthogonal to everything above. [23Liu, Enze; Luo, Elisa; Shan, Shawn; Voelker, Geoffrey M.; Zhao, Ben Y.; Savage, Stefan (2025): "Somesite I Used To Crawl: Awareness, Agency and Efficacy in Protecting Content Creators From AI Crawlers", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] [24Cui, Jian; Zha, Mingming; Wang, XiaoFeng; Liao, Xiaojing (2025): "The Odyssey of robots.txt Governance: Measuring Convention Implications of Web Bots in Large Language Model Services", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] [25Kim, Taein; Bock, Karstan; Luo, Claire; Liswood, Amanda; Poroslay, Chloe; Wenger, Emily (2025): "Scrapers Selectively Respect robots.txt Directives: Evidence From a Large-Scale Empirical Study", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] |
The last two rows rest on the corpus's thinnest years — 2025 and 2026 are provisional here (see Use in Publications below) — so treat them as a direction of travel rather than as settled counts. But the direction is not ambiguous: Teoh et al. [21Teoh, Xiwen; Lin, Yun; Li, Siqi; Liu, Ruofan; Sollomoni, Avi; Harel, Yaniv; Dong, Jin Song (2025): "Are CAPTCHAs Still Bot-hard? Generalized Visual CAPTCHA Solving with Agentic Vision Language Model", in: Proceedings of the USENIX Security Symposium. (Link)] solved visual CAPTCHAs with an agentic vision-language model, and Qi et al. [22Qi, Minfeng; He, Dongyang; Wang, Qin; Zhang, Lefeng (2026): "VIPER Strike: Defeating Visual Reasoning CAPTCHAs via Structured Vision–Language Inference", in: Proceedings of the USENIX Security Symposium. (Link)] did the same for visual reasoning CAPTCHAs. Meanwhile Searles et al. [20Searles, Andrew; Nakatsuka, Yoshimichi; Ozturk, Ercan; Paverd, Andrew; Tsudik, Gene; Enkoji, Ai (2023): "An Empirical Study & Evaluation of Modern CAPTCHAs", in: Proceedings of the USENIX Security Symposium. (Link)] measured what CAPTCHAs cost the humans — 1,400 participants solving 14,000 CAPTCHAs, with solving time and preference varying sharply by type. Read together, those are the two halves of why a site reserves a challenge for a suspicious score rather than showing it to everyone. Nguyen et al. [26Nguyen, Hoang Dai; Subramani, Karthika; Acharya, Bhupendra; Perdisci, Roberto; Vadrevu, Phani (2024): "C-Frame: Characterizing and measuring in-the-wild CAPTCHA attacks", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] measured in-the-wild CAPTCHA abuse from the other direction. Designing a study around “the CAPTCHA will stop the adversary” is dated; designing one around “the CAPTCHA will stop us” is still true, and is the reason it costs you sites.
Your crawler cannot ask why it failed. It can only classify what came back. These are the discriminable cases:
| Symptom | Likely cause | How to tell |
|---|---|---|
| HTTP 403 with a short body | Edge block on IP or ASN reputation | Re-request the same URL from a second vantage point. If it succeeds, it is you, not the site. See Crawling location. |
| HTTP 429, or 403 after n requests | Rate limiting | Back off and retry with a longer interval. If it succeeds, it is rate, not identity. |
| HTTP 200, small DOM, a challenge phrase, a meta-refresh or a script that reloads | JavaScript or proof-of-work challenge | Match the body against a small set of challenge markers, and check whether the final URL equals the requested one. |
| HTTP 200, a visible CAPTCHA widget | Interactive challenge | Look for the widget's own script origin or iframe rather than for the word “CAPTCHA”, which appears on plenty of ordinary pages. |
| HTTP 200, plausible page, but no third-party requests at all | Degraded or cloaked response | Compare against a headful run, or a run from a different vantage point, on the same URL on the same day. |
| HTTP 200, plausible page, different from the human one | Cloaking | Only a differential comparison finds this. Nothing in the response says so. |
The general instrument for the bottom three rows is the same: the differential crawl. Fetch the same URL under two configurations that differ in one deliberate respect — headless vs headful, datacenter vs residential, your crawler's User-Agent vs a stock one — and diff the results. A systematic difference is a measurement of the site's discrimination on that axis; no difference is evidence, though not proof, that you were not singled out on it. Say which axis you varied, because “we ran a control” without it is unfalsifiable. Szurdi et al. [8Szurdi, Janos; Luo, Meng; Kondracki, Brian; Nikiforakis, Nick; Christin, Nicolas (2021): "Where are you taking me?Understanding Abusive Traffic Distribution Systems", in: Proceedings of the ACM Web Conference. (DOI)] and Liu et al. [23Liu, Enze; Luo, Elisa; Shan, Shawn; Voelker, Geoffrey M.; Zhao, Ben Y.; Savage, Stefan (2025): "Somesite I Used To Crawl: Awareness, Agency and Efficacy in Protecting Content Creators From AI Crawlers", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] both use exactly this design, and both use a control condition — sites that block everything — so that “blocks our crawler” is separated from “blocks this particular identity”.
The engineering instinct is to become harder to detect. The research instinct should be to make the obstruction a measured quantity. Four reasons the second is better:
The minimum viable version costs almost nothing:
The corpus's own stealth-tool trail is short and recent: 11 papers name a stealth patch, 9 of them ran a crawl, and none is earlier than 2021. Anyone following that trail today should know the state of what it points at, because the names in those papers have moved:
| Project | State on 2026-08-29 | What to know |
|---|---|---|
puppeteer-extra-plugin-stealth | newest npm release 2.11.2, published 2023-03-01; repo not archived, no code release since | The name most cited in the corpus, and the most stale. |
undetected-chromedriver | PyPI 3.5.5 (2024-02-17); repo last pushed 2025-07-05; publishes no GitHub Releases and no tags | Its own author has moved on — see the next row. |
nodriver | PyPI 0.50.3 (2026-05-13) | Its GitHub description reads “Successor of Undetected-Chromedriver” — the same author's own succession claim. AGPL-3.0. |
patchright | tag v1.62.0, repo pushed 2026-08-19 | A patched Playwright, drop-in. The actively maintained option at the time of writing. Apache-2.0. |
rebrowser-patches | tag 1.0.19 (2025-05-09), no commits since | Patches upstream Puppeteer and Playwright rather than forking them. |
selenium-stealth | PyPI 1.0.6 (2020-11-05); repo last pushed 2021-12-30 | Abandoned. No successor found. |
playwright-stealth | PyPI 2.0.3 (2026-04-04) | The package name stayed put and the code moved. The PyPI Homepage now points at Mattwmaster58/playwright_stealth; the original AtuboDad repo was last pushed 2024-07-29. |
| Camoufox | repo pushed 2026-08-26, MPL-2.0 | A patched Firefox rather than a patch on top of a driver. |
Two things this table is here to teach, neither of them about stealth. First, a
package's last release date is not its currency, and it fails in two different
directions here: undetected-chromedriver looks alive on GitHub but its own author's
successor is a differently-named project, while playwright-stealth looks stale under
its original repository and is in fact maintained — the package name stayed put and the
code moved to a different owner. Checking the name you already had would have got both
wrong. Second, if you cite one of these in a paper, cite the version you ran, because
the detection landscape it was written against no longer exists.
Useful mostly so you can recognise a challenge page and name the vendor in your methodology section. The market has consolidated hard, and papers that cite a vendor by its 2019 name are citing something that no longer exists under it:
| Product | Status on 2026-08-29 |
|---|---|
| Cloudflare Bot Management, Turnstile | Current. Turnstile went generally available 2023-09-29, with its “Managed” mode free for unlimited use; Cloudflare calls it a CAPTCHA alternative, not a CAPTCHA. |
| Akamai Bot Manager | Current. |
| DataDome, Kasada, Arkose Labs | Current and independent. |
| Imperva Advanced Bot Protection | Current — and this is where Distil Networks went: distilnetworks.com now redirects to Imperva's bot-management product page. Imperva itself has been part of Thales since 2023-12-04. |
| HUMAN Security | This is where PerimeterX went: perimeterx.com now redirects to humansecurity.com. |
| F5 Distributed Cloud Bot Defense | This is where Shape Security went; F5 announced completion of the acquisition in its own press release. |
| BotD (open source, MIT) | Current, from the Fingerprint team. The one you can actually read the source of, and the one Venugopalan et al. [11Venugopalan, Hari; Munir, Shaoor; Ahmed, Shuaib; Wang, Tangbaihe; King, Samuel T.; Shafiq, Zubair (2025): "FP-Inconsistent: Measurement and Analysis of Fingerprint Inconsistencies in Evasive Bot Traffic", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] used as one of their two detectors. |
| Anubis (open source, MIT) | A proof-of-work interstitial aimed specifically at AI scrapers; its own repository describes it as weighing “the soul of incoming HTTP requests to stop AI crawlers”. Newest tag v1.27.0. |
Everything above is about a site deciding whether a client is a human. Since 2025 there is a second question layered on top, with different economics: whether a client is an AI training or inference crawler, and whether it has paid. This matters to an academic crawler for a blunt reason — the defences aimed at AI crawlers do not distinguish you from them.
robots.txt; Kim et al. [25Kim, Taein; Bock, Karstan; Luo, Claire; Liswood, Amanda; Poroslay, Chloe; Wenger, Emily (2025): "Scrapers Selectively Respect robots.txt Directives: Evidence From a Large-Scale Empirical Study", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] measured whether scrapers respect its directives at all.robots.txt itself is RFC 9309, a Proposed Standard from September 2022, and nothing obsoletes or updates it.9) It expresses a preference; it does not enforce one, and it is not what blocks you.An LLM-driven agent browsing on a user's behalf is a third category again, detected by different signals and blocked under different rules. That is LLM Agents, not this page.
The figures below come from a structured extraction over 5,859 full-text papers from CCS, IMC, NDSS, PETS, USENIX Security, TheWebConf and IEEE S&P, 2010–2026. Unless stated otherwise the population is the 1,120 papers that ran a crawl. The 2025 and 2026 venue-years are provisional — CCS and IMC 2026 have not been held, and IEEE S&P and WWW 2026 abstracts are not yet in the selection source — so any per-year row reaching them is under-represented by construction. Methodology and limitations are at the end of this section.
This page's population is not a schema field. The extraction records what a paper did, not what was done to it, so “our crawler was blocked” appears nowhere in it. The population here is a full-text sweep over the papers' own sentences, and every one of its 138 candidates was then read by hand, because the sweep on its own is only 31.2% precise for the claim it is used to make.
| Verdict | Papers | Share of the 138 candidates | Share of the 1,120 crawled papers |
|---|---|---|---|
| Reports its own crawl obstructed, with a number | 22 | 15.9% | 2.0% |
| Reports its own crawl obstructed, no number | 21 | 15.2% | 1.9% |
| Describes mitigations, never says whether it happened | 38 | 27.5% | 3.4% |
| Sweep false positive — not about the authors' own collection | 57 | 41.3% | — |
So 43 of 1,120 crawling papers (3.8%) say their own crawl was obstructed, and 22 (2.0%) put a number on it. Counting generously, 81 papers (7.2%) engage with the question at all — the other 92.8% neither report obstruction nor say they took steps against it.
Those are floors, not estimates, because a sweep can only find a paper that wrote the sentence. To bound the gap, 24 crawling papers that the tight sweep did not flag but a separate, much wider recall probe did were audited the same way: 6 of the 24 were misses (3 of them quantified). Extrapolating over the 382 papers the recall probe hits gives roughly 96 missed papers, with a Wilson 95% interval of 46–172. So the honest statement is: at least 3.8% of crawling papers report obstruction, and the true share is plausibly 8–19%. Even the top of that range leaves four in five crawling papers silent, and even 19% is a floor — a crawl that was blocked and never wrote a sentence about it is invisible to both sweeps.
Nineteen of the 22, plus two more (marked †) that the recall audit turned up outside the 138 candidates and that are therefore not counted in the 22. Read the denominators. These are not comparable with one another — they are answers to different questions on different populations, and averaging them would be meaningless. What they are useful for is calibration: the plausible range on a general web crawl is roughly 1–15%, and the outliers are populations that are adversarial by construction.
| Paper | What was obstructed | Figure, with its denominator |
|---|---|---|
| Kaizer and Gupta, IMC 2016 [27Kaizer, Andrew J.; Gupta, Minaxi (2016): "Characterizing Website Behaviors Across Logged-in and Not-logged-in Users", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] | crawler blocked, or login required CAPTCHA | 75 of 420 selected sites (~17.9%) dropped |
| DeBlasio et al., IMC 2017 [28DeBlasio, Joe; Savage, Stefan; Voelker, Geoffrey M.; Snoeren, Alex C. (2017): "Tripwire: inferring internet site compromise", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] | registration forms behind a human check | 19% of sites with a registration form (37% within the top-100 subset) |
| Ardi and Calder, IMC 2023 [29Ardi, Calvin; Calder, Matt (2023): "The Prevalence of Single Sign-On on the Web: Towards the Next Generation of Web Content Measurement", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] | bot-detection service prevented page load | 8% of 994 responsive sites in a CrUX top-1K crawl |
| Liu et al., IMC 2025 [23Liu, Enze; Luo, Elisa; Shan, Shawn; Voelker, Geoffrey M.; Zhao, Ben Y.; Savage, Stefan (2025): "Somesite I Used To Crawl: Awareness, Agency and Efficacy in Protecting Content Creators From AI Crawlers", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] | site blocks the crawler regardless of user-agent | 1,487 of the top 10,000 sites (15%) |
| Annamalai et al., NDSS 2024 [30Annamalai, Meenatchi Sundaram Muthu Selva; Bilogrevic, Igor; Cristofaro, Emiliano De (2024): "FP-Fed: Privacy-Preserving Federated Detection of Browser Fingerprinting", in: Proceedings of the Network and Distributed System Security Symposium. (Link)] | crawl failed to collect traces | 1,700 of 20,000 sites (8.5%) failed; 64.3% of those were HTTP 403 |
| Senol et al., TheWebConf 2024 [31Senol, Asuman; Ukani, Alisha; Cutler, Dylan; Bilogrevic, Igor (2024): "The Double Edged Sword: Identifying Authentication Pages and their Fingerprinting Behavior", in: Proceedings of the ACM Web Conference 2024. (DOI)] | feature collection incomplete | 93 of 5,000 labelled pages (1.9%) |
| Annamalai et al., TheWebConf 2025 [4Annamalai, Meenatchi Sundaram Muthu Selva; De Cristofaro, Emiliano; Bilogrevic, Igor (2025): "Beyond the Crawl: Unmasking Browser Fingerprinting in Real User Interactions", in: Proceedings of the ACM Web Conference. (DOI)] | automated crawler failed to visit | 15 of ~3,000 sites (~1%); 86.7% of those returned 4XX tied to bot detection |
| Senol et al., USENIX Sec 2022 [32Senol, Asuman; Acar, Gunes; Humbert, Mathias; Zuiderveen Borgesius, Frederik (2022): "Leaky Forms: A Study of Email and Password Exfiltration Before Form Submission", in: 31st USENIX Security Symposium (USENIX Security 22). (Link)] | CAPTCHA page blocked the crawler | 3 pages in a 1,000-site pilot crawl |
| Aziz et al., PETS 2024 [33Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | CAPTCHA prevented normal load | 2 of 200 re-visited sites (1%); the paper estimates ~1% of the full sample |
| † Hausladen et al., USENIX Sec 2025 [34Hausladen, Katherine; Wang, Oliver; Eng, Sophie; Wang, Jocelyn; Wijaya, Francisca; May, Matthew; Zimmeck, Sebastian (2025): "Websites' Global Privacy Control Compliance at Scale and over Time", in: Proceedings of the USENIX Security Symposium. (Link)] | human-check page | 1.6–2.6% of the crawl set, across three crawls |
| † Bekos et al., TheWebConf 2023 [35Bekos, Paschalis; Papadopoulos, Panagiotis; Markatos, Evangelos P.; Kourtellis, Nicolas (2023): "The Hitchhiker's Guide to Facebook Web Tracking with Invisible Pixels and Click IDs", in: Proceedings of the ACM Web Conference. (DOI)] | access blocked after an event | 172 of 2,308 sites (7.5%) — but the paper's own sentence reads “blocked our access after a specific event, or stored duplicate results”, so blocking is not isolated |
| Kieserman et al., PETS 2025 [36Kieserman, Julia B.; Andreou, Athanasios; Geeng, Chris; Lauinger, Tobias; McCoy, Damon (2025): "Tracker Installations Are Not Created Equal: Understanding Tracker Configuration of Form Data Collection", in: Proceedings on Privacy Enhancing Technologies, pp. 679-695. (DOI)] | bot detection caused missed detections | 8.6% of the manually validated false-negative sample |
| Al Roomi and Li, USENIX Sec 2023 [37Al Roomi, Suood; Li, Frank (2023): "A Large-Scale Measurement of Website Login Policies", in: Proceedings of the USENIX Security Symposium. (Link)] | CAPTCHA-solving failures during login | 52% of domains where an account had been created could not be analysed |
| Gavazzi et al., USENIX Sec 2023 [38Gavazzi, Anthony; Williams, Ryan; Kirda, Engin; Lu, Long; King, Andre; Davis, Andy; Leek, Tim (2023): "A Study of Multi-Factor and Risk-Based Authentication Availability", in: Proceedings of the USENIX Security Symposium. (Link)] | login CAPTCHAs; web driver detected | 43 of 56 sites needed manual login; 3 of 56 blocked the driver |
| Campobasso and Allodi, CCS 2020 [39Campobasso, Michele; Allodi, Luca (2020): "Impersonation-as-a-Service: Characterizing the Emerging Criminal Infrastructure for User Impersonation at Scale", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] | scraping accounts banned by the marketplace | 5 accounts; the paper does not state how many it held in total |
| Chehade et al., IEEE S&P 2025 [40Chehade, Saiid El Hajj; Hantke, Florian; Stock, Ben (2025): "403 Forbidden? Ethically Evaluating Broken Access Control in the Wild", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] | accounts blocked, sessions invalidated | 3 of 110 sites with test accounts |
| McDonald et al., IMC 2018 [41McDonald, Allison; Bernhard, Matthew; Valenta, Luke; VanderSloot, Benjamin; Scott, Will; Sullivan, Nick; Halderman, J. Alex; Ensafi, Roya (2018): "403 Forbidden: A Global View of CDN Geoblocking", in: Proceedings of the ACM Internet Measurement Conference. (DOI)] | crawler flagged as a bot, denied access | ~30% of Akamai 403s were false positives — the crawler was blocked where a browser was not |
| Szurdi et al., TheWebConf 2021 [8Szurdi, Janos; Luo, Meng; Kondracki, Brian; Nikiforakis, Nick; Christin, Nicolas (2021): "Where are you taking me?Understanding Abusive Traffic Distribution Systems", in: Proceedings of the ACM Web Conference. (DOI)] | crawler persona vs human persona | explicitly blocked +5 points, covertly blocked +8 points |
| Bijmans et al., USENIX Sec 2021 [42Bijmans, Hugo; Booij, Tim; Schwedersky, Anneke; Nedgabat, Aria; Wegberg, Rolf van (2021): "Catching Phishers By Their Bait: Investigating the Dutch Phishing Landscape through Phishing Kit Detection", in: Proceedings of the USENIX Security Symposium. (Link)] | phishing sites cloaked against the crawler | 946 of 1,363 detected phishing domains (69%) served a blank page |
| Oh et al., PETS 2017 [43Oh, Se Eun; Li, Shuai; Hopper, Nicholas (2017): "Fingerprinting Keywords in Search Queries over Tor", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | Google CAPTCHA during Tor collection | 54% of fingerprintable keyword groups vs 35% of others |
| Singh et al., USENIX Sec 2017 [44Singh, Rachee; Nithyanand, Rishab; Afroz, Sadia; Pearce, Paul; Tschantz, Michael Carl; Gill, Phillipa; Paxson, Vern (2017): "Characterizing the Nature and Dynamics of Tor Exit Blocking", in: 26th USENIX Security Symposium (USENIX Security 17), pp. 325-341. USENIX Association. (Link)] | Tor exit relays discriminated against | 50% of the most aggressive site categories blocked over 60% of relays |
Two entries in that table deserve to be read twice. Al Roomi and Li lost 52% of the domains they had already created accounts on, mostly to CAPTCHA-solving failures, and said so — which is why their prevalence figure comes with the honest caveat that the true value may be higher. Bijmans et al.'s 69% is what a fully adversarial population looks like: on phishing infrastructure, cloaking against the crawler is the default, not the exception.
| Period | Crawling papers | Report obstruction | Share |
|---|---|---|---|
| 2010–2019 | 427 | 14 | 3.3% |
| 2020–2024 | 495 | 19 | 3.8% |
| 2025–2026 (provisional) | 198 | 10 | 5.1% |
Resist reading that as a rise. Per year the series is noisy on small bases: 2015 is the corpus's highest at 9.8% (4 of 41 crawling papers), 2017 and 2025 tie at 7.8%, and 2010–2013 are flat zero. The 2025–2026 row is also the provisional one, and 2025 is the year the sweep flags the most candidates (29 of 129) — which is as consistent with the field discussing this more as with anyone being blocked more. The corpus cannot separate those two explanations and this page does not claim to. What the series does show, unambiguously, is that no year in seventeen exceeded one paper in ten.
Population: the 1,120 crawling papers. not-stated is counted as what it is.
| Choice | Field | Papers stating it | Share |
|---|---|---|---|
| Headless or headed | crawlConfig.headless | 140 | 12.5% |
| Stateful or stateless | crawlConfig.statefulness | 219 | 19.6% |
| What it did with the consent banner | crawlConfig.consentAction | 349 | 31.2% |
| Which browser | crawlConfig.browsers | 529 | 47.2% |
| How authentication was handled | crawlConfig.authentication | 779 | 69.6% |
| How deep it went | crawlConfig.interactionDepth | 841 | 75.1% |
Headless versus headful is the most detectability-relevant single bit in the whole table and the least often reported. Of the 1,080 crawling papers that have a crawl configuration recorded at all, 940 do not say; 93 say headless, 35 headful, 12 both.
A full-text sweep over all 5,859 papers for the signal's name. These are mention
counts, not usage counts — a paper naming navigator.webdriver may be describing it,
defending against it or checking for it — and unlike the table above they are not
hand-audited. They are here to show where there is a literature and where there is not.
| Signal named anywhere in the paper | Papers | Of which ran a crawl |
|---|---|---|
| a CAPTCHA or challenge product by name | 118 | 41 |
| a bot-management vendor by name | 106 | 38 |
| TLS fingerprinting (JA3/JA4) | 37 | 11 |
| fingerprint inconsistency | 24 | 10 |
| headless detection | 20 | 19 |
| a stealth patch | 15 | 13 |
navigator.webdriver | 11 | 11 |
| an AI or LLM crawler | 5 | 3 |
| CDP or DevTools artefacts | 4 | 1 |
| HTTP header-order fingerprinting | 3 | 2 |
Read the bottom half of that table as a map of what nobody has written. Four papers in 5,859 mention CDP artefacts as a detection surface, and three mention header-order fingerprinting — both of which are ordinary, documented techniques on the commercial side. All five AI-crawler papers are 2025 or later.
paper.cols.txt with whitespace collapsed — a PDF line break inside a phrase defeats every multi-word pattern otherwise. Ten ordered patterns, each either anchored on an obstruction noun or requiring a first-person subject in the same sentence. Take the same ten patterns with every first-person requirement removed and the sweep returns 406 papers instead of 138; the extra 268 were not hand-audited, but a read of a sample of them found adversaries evading detection, Cloudflare and Akamai appearing as CDNs, and ad-blockers blocking requests, which is what the anchors are there to exclude.bWAPP, a deliberately vulnerable local benchmark app, not on the open web. Dropping it moves the point estimate from 96 missed papers to 80.If you have an afternoon, in this order:
w3.org returns HTTP 403 to a browser User-Agent string and 200 to plain curl — a detection rule pointed the opposite way from the ones this page is about.content/public/common/content_switches.cc defines kEnableAutomation with the comment “Enable indication that browser is controlled by automation”; chrome/browser/ui/startup/automation_infobar_delegate.cc defines the infobar and its IDS_CONTROLLED_BY_AUTOMATION string. Both read from chromium.googlesource.com/chromium/src/+/HEAD on 2026-08-29.api.github.com, registry.npmjs.org and pypi.org on 2026-08-29 by scripts/external_checks_crawler_detection.sh; the full output is on crawler_detection. Note that several of these repositories publish tags but no GitHub Release objects, so /releases/latest returns HTTP 404 for them and a naive currency check reads them as abandoned.perimeterx.com and distilnetworks.com redirect chains followed with curl; f5.com/company/news/press-releases/f5-completes-acquisition-of-shape-security; developers.cloudflare.com/bots/; blog.cloudflare.com/turnstile-ga/; api.github.com/repos/fingerprintjs/BotD and api.github.com/repos/TecharoHQ/anubis. One check could not be completed and the failure is the point: Akamai's own Bot Manager product page returned HTTP 403 “Access Denied” to curl with a browser User-Agent and to a headless Playwright Chromium from our datacenter host, consistently, on every attempt across several hours. We did not establish the cause — it may be bot management, geography or ASN reputation — and we are not going to find out by trying harder. A second check turned into the page's other worked example, and then into a better one. Imperva's own press-release page for the Thales acquisition first answered curl with HTTP 200 and 920 bytes — a NOINDEX, NOFOLLOW meta tag and an iframe reading “Request unsuccessful. Incapsula incident ID: 429000330232386336-…”. A crawler whose success test is the status code would have recorded that as a visited page. A headless Playwright Chromium from the same host got the full article at the same time. Roughly forty minutes later, after we had stopped hammering it, plain curl from the same host got the full 180 KB article too, three times in a row. Three lessons, and the third is the one that matters: a challenge can be HTTP 200; “headless, therefore blocked” is not what these products score; and the same client can be challenged and then admitted within the hour, so a block rate measured once is a measurement of a moment. We are recording what we observed with its timing rather than presenting it as a standing property of that host.developers.cloudflare.com/bots/llms-full.txt, fetched 2026-08-29: “New defaults, in which Training and Agent are blocked on pages that display ads while Search remains allowed, take effect for new domains on September 15, 2026”, and “Block AI bots [Deprecating on September 15, 2026]”. Cloudflare's separate Content Signals Policy, announced 2025-09-24, adds search / ai-input / ai-train directives to robots.txt.datatracker.ietf.org/doc/rfc9309/ and rfc-editor.org/info/rfc9309, fetched 2026-08-29.datatracker.ietf.org/wg/webbotauth/about/ and datatracker.ietf.org/wg/aipref/about/, both fetched 2026-08-29. Be careful to distinguish an adopted working-group draft from an expired individual submission: draft-meunier-web-bot-auth-architecture is marked expired and archived, with no formal standing.curl client). report_crawler_detection.mjs §D prints all 22 with their quotes and §D2 prints the recall-audit ones separately.