proxy-scraper-cli 1.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. proxy_scraper_cli-1.7.1.dist-info/METADATA +794 -0
  2. proxy_scraper_cli-1.7.1.dist-info/RECORD +57 -0
  3. proxy_scraper_cli-1.7.1.dist-info/WHEEL +5 -0
  4. proxy_scraper_cli-1.7.1.dist-info/entry_points.txt +4 -0
  5. proxy_scraper_cli-1.7.1.dist-info/licenses/LICENSE +21 -0
  6. proxy_scraper_cli-1.7.1.dist-info/top_level.txt +1 -0
  7. proxyscraper/__init__.py +12 -0
  8. proxyscraper/__main__.py +7 -0
  9. proxyscraper/agent.py +635 -0
  10. proxyscraper/api.py +139 -0
  11. proxyscraper/app.py +595 -0
  12. proxyscraper/asndb.py +181 -0
  13. proxyscraper/blocklist.py +92 -0
  14. proxyscraper/checker.py +514 -0
  15. proxyscraper/cli.py +269 -0
  16. proxyscraper/compat.py +83 -0
  17. proxyscraper/completion.py +196 -0
  18. proxyscraper/exporters.py +118 -0
  19. proxyscraper/fetchcache.py +103 -0
  20. proxyscraper/geo.py +150 -0
  21. proxyscraper/geodb.py +143 -0
  22. proxyscraper/handshake.py +153 -0
  23. proxyscraper/history.py +106 -0
  24. proxyscraper/judges.py +159 -0
  25. proxyscraper/mcp_entry.py +34 -0
  26. proxyscraper/mcp_server.py +220 -0
  27. proxyscraper/netio.py +167 -0
  28. proxyscraper/options.py +274 -0
  29. proxyscraper/output.py +181 -0
  30. proxyscraper/pages.py +212 -0
  31. proxyscraper/parsing.py +192 -0
  32. proxyscraper/paths.py +55 -0
  33. proxyscraper/pipeline.py +434 -0
  34. proxyscraper/preferences.py +24 -0
  35. proxyscraper/publish.py +236 -0
  36. proxyscraper/server/__init__.py +41 -0
  37. proxyscraper/server/core.py +518 -0
  38. proxyscraper/server/http.py +164 -0
  39. proxyscraper/server/pool.py +195 -0
  40. proxyscraper/server/socks.py +65 -0
  41. proxyscraper/server/status.py +108 -0
  42. proxyscraper/server/upstream.py +119 -0
  43. proxyscraper/site/apple-touch-icon.png +0 -0
  44. proxyscraper/site/googleaac1161b7853c5b5.html +1 -0
  45. proxyscraper/site/index.html +934 -0
  46. proxyscraper/site/logo.png +0 -0
  47. proxyscraper/site/og.png +0 -0
  48. proxyscraper/sources.json +395 -0
  49. proxyscraper/sources.py +491 -0
  50. proxyscraper/targets.py +76 -0
  51. proxyscraper/ui/__init__.py +54 -0
  52. proxyscraper/ui/dashboard.py +344 -0
  53. proxyscraper/ui/keys.py +82 -0
  54. proxyscraper/ui/report.py +209 -0
  55. proxyscraper/ui/serve.py +142 -0
  56. proxyscraper/ui/widgets.py +250 -0
  57. proxyscraper/ui/wizard.py +595 -0
