<?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: Maxi</title>
    <description>The latest articles on DEV Community by Maxi (@taventix).</description>
    <link>https://dev.to/taventix</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%2F4144081%2F3b350af6-fd45-429a-925e-635f7945756d.jpg</url>
      <title>DEV Community: Maxi</title>
      <link>https://dev.to/taventix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taventix"/>
    <language>en</language>
    <item>
      <title>I checked a million free proxies. One in five of the working ones rewrote my pages.</title>
      <dc:creator>Maxi</dc:creator>
      <pubDate>Sat, 26 Sep 2026 09:47:46 +0000</pubDate>
      <link>https://dev.to/taventix/i-checked-a-million-free-proxies-one-in-five-of-the-working-ones-rewrote-my-pages-1no9</link>
      <guid>https://dev.to/taventix/i-checked-a-million-free-proxies-one-in-five-of-the-working-ones-rewrote-my-pages-1no9</guid>
      <description>&lt;p&gt;Free proxy lists look generous. Thousands of addresses, updated every few minutes. The first time I tried them for a scraping job, almost nothing connected. The second surprise came later: some of the ones that did connect were not doing what I thought.&lt;/p&gt;

&lt;p&gt;This is what I found while building &lt;a href="https://github.com/maximilianfeix/proxy-scraper" rel="noopener noreferrer"&gt;proxy-scraper&lt;/a&gt;, an open-source tool that collects public proxies and checks them properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dead is the easy part
&lt;/h2&gt;

&lt;p&gt;Every run starts with about a million candidates from 700+ public lists. Most of them never finish a TCP handshake. That's expected and cheap to detect.&lt;/p&gt;

&lt;p&gt;The interesting failures come after that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honeypots answer the question you asked
&lt;/h2&gt;

&lt;p&gt;The usual check is: connect through the proxy, ask a "what is my IP" service, see a foreign IP, done. Some proxies answer exactly that request with a plausible "200 + IP" and fail everything else. In some runs they were five out of six "hits".&lt;/p&gt;

&lt;p&gt;The fix is a second, independent request. The proxy has to fetch a different site and show the same exit IP there too. Honeypots fall out here, and the same response tells you which headers arrive at the target, which gives you the anonymity level for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some proxies edit what you download
&lt;/h2&gt;

&lt;p&gt;This is the one that surprised me. I added a check that fetches a static HTML page through the proxy and compares its hash with the page fetched directly over verified HTTPS.&lt;/p&gt;

&lt;p&gt;Out of 270 proxies that had passed the handshake and the honeypot check, &lt;strong&gt;54 returned a modified page&lt;/strong&gt;. Almost always an injected &lt;code&gt;&amp;lt;script src="http://…"&amp;gt;&lt;/code&gt;, sometimes ads. That's 20% of the pool that looked perfectly fine by every usual measure.&lt;/p&gt;

&lt;p&gt;If you scrape through free proxies, a fifth of your responses may be rewritten on the way. If you browse through them, you're running someone else's JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the rest exits from
&lt;/h2&gt;

&lt;p&gt;With the free DB-IP ASN database the tool looks up the provider of every exit IP. In today's list, 52% of working proxies exit from datacenters, which many sites block on sight. And 28% of exit IPs are on the SpamCop blocklist, which means captchas on a lot of sites. Both can be filtered out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning which lists are worth it
&lt;/h2&gt;

&lt;p&gt;A proxy that worked in the last run is far more likely to work now than a random entry. So proxy-scraper checks known-good proxies first, then proxies from sources with a good hit rate, and it drops lists that went stale. Unchanged lists are skipped with ETags: a second run right after the first loads 0 MB instead of about 160 MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pipx &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/maximilianfeix/proxy-scraper.git
proxy-scraper &lt;span class="nt"&gt;--want&lt;/span&gt; 50 &lt;span class="nt"&gt;--https-only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--serve&lt;/code&gt; turns the result into a rotating proxy (HTTP and SOCKS5 on one port, sticky sessions, country per request through the username, optional password, refills itself in the background), there's a Python API, and &lt;code&gt;-o -&lt;/code&gt; prints the hits for pipes. If you don't want to run anything, a GitHub Action checks everything every hour and publishes the list: &lt;a href="https://maximilianfeix.github.io/proxy-scraper/" rel="noopener noreferrer"&gt;maximilianfeix.github.io/proxy-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is MIT licensed. If you find a check I'm missing, issues are very welcome: &lt;a href="https://github.com/maximilianfeix/proxy-scraper" rel="noopener noreferrer"&gt;github.com/maximilianfeix/proxy-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Free proxies are run by strangers. Never send passwords or personal data through them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>security</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
