<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bhushan Arun Ladde</title>
    <description>The latest articles on DEV Community by Bhushan Arun Ladde (@bal02).</description>
    <link>https://dev.to/bal02</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4227504%2F26f50ba0-1272-4335-bb67-79a9f319ab21.jpeg</url>
      <title>DEV Community: Bhushan Arun Ladde</title>
      <link>https://dev.to/bal02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bal02"/>
    <language>en</language>
    <item>
      <title>What 4,700 bot visits taught me about AI crawlers (and a tool to check any site's robots.txt</title>
      <dc:creator>Bhushan Arun Ladde</dc:creator>
      <pubDate>Thu, 05 Nov 2026 03:03:19 +0000</pubDate>
      <link>https://dev.to/bal02/what-4700-bot-visits-taught-me-about-ai-crawlers-and-a-tool-to-check-any-sites-robotstxt-2549</link>
      <guid>https://dev.to/bal02/what-4700-bot-visits-taught-me-about-ai-crawlers-and-a-tool-to-check-any-sites-robotstxt-2549</guid>
      <description>&lt;p&gt;A few weeks ago I wanted to answer a simple question: how many of the "visitors" on my small side projects are actually people?&lt;/p&gt;

&lt;p&gt;The answer turned out to be: not many. Most of the traffic was crawlers, a lot of them from AI companies, and I had no easy way to see which ones, how often, or where they came from. Server logs tell you a User-Agent string and an IP, and the User-Agent can say anything it likes.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://botspotter.app" rel="noopener noreferrer"&gt;BotSpotter&lt;/a&gt;. It's a live map of AI crawlers hitting participating sites, open source under MIT. This post is about what the first week of data showed me, because some of it surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. About 1 in 18 "big-name" bots is lying
&lt;/h2&gt;

&lt;p&gt;OpenAI, Google, Microsoft, Apple, Perplexity, DuckDuckGo and Common Crawl all publish the IP ranges their crawlers use. BotSpotter checks every hit that claims to be one of those bots against the published ranges, in-process, before the IP is discarded.&lt;/p&gt;

&lt;p&gt;After 1,500 such hits: &lt;strong&gt;1,425 verified, 75 impostors&lt;/strong&gt;. The most popular disguise is not GPTBot, it's &lt;strong&gt;Googlebot&lt;/strong&gt; (40 of the 75), followed by GPTBot (20), Bingbot (12) and PerplexityBot (3). If you rate-limit or whitelist by User-Agent, this is the traffic you're letting through.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Most AI crawling is anonymous
&lt;/h2&gt;

&lt;p&gt;Of 4,770 bot visits so far, &lt;strong&gt;2,494 (56%) came from bots nobody has identified&lt;/strong&gt; — no registry entry, no documented User-Agent, no published ranges. They're fingerprinted by UA family, header order and network, so the same bot keeps the same name ("Onyx Shark #5358"), but we don't know who runs them. The named AI companies are the visible tip; the bulk of machine traffic doesn't announce itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A new domain gets a crawl &lt;em&gt;burst&lt;/em&gt;, then it decays
&lt;/h2&gt;

&lt;p&gt;The first days after launch showed 500+ bot hits a day. Two weeks later it's ~320. Nothing broke: every search and SEO crawler does a discovery pass on a new domain (Googlebot, Bingbot, Ahrefs, Semrush, Meta all fetched every URL in the sitemap), then drops to maintenance re-checks. If you're measuring bot traffic on a fresh site, the first week is not your baseline.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Where the bots live
&lt;/h2&gt;

&lt;p&gt;By hosting network: Google Cloud (2,117 hits), AWS (293), Hetzner (287), OVH (270), Azure (170), Apple (165), Meta (85), DigitalOcean (77). Hetzner and OVH being that high is a tell — a lot of scrapers and unidentified crawlers rent cheap European VMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check any site's robots.txt against AI crawlers
&lt;/h2&gt;

&lt;p&gt;The feature people use most isn't the map. It's &lt;strong&gt;&lt;a href="https://botspotter.app/check" rel="noopener noreferrer"&gt;botspotter.app/check&lt;/a&gt;&lt;/strong&gt;: type any domain and it fetches the robots.txt and evaluates it against 16 AI crawler tokens using RFC 9309 rules (a named group beats &lt;code&gt;*&lt;/code&gt;, longest path match wins, &lt;code&gt;Allow&lt;/code&gt; wins a tie). You get a grade per crawler — allowed, kept out of some paths, or blocked — grouped by what the operator says the traffic is for: training, AI search, or agents fetching for a live user.&lt;/p&gt;

&lt;p&gt;Try it on a site you know: &lt;code&gt;https://botspotter.app/check?site=nytimes.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you own the site, it gives you a paste-ready block for the training crawlers. And there's a second tool on the same page: paste an IP from your logs, pick the bot it claims to be, and it tells you whether the IP is in the operator's published ranges.&lt;/p&gt;

&lt;p&gt;One honest caveat the page itself makes: robots.txt is a request, not a wall. The impostors above don't read it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sensors: a one-line middleware (FastAPI/Django/Flask) or a Caddy/Nginx log tail. They drop browsers locally and send only bot hits — header &lt;em&gt;names&lt;/em&gt;, User-Agent, IP, country. No page content, no cookies.&lt;/li&gt;
&lt;li&gt;Ingest (FastAPI) → Redpanda → an aggregator → Redis counters + TimescaleDB history. The IP is used once for GeoIP, ASN and the verification check, then dropped. No IP is stored anywhere.&lt;/li&gt;
&lt;li&gt;Bots get a stable name from a hash of their fingerprint; humans on the portal are counted with a daily salted hash, no cookies.&lt;/li&gt;
&lt;li&gt;Live map: server-sent events into MapLibre. Deploys go through CI rehearsal of the whole stack, an automated change gate, approval, and auto-rollback — it's a hobby project, but it went down twice on launch day and I didn't enjoy it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/bhushanladde02/botspotter" rel="noopener noreferrer"&gt;github.com/bhushanladde02/botspotter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd like from you
&lt;/h2&gt;

&lt;p&gt;If you run a site, &lt;a href="https://botspotter.app/sensors" rel="noopener noreferrer"&gt;adding it&lt;/a&gt; is a GitHub sign-in and one line, and you get a live badge for your footer. More sensors means better numbers for everyone, and right now there are two.&lt;/p&gt;

&lt;p&gt;And I'm curious: what's the weirdest bot in your logs?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