@@ -0,0 +1,794 @@
1
+ Metadata-Version: 2.4
2
+ Name: proxy-scraper-cli
3
+ Version: 1.7.1
4
+ Summary: Finds free HTTP, SOCKS4 and SOCKS5 proxies that actually work: 700+ sources, real checks, honeypot filtering and a rotating local proxy server.
5
+ Author: Maximilian Feix
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/maximilianfeix/proxy-scraper
8
+ Project-URL: Issues, https://github.com/maximilianfeix/proxy-scraper/issues
9
+ Project-URL: Changelog, https://github.com/maximilianfeix/proxy-scraper/releases
10
+ Project-URL: Live proxy list, https://github.com/maximilianfeix/proxy-scraper/tree/proxy-list
11
+ Keywords: proxy,proxy-list,proxy-checker,proxy-scraper,socks5,socks4,http-proxy,rotating-proxy,asyncio,mcp,mcp-server,ai-agents
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Operating System :: Microsoft :: Windows
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3 :: Only
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Internet :: Proxy Servers
26
+ Classifier: Topic :: System :: Networking
27
+ Requires-Python: >=3.9
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: rich>=13
31
+ Requires-Dist: certifi
32
+ Provides-Extra: fast
33
+ Requires-Dist: uvloop; sys_platform != "win32" and extra == "fast"
34
+ Provides-Extra: mcp
35
+ Requires-Dist: mcp<3,>=2.2; python_version >= "3.10" and extra == "mcp"
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest; extra == "dev"
38
+ Requires-Dist: ruff==0.16.8; extra == "dev"
39
+ Dynamic: license-file
40
+
41
+ <div align="center">
42
+
43
+ <picture>
44
+ <source media="(prefers-color-scheme: dark)" srcset="docs/banner-dark.svg">
45
+ <source media="(prefers-color-scheme: light)" srcset="docs/banner-light.svg">
46
+ <img src="docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
47
+ </picture>
48
+
49
+ [![tests](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml/badge.svg)](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
50
+ [![Release](https://img.shields.io/github/v/release/maximilianfeix/proxy-scraper?style=flat-square&color=D4F77A&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/releases/latest)
51
+ [![Live proxies](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Ftotal.json&style=flat-square&labelColor=121113)](#live-list)
52
+ [![PyPI](https://img.shields.io/pypi/v/proxy-scraper-cli?style=flat-square&color=D4F77A&labelColor=121113&label=pypi)](https://pypi.org/project/proxy-scraper-cli/)
53
+ [![Python](https://img.shields.io/badge/python-3.9–3.13-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
54
+ [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](LICENSE)
55
+
56
+ <a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://img.shields.io/badge/Browse_the_live_list-D4F77A?style=for-the-badge&labelColor=121113" alt="Browse the live list"></a>
57
+ <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
58
+ <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
59
+ <a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
60
+ <a href="bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
61
+
62
+ [Install](#install) · [Live list](#live-list) · [For AI agents](#mcp) · [Proxy server](#proxy-server) · [How it works](#how-it-works) · [Recipes](#recipes) · [Options](#options) · [FAQ](#faq)
63
+
64
+ </div>
65
+
66
+ ---
67
+
68
+ Most free proxy lists are 95 % dead, and a good part of the rest are honeypots or proxies that inject scripts into your pages. **proxy-scraper** collects public HTTP, SOCKS4 and SOCKS5 proxies from 700+ sources and keeps only the ones that pass every check. It learns with every run which sources are worth it, and it can turn the result into a single rotating proxy.
69
+
70
+ <picture>
71
+ <source media="(prefers-color-scheme: dark)" srcset="docs/checks-dark.svg">
72
+ <source media="(prefers-color-scheme: light)" srcset="docs/checks-light.svg">
73
+ <img src="docs/checks-dark.svg" alt="The five checks: 700+ lists, a real handshake, two sites with one IP, nothing injected, the details" width="100%">
74
+ </picture>
75
+
76
+ <div align="center">
77
+ <img src="docs/demo.svg" alt="Animated demo: setup wizard, collecting, live dashboard and final report" width="880">
78
+ </div>
79
+
80
+ <details>
81
+ <summary><b>Table of contents</b></summary>
82
+
83
+ - [Install](#install)
84
+ - [Live proxy list](#live-list)
85
+ - [For AI agents (MCP)](#mcp)
86
+ - [Features](#features) · [Why not just download a list?](#why-not-just-download-a-list)
87
+ - [Examples](#examples)
88
+ - [Recipes](#recipes)
89
+ - [Rotating proxy server](#proxy-server)
90
+ - [Discord bot](#discord-bot)
91
+ - [How it works](#how-it-works)
92
+ - [Output](#output)
93
+ - [Options](#options)
94
+ - [GitHub Actions](#github-actions)
95
+ - [FAQ](#faq)
96
+ - [Roadmap](#roadmap) · [Contributing](#contributing) · [Acknowledgements](#acknowledgements)
97
+
98
+ </details>
99
+
100
+ <a id="install"></a>
101
+
102
+ ## Install
103
+
104
+ **With [pipx](https://pipx.pypa.io/)** (recommended – gives you a `proxy-scraper` command in its own environment):
105
+
106
+ ```bash
107
+ pipx install proxy-scraper-cli
108
+ proxy-scraper
109
+ ```
110
+
111
+ The package is called `proxy-scraper-cli` on PyPI (the plain name is taken), the command is `proxy-scraper`.
112
+
113
+ <details>
114
+ <summary><b>Other ways: Docker, pip, a faster event loop, or straight from the repo</b></summary>
115
+ <br>
116
+
117
+ ```bash
118
+ # Docker – learned state and results stay in two folders next to you
119
+ mkdir -p proxy-data results
120
+ docker run --rm --user "$(id -u):$(id -g)" -v "$PWD/proxy-data:/data" -v "$PWD/results:/work/results" \
121
+ ghcr.io/maximilianfeix/proxy-scraper --want 50 --https-only
122
+
123
+ # pip into the current environment
124
+ pip install proxy-scraper-cli
125
+
126
+ # optional: faster event loop on macOS/Linux
127
+ pipx install "proxy-scraper-cli[fast]"
128
+
129
+ # the latest main instead of the latest release
130
+ pipx install git+https://github.com/maximilianfeix/proxy-scraper.git
131
+
132
+ # no install at all
133
+ git clone https://github.com/maximilianfeix/proxy-scraper.git
134
+ cd proxy-scraper
135
+ pip install -r requirements.txt
136
+ python3 proxy_scraper.py
137
+ ```
138
+
139
+ Every [release](https://github.com/maximilianfeix/proxy-scraper/releases/latest) also ships a wheel you can install with `pip install <file>.whl`, and a multi-arch image (amd64/arm64) on `ghcr.io`. In the container the wizard never shows up, it runs straight away. For the proxy server use `--serve --serve-host 0.0.0.0` with `-p 127.0.0.1:8899:8899`, so the port is only open on your own machine.
140
+
141
+ Tab completion for bash, zsh and fish:
142
+
143
+ ```bash
144
+ eval "$(proxy-scraper --completion zsh)" # in ~/.zshrc (after compinit), same for bash in ~/.bashrc
145
+ proxy-scraper --completion fish > ~/.config/fish/completions/proxy-scraper.fish
146
+ ```
147
+
148
+ Installed, the learned state lives in your user data folder (`~/Library/Application Support/proxy-scraper`, `%LOCALAPPDATA%\proxy-scraper` or `~/.local/share/proxy-scraper`; override with `PROXY_SCRAPER_HOME`) and results go to `./results`. Run from a clone, both stay inside the project.
149
+
150
+ </details>
151
+
152
+ Started without arguments, a wizard asks what you are looking for:
153
+
154
+ <div align="center">
155
+ <img src="docs/wizard.svg" alt="Setup wizard" width="760">
156
+ </div>
157
+
158
+ | Preset | What it does |
159
+ |---|---|
160
+ | **Find everything** | all protocols, maximum yield |
161
+ | **Browsing & web** | HTTP + SOCKS5, HTTPS-capable, at least anonymous, under 3 s |
162
+ | **Maximum anonymity** | elite SOCKS5 with HTTPS only |
163
+ | **Fast & stable** | proxies under 1 s only |
164
+ | **A few right now** | stops after 25 hits |
165
+ | **Recheck the last hits** | no collecting, takes seconds |
166
+ | **Proxy server right away** | recheck the last hits, then serve them on :8899 |
167
+ | **Same as last time** | your previous choice |
168
+ | **Custom …** | protocols, countries, anonymity, HTTPS, target site, latency, amount, check mode |
169
+
170
+ Keys: <kbd>↑</kbd><kbd>↓</kbd> select · <kbd>Space</kbd> toggle · <kbd>1</kbd>–<kbd>9</kbd> jump · <kbd>Enter</kbd> next · <kbd>Esc</kbd> back · <kbd>q</kbd> quit. In scripts and cron jobs the wizard never shows up – pass options or `-y`.
171
+
172
+ <a id="live-list"></a>
173
+
174
+ ## Live proxy list
175
+
176
+ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and publishes the hits to the [`proxy-list`](../../tree/proxy-list) branch – every entry worked in the last run, fastest first.
177
+
178
+ **→ [Browse it on the website](https://maximilianfeix.github.io/proxy-scraper/)** – search, filter by type, country, HTTPS, provider and latency, see how long each proxy has been up, copy or download exactly the proxies you need. `streaks.json` on the branch has the number of runs in a row for every proxy.
179
+
180
+ Every protocol and country also has its own page with a plain download, e.g. [SOCKS5](https://maximilianfeix.github.io/proxy-scraper/socks5/) or [Germany](https://maximilianfeix.github.io/proxy-scraper/country/de/) (`country/de/proxies.txt`).
181
+
182
+ <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="docs/website.png" alt="The live list website" width="860"></a></div>
183
+
184
+ <div align="center">
185
+
186
+ [![Proxies](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Ftotal.json&style=for-the-badge)](../../tree/proxy-list)
187
+ [![HTTP](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Fhttp.json&style=for-the-badge)](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/http.txt)
188
+ [![SOCKS4](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Fsocks4.json&style=for-the-badge)](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks4.txt)
189
+ [![SOCKS5](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Fsocks5.json&style=for-the-badge)](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt)
190
+ [![Updated](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Fupdated.json&style=for-the-badge)](../../actions/workflows/proxy-list.yml)
191
+
192
+ </div>
193
+
194
+ | List | Format | Link |
195
+ |---|---|---|
196
+ | All | `socks5://1.2.3.4:1080` | [all.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/all.txt) |
197
+ | HTTP · SOCKS4 · SOCKS5 | `1.2.3.4:8080` | [http.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/http.txt) · [socks4.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks4.txt) · [socks5.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt) |
198
+ | HTTPS-capable only | `type://ip:port` | [https.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/https.txt) |
199
+ | Elite only | `type://ip:port` | [elite.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/elite.txt) |
200
+ | With all details | latency, country, HTTPS, anonymity, exit IP | [proxies.json](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/proxies.json) · [proxies.csv](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/proxies.csv) |
201
+
202
+ ```bash
203
+ curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt | head
204
+ ```
205
+
206
+ Or let the tool start from it: `proxy-scraper --recheck live` downloads the list and checks it again from **your** network – about 30 seconds instead of a full scan (517 of 1,169 worked from here). With `--serve` you have a rotating proxy in under a minute.
207
+
208
+ <a id="mcp"></a>
209
+
210
+ ## For AI agents (MCP)
211
+
212
+ <!-- mcp-name: io.github.maximilianfeix/proxy-scraper -->
213
+
214
+ `proxy-scraper-mcp` is an [MCP](https://modelcontextprotocol.io) server: Claude Code, Claude Desktop, Cursor, VS Code, Codex and any other MCP client can ask for working proxies and load pages through them.
215
+
216
+ | Tool | What it does |
217
+ |---|---|
218
+ | `get_proxies` | working proxies right now, from the hourly list – filter by protocol, country, HTTPS, elite, no datacenter, not blocklisted, stable, latency |
219
+ | `check_proxies` | checks proxies from your own network, so they work from where your code runs (30–90 s, reports progress) |
220
+ | `fetch_url` | loads a page through a verified proxy, switches proxies by itself when one fails, returns readable text – HTTPS only through proxies with verified TLS |
221
+
222
+ Things to ask your agent: *"Load bbc.com/news as seen from the UK"*, *"Give me 5 SOCKS5 proxies from Germany that aren't in a datacenter"*, *"Check which of these sites block free proxies"*.
223
+
224
+ Needs [uv](https://docs.astral.sh/uv/) – it fetches a suitable Python by itself if yours is older than 3.10. **Claude Code:**
225
+
226
+ ```bash
227
+ claude mcp add proxy-scraper -- uvx --python ">=3.10" --from "proxy-scraper-cli[mcp]" proxy-scraper-mcp
228
+ ```
229
+
230
+ **Claude Desktop, Cursor and most other clients** – add this to the MCP config (Claude Desktop: Settings → Developer → Edit Config, Cursor: `~/.cursor/mcp.json`):
231
+
232
+ ```json
233
+ {
234
+ "mcpServers": {
235
+ "proxy-scraper": {
236
+ "command": "uvx",
237
+ "args": ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"]
238
+ }
239
+ }
240
+ }
241
+ ```
242
+
243
+ <details>
244
+ <summary><b>VS Code, Codex, or without uv</b></summary>
245
+
246
+ **VS Code** – `.vscode/mcp.json`:
247
+
248
+ ```json
249
+ {
250
+ "servers": {
251
+ "proxy-scraper": {
252
+ "type": "stdio",
253
+ "command": "uvx",
254
+ "args": ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"]
255
+ }
256
+ }
257
+ }
258
+ ```
259
+
260
+ **Codex** – `~/.codex/config.toml`:
261
+
262
+ ```toml
263
+ [mcp_servers.proxy-scraper]
264
+ command = "uvx"
265
+ args = ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"]
266
+ ```
267
+
268
+ **Without uv:** `pipx install --python python3.12 "proxy-scraper-cli[mcp]"` (any Python 3.10+), then use `proxy-scraper-mcp` as the command.
269
+
270
+ It's also in the [official MCP registry](https://registry.modelcontextprotocol.io) as `io.github.maximilianfeix/proxy-scraper`, so clients that browse the registry can install it from there.
271
+
272
+ </details>
273
+
274
+ The server tells agents what it tells you: free proxies are run by strangers, so no logins, cookies or personal data through them. Local and private addresses are refused, and results go to proxy-scraper's data folder, not into the project you're working in.
275
+
276
+ <a id="features"></a>
277
+
278
+ ## Features
279
+
280
+ <table>
281
+ <tr>
282
+ <td width="50%" valign="top">
283
+
284
+ **Setup wizard**<br>
285
+ Started without arguments, the tool asks what you need using the arrow keys – a preset or step by step. At the end it shows the matching command line.
286
+
287
+ </td>
288
+ <td width="50%" valign="top">
289
+
290
+ **Fast**<br>
291
+ 700+ sources fetched in parallel, large lists parsed on all CPU cores, hand-written HTTP/SOCKS handshakes directly on `asyncio` with 2000+ checks at once.
292
+
293
+ </td>
294
+ </tr>
295
+ <tr>
296
+ <td valign="top">
297
+
298
+ **Real verification**<br>
299
+ Every hit has to fetch two independent pages – that weeds out **honeypots** that only answer check requests (in some runs 5 out of 6 “hits”). A third request catches proxies that **tamper with content**: in our measurements one in five working proxies injected a script into a plain HTML page. Plus: HTTPS through a tunnel with **verified TLS**, anonymity level *elite / anonymous / transparent* and the country of the exit IP.
300
+
301
+ </td>
302
+ <td valign="top">
303
+
304
+ **Learns with every run**<br>
305
+ Hit rate per source, history of working proxies, automatic removal of dead and stale lists. With `-l 5000` you get the *best* 5000 candidates, not just any.
306
+
307
+ </td>
308
+ </tr>
309
+ <tr>
310
+ <td valign="top">
311
+
312
+ **Finds new sources by itself**<br>
313
+ Searches GitHub for actively maintained proxy lists and reads source lists maintained by others. Spam clone farms and plain mirrors are detected.
314
+
315
+ </td>
316
+ <td valign="top">
317
+
318
+ **Filters & target sites**<br>
319
+ With `--target google.com` a proxy only counts if it really reaches the site – many public proxies are blocked by Google, Discord & co. Filter by country, HTTPS, anonymity and latency, and stop with `--want 50` as soon as enough matching proxies are found. Filters even speed things up: with `--max-latency 1000` slow proxies are given up after 1 s instead of 8 s.
320
+
321
+ </td>
322
+ </tr>
323
+ <tr>
324
+ <td valign="top">
325
+
326
+ **Live dashboard**<br>
327
+ Speed chart, latency histogram, protocols, countries and the latest hits in real time. <kbd>Ctrl</kbd>+<kbd>C</kbd> stops at any time and saves everything.
328
+
329
+ </td>
330
+ <td valign="top">
331
+
332
+ **Rotating proxy server**<br>
333
+ `--serve` turns the hits into a local proxy that sends every connection through a different one – with automatic failover when one hangs.
334
+
335
+ </td>
336
+ </tr>
337
+ <tr>
338
+ <td valign="top">
339
+
340
+ **Runs everywhere**<br>
341
+ macOS, Linux and Windows, Python 3.9 to 3.13. Only two dependencies: `rich` and `certifi`. It even notices when a firewall blocks proxies.
342
+
343
+ </td>
344
+ <td valign="top">
345
+
346
+ **Thoroughly tested**<br>
347
+ 450+ tests run offline against real mini proxies and honeypots on `localhost` – on Linux, macOS and Windows with Python 3.9, 3.11 and 3.13.
348
+
349
+ </td>
350
+ </tr>
351
+ </table>
352
+
353
+ <a id="why-not-just-download-a-list"></a>
354
+
355
+ ### Why not just download a list?
356
+
357
+ | | Typical proxy list repo | **proxy-scraper** |
358
+ |---|:---:|:---:|
359
+ | Proxies checked right before you use them | ❌ | ✅ |
360
+ | Honeypots that fake a successful check filtered out | ❌ | ✅ |
361
+ | Proxies that inject scripts or ads filtered out | ❌ | ✅ |
362
+ | HTTPS tested with verified TLS | rarely | ✅ |
363
+ | Anonymity level and country per proxy | sometimes | ✅ |
364
+ | Only proxies that reach *your* target site | ❌ | ✅ `--target` |
365
+ | Learns which sources are worth it | ❌ | ✅ |
366
+ | Usable as a single rotating proxy | ❌ | ✅ `--serve` |
367
+ | Ready-made list without running anything | ✅ | ✅ [live list](#live-list) |
368
+
369
+ <a id="examples"></a>
370
+
371
+ ## Examples
372
+
373
+ ```bash
374
+ # 50 proxies that can do HTTPS – then stop
375
+ proxy-scraper --want 50 --https-only
376
+
377
+ # only Germany, Austria and Switzerland, the 20,000 most promising candidates
378
+ proxy-scraper --country DE,AT,CH -l 20000
379
+
380
+ # fast elite SOCKS5 proxies
381
+ proxy-scraper --types socks5 --anonymity elite --max-latency 1500
382
+
383
+ # 20 proxies that really reach Google AND Discord
384
+ proxy-scraper --target google.com --target discord.com --want 20
385
+
386
+ # only recheck the last hits (plus history) – takes seconds
387
+ proxy-scraper --recheck
388
+
389
+ # wizard with defaults – it keeps what you already passed
390
+ proxy-scraper -i --country DE
391
+
392
+ # which sources deliver the most?
393
+ proxy-scraper --list-sources
394
+ ```
395
+
396
+ Running from a clone? Replace `proxy-scraper` with `python3 proxy_scraper.py`.
397
+
398
+ <a id="from-python"></a>
399
+
400
+ ### From Python
401
+
402
+ ```python
403
+ from proxyscraper import check_proxies, find_proxies
404
+
405
+ if __name__ == "__main__": # needed on macOS/Windows, the parser uses a process pool
406
+ for p in find_proxies(want=20, https=True, countries=["DE", "NL"], no_datacenter=True):
407
+ print(p.url, p.latency, p.country, p.org)
408
+
409
+ alive = check_proxies(["socks5://1.2.3.4:1080", "5.6.7.8:3128"]) # your own list
410
+ ```
411
+
412
+ Same run as the command line – sources, learning, every check, result files – just without terminal output. Each result has `url`, `latency`, `exit_ip`, `https`, `anonymity`, `country`, `asn`, `org` and `hosting`. There's an async version of both (`find_proxies_async`, `check_proxies_async`).
413
+
414
+ <a id="proxy-server"></a>
415
+
416
+ ## Rotating proxy server
417
+
418
+ A list is nice – but usually you just want to enter **one** proxy that always works:
419
+
420
+ ```bash
421
+ proxy-scraper --recheck --serve # recheck the last hits, then go – takes seconds
422
+ ```
423
+
424
+ ```bash
425
+ curl -x http://127.0.0.1:8899 https://api.ipify.org # a different IP every time
426
+ curl -x socks5h://127.0.0.1:8899 https://api.ipify.org # SOCKS5 on the same port
427
+ curl -x http://country-de:x@127.0.0.1:8899 https://api.ipify.org # only German exits
428
+ curl -x http://session-cart42:x@127.0.0.1:8899 https://shop.example # same proxy for this session
429
+ curl http://127.0.0.1:8899/__proxy-scraper/status # pool and counters as JSON
430
+ curl http://127.0.0.1:8899/__proxy-scraper/metrics # the same for Prometheus/Grafana
431
+ ```
432
+
433
+ Like commercial rotating proxies, the **username** carries what you want: `country-XX`, `type-http|socks4|socks5` and `session-NAME`, combinable (`country-us-type-socks5-session-a`). It works for HTTP (`Proxy-Authorization`) and SOCKS5 (username/password auth). By default the password is ignored and the server only listens on `127.0.0.1`.
434
+
435
+ To reach it from other machines, give it a password – every client then has to send it, over HTTP and SOCKS5 alike, and the status page wants it as Basic auth:
436
+
437
+ ```bash
438
+ export PROXY_SCRAPER_SERVE_PASSWORD=$(openssl rand -hex 16) # the env var keeps it out of `ps`
439
+ proxy-scraper --recheck --serve --serve-host 0.0.0.0
440
+ curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
441
+ ```
442
+
443
+ Without a password, `--serve-host` means **anyone who reaches the port can use it**. The ready-made [`compose.yaml`](compose.yaml) starts the server in Docker from the live list, with a password, a health check and learned state in a volume: put `PROXY_PASSWORD=…` into `.env`, then `docker compose up -d`.
444
+
445
+ | Option | What it does |
446
+ |---|---|
447
+ | `--rotate weighted` | default: fast and proven proxies more often, everyone gets a chance |
448
+ | `--rotate random` / `round-robin` | evenly, at random or in turn |
449
+ | `--rotate fastest` | always the fastest one that isn't busy |
450
+ | `--sticky 300` | the same site keeps its proxy for 5 minutes (logins, carts) |
451
+
452
+ - every connection goes through a different proxy (unless sticky); fast and proven ones are preferred
453
+ - `CONNECT` for HTTPS and plain HTTP requests; HTTP, SOCKS4 and SOCKS5 proxies can sit behind it (SOCKS5 with DNS through the proxy)
454
+ - HTTPS only uses proxies that passed the test with **verified TLS** – no broken encryption
455
+ - if a proxy stays silent inside the tunnel or returns an error page instead of TLS, the same first packet quietly goes to the next one
456
+ - three failures in a row and a proxy leaves the rotation – every 5 minutes those get re-checked and come back if they work again
457
+ - `--serve-refill 6` checks fresh proxies every 6 hours in the background (the live list with `--recheck live`, otherwise the last run + history) with the same checks and filters, and adds the hits – a server that runs for days doesn't run dry
458
+ - listens on `127.0.0.1` only (unless `--serve-host` says otherwise), optionally with a password; live view with requests, success rate, pool and the latest connections
459
+
460
+ In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In the wizard this is **Proxy server right away**.
461
+
462
+ <a id="discord-bot"></a>
463
+
464
+ ## Discord bot
465
+
466
+ The live list can also come to you: [`bot/`](bot/) is a Discord bot that posts every run into a server – a summary with the fastest proxies, the full lists per protocol as files, and slash commands like `/proxies type:socks5 country:DE https:true`. It sets up its own read-only channels when you invite it, and a GitHub Action deploys it to a server as a systemd service. Setup in [bot/README.md](bot/README.md).
467
+
468
+ <a id="how-it-works"></a>
469
+
470
+ ## How it works
471
+
472
+ ```mermaid
473
+ flowchart LR
474
+ A[sources.json<br/>meta lists<br/>GitHub discovery] --> B[Fetch & parse<br/>in parallel on all cores]
475
+ B --> C[Prioritize<br/>history → good sources → rest]
476
+ C --> D[Check<br/>HTTP · SOCKS4 · SOCKS5]
477
+ D --> E[Details<br/>HTTPS · anonymity · country]
478
+ E --> F[results/]
479
+ D -. hit rate per source .-> G[(learned state)]
480
+ G -. next run .-> C
481
+ ```
482
+
483
+ 1. **Sources** – the curated list in [`sources.json`](proxyscraper/sources.json), meta sources (other projects that maintain lists of proxy sources) and, once a day, a GitHub search for actively maintained repos. Every search adds to what earlier ones found; a list the search hasn't seen for three weeks drops out.
484
+ 2. **Collect** – plain text, HTML tables, JSON APIs and `type://ip:port` lines are recognized; private and reserved address ranges are dropped. Lists that haven't changed since the last run answer `304` and come from a local cache – a second run right after the first loads 0 MB instead of ~160 MB.
485
+ 3. **Prioritize** – known working proxies first, then by the learned hit rate of their sources.
486
+ 4. **Check** – every proxy has to fetch its exit IP from a check target (`checkip.amazonaws.com`, with `ifconfig.me`, `ipinfo.io`, `wtfismyip.com` and `ident.me` as reserves – none of them behind Cloudflare) and return a valid, *foreign* IP. If the target goes down mid-run, the tool switches and re-checks the proxies that were affected, so the statistics don't learn from an outage. Anyone passing your own IP through is out. Then comes the **confirmation** via `httpbin.org`: fake proxies that only answer the first check with “200 + IP” fail here. Finally a static HTML page has to arrive byte for byte as it does without a proxy – anyone injecting ads or scripts is out.
487
+ 5. **Countries and providers** – looked up offline in the free DB-IP databases, including the provider (ASN) and whether it's probably a datacenter (about 45 % of working proxies are) (downloaded once a month, ~2 µs per lookup); ip-api.com is only asked for the few addresses it doesn't know.
488
+ 6. **Blocklists** – one DNS lookup per exit IP against SpamCop, cached for the run: about 29 % of working proxies exit from a listed IP, and sites that use the list show those captchas or block them. `--no-blocklisted` drops them. If your DNS resolver is refused by SpamCop (large public resolvers are), the lookup is skipped instead of guessing.
489
+ 7. **Learn** – hit rates and history are stored. Sources without hits, with content unchanged for a week or permanently unreachable are skipped.
490
+
491
+ <details>
492
+ <summary><b>📸 See the live dashboard and final report</b></summary>
493
+ <br>
494
+ <div align="center">
495
+ <img src="docs/dashboard.svg" alt="Live dashboard while checking" width="860">
496
+ <br><br>
497
+ <img src="docs/summary.svg" alt="Final report after a run" width="860">
498
+ </div>
499
+ </details>
500
+
501
+ <a id="output"></a>
502
+
503
+ ## Output
504
+
505
+ Every run gets its own folder; `results/latest.txt` always names the newest one (on macOS/Linux there is also the symlink `results/latest`):
506
+
507
+ ```
508
+ results/2026-09-24_18-42-07/
509
+ ├── all.txt socks5://203.0.113.10:1080 (fastest first)
510
+ ├── http.txt 203.0.113.20:8080 (plain ip:port lists per type)
511
+ ├── socks4.txt
512
+ ├── socks5.txt
513
+ ├── proxies.json latency, country, HTTPS, anonymity, exit IP
514
+ └── proxies.csv
515
+ ```
516
+
517
+ <a id="recipes"></a>
518
+
519
+ ## Recipes
520
+
521
+ **Use the fastest proxy from the last run** – free proxies die quickly, so `--recheck` first if the run is older than a few minutes
522
+
523
+ ```bash
524
+ proxy-scraper --recheck -y
525
+ curl -x "$(head -1 results/latest/all.txt)" http://api.ipify.org
526
+ ```
527
+
528
+ For HTTPS, pick a proxy with `"https": true` from `proxies.json` – like the Python example below does.
529
+
530
+ **Python `requests`** (`pip install "requests[socks]"` for SOCKS)
531
+
532
+ ```python
533
+ import json
534
+ from pathlib import Path
535
+
536
+ import requests
537
+
538
+ run = Path("results") / Path("results/latest.txt").read_text().strip() # works on every OS
539
+ proxies = json.loads((run / "proxies.json").read_text()) # fastest first
540
+
541
+ for p in proxies:
542
+ if not p["https"]:
543
+ continue
544
+ try:
545
+ r = requests.get("https://api.ipify.org", proxies={"http": p["url"], "https": p["url"]}, timeout=8)
546
+ print(p["url"], "→", r.text)
547
+ break
548
+ except requests.RequestException:
549
+ continue # free proxies come and go – just take the next one
550
+ ```
551
+
552
+ **proxychains, Clash / Mihomo** – ready-made configs with `--export`
553
+
554
+ ```bash
555
+ proxy-scraper --want 30 -y --export proxychains,clash
556
+ proxychains4 -f results/latest/proxychains.conf curl https://api.ipify.org
557
+ ```
558
+
559
+ `clash.yaml` has all HTTP and SOCKS5 proxies plus a `url-test` group that always picks the fastest. Both configs leave out HTTP proxies that can't tunnel (`CONNECT`), because these tools tunnel everything.
560
+
561
+ **In a pipe** – `-o -` prints the hits to stdout, the interface moves to stderr
562
+
563
+ ```bash
564
+ proxy-scraper --recheck live --want 20 -y -o - | grep '^socks5://' > socks.txt
565
+ ```
566
+
567
+ **Any tool, through the rotating server**
568
+
569
+ ```bash
570
+ proxy-scraper --recheck --serve &
571
+ export HTTPS_PROXY=http://127.0.0.1:8899 HTTP_PROXY=http://127.0.0.1:8899
572
+ pip download requests # git, pip, npm & co. now go through the pool
573
+ ```
574
+
575
+ **Without installing anything** – straight from the live list
576
+
577
+ ```bash
578
+ curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/https.txt | head -5
579
+ ```
580
+
581
+ The shell snippets are for macOS and Linux, where `results/latest` points to the newest run. On Windows, `results/latest.txt` holds the folder name instead – in PowerShell:
582
+
583
+ ```powershell
584
+ $run = "results\$(Get-Content results\latest.txt)"
585
+ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
586
+ ```
587
+
588
+ <a id="options"></a>
589
+
590
+ ## Options
591
+
592
+ <details>
593
+ <summary><b>Show all options</b></summary>
594
+ <br>
595
+
596
+ | Option | Description |
597
+ |---|---|
598
+ | `-i`, `--interactive` | setup wizard (shown automatically without arguments) |
599
+ | `-y`, `--yes` | start right away without the wizard |
600
+ | `--types http socks5` | only these protocols |
601
+ | `-l`, `--limit N` | only check the *N* most promising proxies |
602
+ | `--want N` | stop as soon as *N* matching proxies are found |
603
+ | `--country DE,AT` | only these countries |
604
+ | `--https-only` | only proxies that can tunnel HTTPS |
605
+ | `--anonymity elite` | minimum anonymity (`anonymous` or `elite`) |
606
+ | `--max-latency MS` | maximum latency |
607
+ | `--no-datacenter` | skip proxies whose exit is (probably) in a datacenter – those get blocked sooner |
608
+ | `--no-blocklisted` | skip proxies whose exit IP is on the SpamCop blocklist – those often get captchas |
609
+ | `--no-dnsbl` | skip the blocklist lookup |
610
+ | `--target URL` | only proxies that reach this site (repeatable) |
611
+ | `--recheck [FILE\|live]` | only check proxies from a file, the last run, or the public live list |
612
+ | `--fast` | skip the HTTPS test (confirmation and anonymity still run) |
613
+ | `--no-geo` | skip the country lookup |
614
+ | `-c`, `--concurrency N` | simultaneous checks (default: 2000) |
615
+ | `-t`, `--timeout S` | timeout per proxy (default: 8 s) |
616
+ | `--discover` | search GitHub for new sources right now |
617
+ | `--no-cache` | download every list again (unchanged ones are normally skipped via ETag) |
618
+ | `--list-sources [N]` | show the source ranking |
619
+ | `--serve-host ADDR` | where the proxy server listens (default `127.0.0.1`; `0.0.0.0` for Docker, with a warning) |
620
+ | `--serve-password SECRET` | clients must send this password in the proxy login; better set `PROXY_SCRAPER_SERVE_PASSWORD` |
621
+ | `--rotate STRATEGY` · `--sticky SEC` | how the proxy server picks proxies, see [above](#proxy-server) |
622
+ | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
623
+ | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
624
+ | `-o FILE` | also write all hits to this file; `-o -` prints them to stdout |
625
+ | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `curl` or `all` |
626
+ | `-V`, `--version` | print the version |
627
+ | `--completion SHELL` | print the tab completion script for bash, zsh or fish |
628
+
629
+ Everything else: `proxy-scraper --help`
630
+
631
+ </details>
632
+
633
+ > [!TIP]
634
+ > For the GitHub search a logged-in [`gh`](https://cli.github.com/) or the `GITHUB_TOKEN` environment variable is enough. Without a token the API limit is 60 requests per hour, and only 40 repos are searched.
635
+
636
+ <a id="github-actions"></a>
637
+
638
+ ## GitHub Actions
639
+
640
+ The repo does part of the work itself:
641
+
642
+ | Workflow | What it does |
643
+ |---|---|
644
+ | [**tests**](../../actions/workflows/tests.yml) | 3 operating systems × 3 Python versions, plus a built and installed package – on every push and pull request |
645
+ | [**lint**](../../actions/workflows/lint.yml) | `ruff` with a pinned version – same rules locally and in CI |
646
+ | [**codeql**](../../actions/workflows/codeql.yml) | security analysis on every push and once a week |
647
+ | [**proxy list**](../../actions/workflows/proxy-list.yml) | every hour: collect, check, publish to `proxy-list`. The learned statistics live in the Actions cache, so the tool keeps getting better in the cloud too |
648
+ | [**docker**](../../actions/workflows/docker.yml) | builds the image on every change and runs a real scan inside it; on a version tag it publishes `linux/amd64` + `linux/arm64` to `ghcr.io` |
649
+ | [**release**](../../actions/workflows/release.yml) | on a version tag: test, build, smoke-test and publish a GitHub release with the wheel |
650
+ | [**discord bot**](../../actions/workflows/bot.yml) | tests the bot and deploys it to the server on every change in `bot/` |
651
+ | **Dependabot** | keeps the action versions up to date |
652
+
653
+ <a id="faq"></a>
654
+
655
+ ## FAQ
656
+
657
+ <details>
658
+ <summary><b>Almost nothing gets through.</b></summary>
659
+ <br>
660
+
661
+ Many company, school and university networks block proxy connections. The tool notices a hit rate below 0.2 % and warns you – a different network such as a phone hotspot helps. The learned statistics are not downgraded in such a run.
662
+
663
+ </details>
664
+
665
+ <details>
666
+ <summary><b>Does it work on Windows?</b></summary>
667
+ <br>
668
+
669
+ Yes, in PowerShell and Windows Terminal. `uvloop` doesn't exist there and is skipped automatically. In the old `cmd.exe` window some symbols may be missing depending on the font.
670
+
671
+ </details>
672
+
673
+ <details>
674
+ <summary><b>Why does it find fewer proxies than other lists claim to have?</b></summary>
675
+ <br>
676
+
677
+ Because only proxies that pass every check are kept. Many lists count anything that accepts a TCP connection; here a proxy must fetch two independent pages and show a foreign IP. That's usually a few hundred out of a million candidates – but they work.
678
+
679
+ </details>
680
+
681
+ <details>
682
+ <summary><b>What about proxies with a username and password?</b></summary>
683
+ <br>
684
+
685
+ Lines like `socks5://user:pass@1.2.3.4:1080` keep their login: HTTP proxies get a `Proxy-Authorization` header, SOCKS5 uses username/password auth (RFC 1929), SOCKS4 the user ID. The same works for `--recheck` with your own list. The result files keep the credentials, the terminal only shows `user:•••`.
686
+
687
+ </details>
688
+
689
+ <details>
690
+ <summary><b>How fresh is the live list?</b></summary>
691
+ <br>
692
+
693
+ It's rebuilt every hour; the “updated” badge shows the last run. Free proxies come and go quickly, so for anything important run `proxy-scraper --recheck` right before use.
694
+
695
+ </details>
696
+
697
+ <details>
698
+ <summary><b>Is it safe to use free proxies?</b></summary>
699
+ <br>
700
+
701
+ Only for things that don't matter. Public proxies are run by strangers who can read everything that isn't encrypted. Never send passwords or personal data through them, and only use them for legal purposes.
702
+
703
+ </details>
704
+
705
+ <a id="roadmap"></a>
706
+
707
+ ## Roadmap
708
+
709
+ What's next is tracked in the milestone [**v1.8**](../../milestone/8) – ideas and wishes are welcome as an [issue](../../issues/new/choose). During Hacktoberfest there are [beginner-friendly issues](../../issues?q=is%3Aopen+label%3Ahacktoberfest) with pointers on where to start.
710
+
711
+ - [ ] [Protocol detection on the same connection](../../issues/44)
712
+ - [ ] [sing-box export](../../issues/113), [PowerShell completion](../../issues/114), [shareable filters on the website](../../issues/116)
713
+
714
+ Shipped in [v1.7](../../milestone/7): an MCP server so AI agents get working proxies and can load pages through them, 28 new sources and a GitHub search that runs daily and keeps what it found, and a cleaner website.
715
+
716
+ Shipped in [v1.6](../../milestone/6): spam blocklist check for every exit IP, a live list refreshed every hour, pages per protocol and country, an optional password for the proxy server and a pool that refills itself while it runs, `compose.yaml`, `-o -` for pipes, a Discord bot, and a new website and README – everything in English now.
717
+
718
+ Shipped in [v1.5](../../milestone/5): content tampering check, live list website with trend and stable proxies, provider/datacenter info, a much bigger proxy server (rotation strategies, sticky sessions, SOCKS5 inbound, status and Prometheus metrics), `--recheck live`, Python API, shell completion. Measured and dropped earlier: protocol detection with an extra connection ([#3](../../issues/3)) and IPv6 ([#1](../../issues/1)).
719
+
720
+ <a id="contributing"></a>
721
+
722
+ ## Contributing
723
+
724
+ Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](CONTRIBUTING.md), and [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
725
+
726
+ ```bash
727
+ pip install -e ".[dev]"
728
+ python3 -m pytest # runs offline – fake proxies on localhost
729
+ ruff check .
730
+ python3 docs/make_demo.py # regenerate the images in this README
731
+ ```
732
+
733
+ <details>
734
+ <summary><b>Project structure</b></summary>
735
+
736
+ ```
737
+ proxy_scraper.py entry point when run from a clone
738
+ bot/ Discord bot for the live list (own requirements, deployed by GitHub Actions)
739
+ proxyscraper/
740
+ ├── cli.py arguments, wizard or direct start
741
+ ├── app.py one run in phases: network → jobs → check → learn & report
742
+ ├── options.py RunOptions + Filters – all settings in one place
743
+ ├── pipeline.py collect sources, prioritize, check loop
744
+ ├── checker.py checks, honeypot confirmation, HTTPS test
745
+ ├── handshake.py HTTP/SOCKS4/SOCKS5 handshakes incl. login
746
+ ├── judges.py check targets, Cloudflare filter, failover
747
+ ├── sources.py source lists, meta sources, GitHub discovery, statistics
748
+ ├── sources.json curated sources
749
+ ├── fetchcache.py ETag cache for unchanged lists
750
+ ├── parsing.py find proxies in text, HTML and JSON
751
+ ├── history.py history of working proxies
752
+ ├── geo.py countries: offline first, ip-api.com as fallback
753
+ ├── asndb.py DB-IP provider database, datacenter heuristic
754
+ ├── geodb.py DB-IP country database (monthly, binary search)
755
+ ├── targets.py target sites for --target
756
+ ├── output.py result files
757
+ ├── exporters.py proxychains, Clash and curl formats (--export)
758
+ ├── server/ rotating proxy server (--serve): pool · http · upstream · socks · status · core
759
+ ├── api.py find_proxies() / check_proxies() for Python
760
+ ├── agent.py MCP tools without the SDK: live list, filters, fetch through proxies
761
+ ├── mcp_server.py MCP server (proxy-scraper-mcp) for AI agents
762
+ ├── publish.py live list for GitHub Actions
763
+ ├── paths.py where state and results are stored
764
+ ├── compat.py differences between Unix and Windows
765
+ ├── netio.py small HTTP client on asyncio
766
+ └── ui/ widgets · dashboard · report · wizard · serve · keys
767
+ ```
768
+
769
+ </details>
770
+
771
+ <a id="acknowledgements"></a>
772
+
773
+ ## Acknowledgements
774
+
775
+ proxy-scraper stands on the work of the people who publish free proxy lists. Thanks to everyone listed in [`sources.json`](proxyscraper/sources.json), and especially to
776
+
777
+ - [monosans/proxy-scraper-checker](https://github.com/monosans/proxy-scraper-checker) and [gfpcom/free-proxy-list](https://github.com/gfpcom/free-proxy-list), whose curated source collections are read as meta sources
778
+ - [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
779
+ - [IP Geolocation by DB-IP](https://db-ip.com) – the free country database (CC BY 4.0) used for offline country lookups
780
+ - [httpbin](https://httpbin.org), [checkip.amazonaws.com](https://checkip.amazonaws.com), [ifconfig.me](https://ifconfig.me), [ipinfo.io](https://ipinfo.io), [wtfismyip.com](https://wtfismyip.com), [ident.me](https://ident.me) and [ip-api.com](https://ip-api.com), used as check targets and for country lookups
781
+
782
+ ## Disclaimer
783
+
784
+ This tool only collects publicly listed proxies and checks whether they work. You are responsible for how you use them – respect the terms of the sites you visit and the laws where you live.
785
+
786
+ <div align="center">
787
+
788
+ ---
789
+
790
+ <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="LICENSE">MIT License</a> · <a href="CHANGELOG.md">Changelog</a> · <a href="SECURITY.md">Security</a> · <a href="CONTRIBUTING.md">Contributing</a></sub>
791
+
792
+ <sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
793
+
794
+ </div>