proxy-scraper-cli 1.22.0__tar.gz → 1.24.0__tar.gz

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 (131) hide show
  1. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/PKG-INFO +102 -20
  2. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/README.md +99 -18
  3. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/PKG-INFO +102 -20
  4. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/SOURCES.txt +7 -0
  5. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/requires.txt +1 -1
  6. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/__init__.py +1 -1
  7. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/agent.py +2 -2
  8. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/api.py +9 -7
  9. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/app.py +99 -6
  10. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/cli.py +1 -1
  11. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/exporters.py +48 -0
  12. proxy_scraper_cli-1.24.0/proxyscraper/mirror.py +348 -0
  13. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/pages.py +19 -14
  14. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/parsing.py +5 -4
  15. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/publish.py +11 -3
  16. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ranking.py +26 -2
  17. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/core.py +17 -7
  18. proxy_scraper_cli-1.24.0/proxyscraper/server/dashboard.html +351 -0
  19. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/status.py +59 -4
  20. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/site/index.html +6 -6
  21. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/sites.py +3 -0
  22. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/sources.json +1 -0
  23. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/serve.py +5 -4
  24. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/widgets.py +6 -0
  25. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/pyproject.toml +3 -2
  26. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_agent.py +5 -4
  27. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_live_api.py +6 -5
  28. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_mcp_server.py +2 -1
  29. proxy_scraper_cli-1.24.0/tests/test_mirror.py +75 -0
  30. proxy_scraper_cli-1.24.0/tests/test_pac.py +116 -0
  31. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_pick.py +2 -2
  32. proxy_scraper_cli-1.24.0/tests/test_recheck_stdin.py +263 -0
  33. proxy_scraper_cli-1.24.0/tests/test_serve_dashboard.py +234 -0
  34. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_sites.py +22 -5
  35. proxy_scraper_cli-1.24.0/tests/test_survival_ranking.py +58 -0
  36. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/LICENSE +0 -0
  37. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
  38. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
  39. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
  40. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/__main__.py +0 -0
  41. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/action.py +0 -0
  42. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/asndb.py +0 -0
  43. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/blocklist.py +0 -0
  44. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/charts.py +0 -0
  45. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/checker.py +0 -0
  46. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/compat.py +0 -0
  47. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/completion.py +0 -0
  48. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/fetchcache.py +0 -0
  49. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/geo.py +0 -0
  50. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/geodb.py +0 -0
  51. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/handshake.py +0 -0
  52. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/history.py +0 -0
  53. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/judges.py +0 -0
  54. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/mcp_entry.py +0 -0
  55. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/mcp_server.py +0 -0
  56. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/netio.py +0 -0
  57. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/options.py +0 -0
  58. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/output.py +0 -0
  59. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/paths.py +0 -0
  60. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/pipeline.py +0 -0
  61. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/preferences.py +0 -0
  62. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/proxypages.py +0 -0
  63. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/report.py +0 -0
  64. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/runsteps.py +0 -0
  65. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/__init__.py +0 -0
  66. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/api.py +0 -0
  67. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/http.py +0 -0
  68. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/pool.py +0 -0
  69. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/socks.py +0 -0
  70. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/server/upstream.py +0 -0
  71. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/site/apple-touch-icon.png +0 -0
  72. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
  73. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/site/logo.png +0 -0
  74. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/site/og.png +0 -0
  75. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/sources.py +0 -0
  76. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/speed.py +0 -0
  77. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/targets.py +0 -0
  78. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/__init__.py +0 -0
  79. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/dashboard.py +0 -0
  80. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/keys.py +0 -0
  81. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/report.py +0 -0
  82. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/proxyscraper/ui/wizard.py +0 -0
  83. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/setup.cfg +0 -0
  84. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_action.py +0 -0
  85. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_api.py +0 -0
  86. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_app.py +0 -0
  87. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_asndb.py +0 -0
  88. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_auth.py +0 -0
  89. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_blocklist.py +0 -0
  90. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_charts.py +0 -0
  91. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_checker.py +0 -0
  92. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_compat.py +0 -0
  93. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_completion.py +0 -0
  94. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_discovery_growth.py +0 -0
  95. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_exporters.py +0 -0
  96. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_fetchcache.py +0 -0
  97. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_geodb.py +0 -0
  98. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_judges.py +0 -0
  99. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_learning.py +0 -0
  100. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_mine_sources.py +0 -0
  101. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_options.py +0 -0
  102. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_output_stdout.py +0 -0
  103. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_own_sources.py +0 -0
  104. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_packaging.py +0 -0
  105. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_pages.py +0 -0
  106. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_parsing.py +0 -0
  107. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_parsing_fuzz.py +0 -0
  108. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_paths.py +0 -0
  109. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_pipeline.py +0 -0
  110. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_preferences.py +0 -0
  111. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_proxy_pages.py +0 -0
  112. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_proxy_sources.py +0 -0
  113. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_publish.py +0 -0
  114. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_report.py +0 -0
  115. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_robustness.py +0 -0
  116. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_rotator.py +0 -0
  117. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_serve_api.py +0 -0
  118. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_serve_password.py +0 -0
  119. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_serve_refill.py +0 -0
  120. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_serve_v2.py +0 -0
  121. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_server.py +0 -0
  122. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_server_closed_writer.py +0 -0
  123. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_server_fixes.py +0 -0
  124. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_sources_json.py +0 -0
  125. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_speed.py +0 -0
  126. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_speed_ranking.py +0 -0
  127. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_tamper.py +0 -0
  128. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_targets.py +0 -0
  129. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_ui.py +0 -0
  130. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_uptime.py +0 -0
  131. {proxy_scraper_cli-1.22.0 → proxy_scraper_cli-1.24.0}/tests/test_wizard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proxy-scraper-cli
3
- Version: 1.22.0
3
+ Version: 1.24.0
4
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
5
  Author: Maximilian Feix
6
6
  License-Expression: MIT
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
25
26
  Classifier: Topic :: Internet :: Proxy Servers
26
27
  Classifier: Topic :: System :: Networking
27
28
  Requires-Python: >=3.9
@@ -36,7 +37,7 @@ Requires-Dist: mcp<3,>=2.2; python_version >= "3.10" and extra == "mcp"
36
37
  Provides-Extra: dev
37
38
  Requires-Dist: pytest; extra == "dev"
38
39
  Requires-Dist: hypothesis; extra == "dev"
39
- Requires-Dist: ruff==0.16.8; extra == "dev"
40
+ Requires-Dist: ruff==0.16.9; extra == "dev"
40
41
  Dynamic: license-file
41
42
 
42
43
  <div align="center">
@@ -51,16 +52,19 @@ Dynamic: license-file
51
52
  [![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)
52
53
  [![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)
53
54
  [![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/)
54
- [![Python](https://img.shields.io/badge/python-3.9–3.13-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
55
+ [![Python](https://img.shields.io/badge/python-3.9–3.14-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
55
56
  [![Stars](https://img.shields.io/github/stars/maximilianfeix/proxy-scraper?style=flat-square&color=D4F77A&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/stargazers)
56
57
  [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](LICENSE)
57
58
 
58
59
  <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>
60
+ <a href="https://github.com/maximilianfeix/free-proxy-list"><img src="https://img.shields.io/badge/Just_the_lists-121113?style=for-the-badge" alt="Just the lists: free-proxy-list"></a>
59
61
  <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
60
62
  <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
61
63
  <a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
62
64
  <a href="bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
63
65
 
66
+ **English** · [简体中文](README.zh-CN.md)
67
+
64
68
  [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)
65
69
 
66
70
  </div>
@@ -71,16 +75,23 @@ Most free proxy lists are 95 % dead, and a good part of the rest are honeypots o
71
75
 
72
76
  **In numbers:** in one day it checked 3.6 million free proxies – 1.1 % worked, and more than half of the ones that answered failed a second request. [What's actually out there →](docs/free-proxies-in-numbers.md)
73
77
 
74
- <picture>
75
- <source media="(prefers-color-scheme: dark)" srcset="docs/checks-dark.svg">
76
- <source media="(prefers-color-scheme: light)" srcset="docs/checks-light.svg">
77
- <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%">
78
- </picture>
78
+ **Try it – no install, about five seconds:**
79
+
80
+ ```bash
81
+ uvx proxy-scraper-cli --pick 5 --types socks5 # 5 checked proxies
82
+
83
+ # or just the plain list
84
+ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
85
+ ```
86
+
87
+ `uvx` comes with [uv](https://docs.astral.sh/uv/); `pipx run proxy-scraper-cli --pick 5` does the same.
79
88
 
80
89
  <div align="center">
81
- <img src="docs/demo.svg" alt="Animated demo: setup wizard, collecting, live dashboard and final report" width="880">
90
+ <img src="docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
82
91
  </div>
83
92
 
93
+ > **Who runs free proxies – and is it safe to use them?** Mostly nobody on purpose: misconfigured servers with an open port, a few deliberately open ones, infected machines, and traps that log or rewrite your traffic. That's why every proxy here has to pass [five checks](#how-it-works), and why they're for public data and testing – never for logins, payments or anything personal. [More on where they come from →](#who-runs-free-proxies)
94
+
84
95
  <details>
85
96
  <summary><b>Table of contents</b></summary>
86
97
 
@@ -114,6 +125,14 @@ proxy-scraper
114
125
 
115
126
  The package is called `proxy-scraper-cli` on PyPI (the plain name is taken), the command is `proxy-scraper`.
116
127
 
128
+ **With [Homebrew](https://brew.sh)** on macOS and Linux:
129
+
130
+ ```bash
131
+ brew install maximilianfeix/tap/proxy-scraper
132
+ ```
133
+
134
+ The formula follows each release within about a day.
135
+
117
136
  <details>
118
137
  <summary><b>Other ways: Docker, pip, a faster event loop, or straight from the repo</b></summary>
119
138
  <br>
@@ -178,7 +197,9 @@ Keys: <kbd>↑</kbd><kbd>↓</kbd> select · <kbd>Space</kbd> toggle · <kbd>1</
178
197
 
179
198
  ## Live proxy list
180
199
 
181
- 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.
200
+ 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, best first: fast ones that are likely to still be up come on top.
201
+
202
+ > **Just want the lists?** They also live in a repository of their own, **[maximilianfeix/free-proxy-list](https://github.com/maximilianfeix/free-proxy-list)** – one list per protocol, per country and per site, updated every hour, with the numbers of the last run on the front page. Watch or star it to keep it at hand.
182
203
 
183
204
  <a href="https://maximilianfeix.github.io/proxy-scraper/"><picture>
184
205
  <source media="(prefers-color-scheme: dark)" srcset="https://maximilianfeix.github.io/proxy-scraper/chart-dark.svg">
@@ -208,7 +229,7 @@ Every protocol and country also has its own page with a plain download, e.g. [SO
208
229
  | 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) |
209
230
  | HTTPS-capable only | `type://ip:port` | [https.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/https.txt) |
210
231
  | Elite only | `type://ip:port` | [elite.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/elite.txt) |
211
- | Gets through to Google · Reddit · Amazon · Instagram · TikTok (no captcha, no block in the last run) | `type://ip:port` | [google.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/google.txt) · [reddit.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/reddit.txt) · [amazon.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/amazon.txt) · [instagram.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/instagram.txt) · [tiktok.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/tiktok.txt) |
232
+ | Gets through to Google · Reddit · Amazon · Instagram · TikTok · Discord (no captcha, no block in the last run) | `type://ip:port` | [google.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/google.txt) · [reddit.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/reddit.txt) · [amazon.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/amazon.txt) · [instagram.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/instagram.txt) · [tiktok.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/tiktok.txt) · [discord.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/discord.txt) |
212
233
  | Stable, on the list in 90 %+ of this week's runs | `type://ip:port` | [stable.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/stable.txt) |
213
234
  | With all details | latency, country, HTTPS, anonymity, exit IP, uptime, sites | [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) |
214
235
 
@@ -319,7 +340,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
319
340
  <td valign="top">
320
341
 
321
342
  **Real verification**<br>
322
- 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.
343
+ Every hit has to fetch two independent pages – that weeds out **honeypots** that only answer check requests: over 3.6 million checks, 54 % of the proxies that answered the first request failed the second. A third request catches proxies that **tamper with content**: about one in 40 working proxies changed a known page, usually by injecting a script ([the numbers](docs/free-proxies-in-numbers.md)). Plus: HTTPS through a tunnel with **verified TLS**, anonymity level *elite / anonymous / transparent* and the country of the exit IP.
323
344
 
324
345
  </td>
325
346
  <td valign="top">
@@ -361,13 +382,13 @@ Speed chart, latency histogram, protocols, countries and the latest hits in real
361
382
  <td valign="top">
362
383
 
363
384
  **Runs everywhere**<br>
364
- macOS, Linux and Windows, Python 3.9 to 3.13. Only two dependencies: `rich` and `certifi`. It even notices when a firewall blocks proxies.
385
+ macOS, Linux and Windows, Python 3.9 to 3.14. Only two dependencies: `rich` and `certifi`. It even notices when a firewall blocks proxies.
365
386
 
366
387
  </td>
367
388
  <td valign="top">
368
389
 
369
390
  **Thoroughly tested**<br>
370
- 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.
391
+ 760+ tests run offline against real mini proxies and honeypots on `localhost` – on Linux, macOS and Windows with Python 3.9, 3.11, 3.13 and 3.14.
371
392
 
372
393
  </td>
373
394
  </tr>
@@ -446,7 +467,7 @@ pool = itertools.cycle(p.url for p in proxies)
446
467
  r = requests.get("https://api.ipify.org", proxies={"https": next(pool)}, timeout=15) # pip install "requests[socks]"
447
468
  ```
448
469
 
449
- Same filters as `find_proxies`, plus `min_uptime`, `works_on` (`["google"]`, `"reddit"`, `"amazon"`, `"instagram"`, `"tiktok"`) and `limit`. Every result also has `uptime_24h`, `uptime_7d`, `first_seen`, `up_for_hours` and `sites`.
470
+ Same filters as `find_proxies`, plus `min_uptime`, `works_on` (`["google"]`, `"reddit"`, `"amazon"`, `"instagram"`, `"tiktok"`, `"discord"`) and `limit`. Every result also has `uptime_24h`, `uptime_7d`, `first_seen`, `up_for_hours` and `sites`.
450
471
 
451
472
  Or let the library do the retrying: `ProxyRotator` loads a URL through the list and moves on to the next proxy when one fails – HTTPS only through proxies with verified TLS.
452
473
 
@@ -515,7 +536,7 @@ Without a password, `--serve-host` means **anyone who reaches the port can use i
515
536
 
516
537
  - every connection goes through a different proxy (unless sticky); fast and proven ones are preferred
517
538
  - `CONNECT` for HTTPS and plain HTTP requests; HTTP, SOCKS4 and SOCKS5 proxies can sit behind it (SOCKS5 with DNS through the proxy)
518
- - HTTPS only uses proxies that passed the test with **verified TLS** – no broken encryption
539
+ - HTTPS prefers proxies that passed the test with **verified TLS**; when no such proxy fits right now – none matches a wish like `country-de`, or they have all dropped out – it uses the others – your client's own certificate check still catches a proxy that breaks the encryption, so leave it on
519
540
  - 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
520
541
  - 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
521
542
  - `--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
@@ -523,6 +544,10 @@ Without a password, `--serve-host` means **anyone who reaches the port can use i
523
544
 
524
545
  In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In the wizard this is **Proxy server right away**.
525
546
 
547
+ **Live dashboard:** open `http://127.0.0.1:8899/__proxy-scraper/` in a browser – the pool, success rate, traffic, a live chart of requests, countries, the best proxies and the latest connections, refreshed every two seconds. It needs nothing from the internet, and `--serve-password` protects it like the rest.
548
+
549
+ <div align="center"><img src="docs/dashboard-live.png" alt="The live dashboard of the rotating proxy server: usable proxies, success rate, requests per second, countries and the latest connections" width="860"></div>
550
+
526
551
  <a id="pool-api"></a>
527
552
 
528
553
  ### Proxy pool API
@@ -565,6 +590,13 @@ The live list can also come to you: [`bot/`](bot/) is a Discord bot that posts e
565
590
 
566
591
  ## How it works
567
592
 
593
+ <picture>
594
+ <source media="(prefers-color-scheme: dark)" srcset="docs/checks-dark.svg">
595
+ <source media="(prefers-color-scheme: light)" srcset="docs/checks-light.svg">
596
+ <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%">
597
+ </picture>
598
+
599
+
568
600
  ```mermaid
569
601
  flowchart LR
570
602
  A[sources.json<br/>meta lists<br/>GitHub discovery] --> B[Fetch & parse<br/>in parallel on all cores]
@@ -741,12 +773,32 @@ proxychains4 -f results/latest/proxychains.conf curl https://api.ipify.org
741
773
 
742
774
  `clash.yaml` has all HTTP and SOCKS5 proxies plus a `url-test` group that always picks the fastest. `singbox.json` does the same for sing-box, SOCKS4 included, and opens a local proxy: `sing-box run -c results/latest/singbox.json`, then use `127.0.0.1:2080` as HTTP or SOCKS5 proxy. All three leave out HTTP proxies that can't tunnel (`CONNECT`), because these tools tunnel everything.
743
775
 
776
+ **Browsers and the OS** – `--export pac` writes `proxy.pac`: point Firefox, Chrome (via the system settings), FoxyProxy or macOS/Windows proxy settings at it and every request goes through the best 30 HTTP and SOCKS5 proxies in order, the browser moving on by itself when one fails. Local names and private IP addresses stay direct (a host name like `10.example.com` doesn't count as private). The file itself has no `DIRECT` fallback and resolves no host names, and SOCKS4 is left out because it would make the browser resolve names with your own DNS. Two Firefox settings matter: turn on *Proxy DNS when using SOCKS v5*, and set `network.proxy.failover_direct` to `false` in `about:config` – otherwise Firefox goes direct once every proxy has failed. No install at all: the live list publishes one every hour at `https://maximilianfeix.github.io/proxy-scraper/proxy.pac`.
777
+
778
+ **Burp Suite, OWASP ZAP, mitmproxy** – put the rotating server behind your intercepting proxy, so a scan or a brute-force test comes from many IPs while you still see every request. Start it with `proxy-scraper --recheck live --serve`, then:
779
+
780
+ | Tool | Where | Set |
781
+ |---|---|---|
782
+ | Burp Suite | *Settings → Network → Connections → Upstream proxy servers* | a rule for destination host `*`, proxy host `127.0.0.1`, port `8899`; with `--serve-password` add Basic auth (user `any` or a wish like `country-de`, the password) |
783
+ | OWASP ZAP | *Options → Network → Connection → HTTP Proxy* | host `127.0.0.1`, port `8899`, and under its authentication the user (`any` or a wish) and the password – use the HTTP setting, not SOCKS: ZAP never sends loopback addresses through its SOCKS proxy |
784
+ | mitmproxy | command line | `mitmproxy --mode upstream:http://127.0.0.1:8899 --upstream-auth country-us:x` |
785
+
786
+ Username wishes – `country-us` sends everything out through US proxies, `session-NAME` keeps one exit IP for a login flow – reach the server as the proxy login. mitmproxy sends it right away; Burp and ZAP may wait to be asked, so start the server with `--serve-password` when you rely on a wish there. **Keep your tool's upstream certificate checks on** (no `--ssl-insecure` in mitmproxy, no "ignore certificate errors" upstream in Burp or ZAP): free proxies are strangers, and that check is what stops one from reading or changing your HTTPS traffic. Tested end to end with mitmproxy 12, certificate checks on: HTTP and HTTPS through mitmproxy and the rotating server, every request out through a US proxy, and a site with an expired certificate refused. Only test what you're allowed to.
787
+
744
788
  **In a pipe** – `-o -` prints the hits to stdout, the interface moves to stderr
745
789
 
746
790
  ```bash
747
791
  proxy-scraper --recheck live --want 20 -y -o - | grep '^socks5://' > socks.txt
748
792
  ```
749
793
 
794
+ **Check a list you already have** – `--recheck -` reads it from stdin: plain `ip:port` lines, `type://ip:port`, logins, JSON, a CSV export or a table pasted from a website (HTML or Markdown), in the order it came in. Only what works from your network comes out:
795
+
796
+ ```bash
797
+ curl -s https://example.com/proxies.txt | proxy-scraper --recheck - -o - > working.txt
798
+ ```
799
+
800
+ Proxies without a type are tried as HTTP and as SOCKS5 – or as SOCKS4 with `--types socks4` alone. A password with a comma, quote, `|` or bracket can't be told apart from the text around it in a paste; put such proxies in a file, one per line, and use `--recheck file.txt`.
801
+
750
802
  **Any tool, through the rotating server**
751
803
 
752
804
  ```bash
@@ -819,7 +871,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
819
871
  | `--no-blocklisted` | skip proxies whose exit IP is on the SpamCop blocklist – those often get captchas |
820
872
  | `--no-dnsbl` | skip the blocklist lookup |
821
873
  | `--target URL` | only proxies that reach this site (repeatable) |
822
- | `--recheck [FILE\|live]` | only check proxies from a file, the last run, or the public live list |
874
+ | `--recheck [FILE\|-\|live]` | only check proxies from a file, stdin (`-`), the last run, or the public live list |
823
875
  | `--fast` | skip the HTTPS test (confirmation and anonymity still run) |
824
876
  | `--no-geo` | skip the country lookup |
825
877
  | `-c`, `--concurrency N` | simultaneous checks (default: 2000) |
@@ -834,7 +886,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
834
886
  | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
835
887
  | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
836
888
  | `-o FILE` | also write all hits to this file; `-o -` prints them to stdout |
837
- | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl` or `all` |
889
+ | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl`, `pac` or `all` |
838
890
  | `-V`, `--version` | print the version |
839
891
  | `--completion SHELL` | print the tab completion script for bash, zsh, fish or PowerShell |
840
892
 
@@ -866,6 +918,25 @@ The repo does part of the work itself:
866
918
 
867
919
  ## FAQ
868
920
 
921
+ <a id="who-runs-free-proxies"></a>
922
+
923
+ <details open>
924
+ <summary><b>Who runs free proxies – and should you use them?</b></summary>
925
+ <br>
926
+
927
+ Almost nobody runs a free proxy for you. What ends up on public lists is usually one of these:
928
+
929
+ - **Misconfigured servers** – a Squid, a router or an app with a proxy port that was meant to stay internal.
930
+ - **Deliberately open proxies** – a few volunteers and research projects, and services that give some away to sell the rest.
931
+ - **Infected machines** – computers and IoT devices whose owners don't know they relay traffic. Many residential exits are like this.
932
+ - **Traps** – honeypots that log what goes through them, and proxies that rewrite pages to inject ads or scripts.
933
+
934
+ proxy-scraper can't tell an infected home router from an open office proxy, but it filters what it can measure: a proxy has to answer two independent requests with the same exit IP (honeypots that only answer scanners drop out), deliver a known page byte for byte (injectors drop out), and HTTPS counts only with a certificate that verifies end to end. Each hit says whether its exit is in a datacenter.
935
+
936
+ Good uses: public data, checking how a site looks from another country, testing your own blocking and rate limits, research. Never send passwords, cookies, payment or personal data through a free proxy, and keep HTTPS certificate checks on. Use them only where you're allowed to.
937
+
938
+ </details>
939
+
869
940
  <details>
870
941
  <summary><b>Almost nothing gets through.</b></summary>
871
942
  <br>
@@ -920,7 +991,9 @@ Only for things that don't matter. Public proxies are run by strangers who can r
920
991
 
921
992
  What's next is in the [open issues](../../issues) – 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.
922
993
 
923
- - [ ] [Mirror the daily snapshots to a Hugging Face dataset](../../issues/188)
994
+ Shipped in v1.24: `--recheck -` for lists you pipe in, which proxies get through to Discord, and a README you can try in five seconds.
995
+
996
+ Shipped in v1.22 and v1.23: a live dashboard for the rotating server, `--export pac` and an hourly `proxy.pac`, "best first" that counts how likely a proxy is still up, the lists in a repository of their own ([free-proxy-list](https://github.com/maximilianfeix/free-proxy-list)), daily snapshots on Hugging Face, `brew install`, a Chinese README, Python 3.14, and a recipe for Burp Suite, ZAP and mitmproxy.
924
997
 
925
998
  Shipped in v1.10 to v1.21: download speed per proxy and "best first" everywhere, daily snapshots, a rotating proxy URL for requests, httpx and Playwright, `--pick` for working proxies without a scan, a proxy pool API compatible with jhao104/proxy_pool, your own lists with `--source`, a GitHub Action, a Telegram bot and an Atom feed for the weekly report.
926
999
 
@@ -969,12 +1042,13 @@ proxyscraper/
969
1042
  ├── geodb.py DB-IP country database (monthly, binary search)
970
1043
  ├── targets.py target sites for --target
971
1044
  ├── output.py result files
972
- ├── exporters.py proxychains, Clash, sing-box and curl formats (--export)
1045
+ ├── exporters.py proxychains, Clash, sing-box, curl and PAC formats (--export)
973
1046
  ├── server/ rotating proxy server (--serve): pool · http · upstream · socks · status · api · core
974
1047
  ├── api.py find_proxies() / check_proxies() for Python
975
1048
  ├── agent.py MCP tools without the SDK: live list, filters, fetch through proxies
976
1049
  ├── mcp_server.py MCP server (proxy-scraper-mcp) for AI agents
977
1050
  ├── publish.py live list for GitHub Actions
1051
+ ├── mirror.py the same lists in their own repo (free-proxy-list)
978
1052
  ├── paths.py where state and results are stored
979
1053
  ├── compat.py differences between Unix and Windows
980
1054
  ├── netio.py small HTTP client on asyncio
@@ -989,6 +1063,14 @@ proxyscraper/
989
1063
 
990
1064
  Questions, ideas and things you built with it go to [Discussions](https://github.com/maximilianfeix/proxy-scraper/discussions) – bugs to the [issues](../../issues). If proxy-scraper saves you time, a ⭐ helps others find it.
991
1065
 
1066
+ Thanks to everyone who helped build it – new sources, countries, Python 3.14, examples and more:
1067
+
1068
+ <a href="https://github.com/maximilianfeix/proxy-scraper/graphs/contributors">
1069
+ <img src="https://contrib.rocks/image?repo=maximilianfeix/proxy-scraper" alt="Contributors to proxy-scraper">
1070
+ </a>
1071
+
1072
+ Want to join? [Beginner-friendly issues](../../issues?q=is%3Aopen+label%3A%22good+first+issue%22) say where to start.
1073
+
992
1074
  <a href="https://star-history.com/#maximilianfeix/proxy-scraper&Date">
993
1075
  <picture>
994
1076
  <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date&theme=dark">
@@ -10,16 +10,19 @@
10
10
  [![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)
11
11
  [![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)
12
12
  [![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/)
13
- [![Python](https://img.shields.io/badge/python-3.9–3.13-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
13
+ [![Python](https://img.shields.io/badge/python-3.9–3.14-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
14
14
  [![Stars](https://img.shields.io/github/stars/maximilianfeix/proxy-scraper?style=flat-square&color=D4F77A&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/stargazers)
15
15
  [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](LICENSE)
16
16
 
17
17
  <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>
18
+ <a href="https://github.com/maximilianfeix/free-proxy-list"><img src="https://img.shields.io/badge/Just_the_lists-121113?style=for-the-badge" alt="Just the lists: free-proxy-list"></a>
18
19
  <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
19
20
  <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
20
21
  <a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
21
22
  <a href="bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
22
23
 
24
+ **English** · [简体中文](README.zh-CN.md)
25
+
23
26
  [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)
24
27
 
25
28
  </div>
@@ -30,16 +33,23 @@ Most free proxy lists are 95 % dead, and a good part of the rest are honeypots o
30
33
 
31
34
  **In numbers:** in one day it checked 3.6 million free proxies – 1.1 % worked, and more than half of the ones that answered failed a second request. [What's actually out there →](docs/free-proxies-in-numbers.md)
32
35
 
33
- <picture>
34
- <source media="(prefers-color-scheme: dark)" srcset="docs/checks-dark.svg">
35
- <source media="(prefers-color-scheme: light)" srcset="docs/checks-light.svg">
36
- <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%">
37
- </picture>
36
+ **Try it – no install, about five seconds:**
37
+
38
+ ```bash
39
+ uvx proxy-scraper-cli --pick 5 --types socks5 # 5 checked proxies
40
+
41
+ # or just the plain list
42
+ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
43
+ ```
44
+
45
+ `uvx` comes with [uv](https://docs.astral.sh/uv/); `pipx run proxy-scraper-cli --pick 5` does the same.
38
46
 
39
47
  <div align="center">
40
- <img src="docs/demo.svg" alt="Animated demo: setup wizard, collecting, live dashboard and final report" width="880">
48
+ <img src="docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
41
49
  </div>
42
50
 
51
+ > **Who runs free proxies – and is it safe to use them?** Mostly nobody on purpose: misconfigured servers with an open port, a few deliberately open ones, infected machines, and traps that log or rewrite your traffic. That's why every proxy here has to pass [five checks](#how-it-works), and why they're for public data and testing – never for logins, payments or anything personal. [More on where they come from →](#who-runs-free-proxies)
52
+
43
53
  <details>
44
54
  <summary><b>Table of contents</b></summary>
45
55
 
@@ -73,6 +83,14 @@ proxy-scraper
73
83
 
74
84
  The package is called `proxy-scraper-cli` on PyPI (the plain name is taken), the command is `proxy-scraper`.
75
85
 
86
+ **With [Homebrew](https://brew.sh)** on macOS and Linux:
87
+
88
+ ```bash
89
+ brew install maximilianfeix/tap/proxy-scraper
90
+ ```
91
+
92
+ The formula follows each release within about a day.
93
+
76
94
  <details>
77
95
  <summary><b>Other ways: Docker, pip, a faster event loop, or straight from the repo</b></summary>
78
96
  <br>
@@ -137,7 +155,9 @@ Keys: <kbd>↑</kbd><kbd>↓</kbd> select · <kbd>Space</kbd> toggle · <kbd>1</
137
155
 
138
156
  ## Live proxy list
139
157
 
140
- 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.
158
+ 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, best first: fast ones that are likely to still be up come on top.
159
+
160
+ > **Just want the lists?** They also live in a repository of their own, **[maximilianfeix/free-proxy-list](https://github.com/maximilianfeix/free-proxy-list)** – one list per protocol, per country and per site, updated every hour, with the numbers of the last run on the front page. Watch or star it to keep it at hand.
141
161
 
142
162
  <a href="https://maximilianfeix.github.io/proxy-scraper/"><picture>
143
163
  <source media="(prefers-color-scheme: dark)" srcset="https://maximilianfeix.github.io/proxy-scraper/chart-dark.svg">
@@ -167,7 +187,7 @@ Every protocol and country also has its own page with a plain download, e.g. [SO
167
187
  | 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) |
168
188
  | HTTPS-capable only | `type://ip:port` | [https.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/https.txt) |
169
189
  | Elite only | `type://ip:port` | [elite.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/elite.txt) |
170
- | Gets through to Google · Reddit · Amazon · Instagram · TikTok (no captcha, no block in the last run) | `type://ip:port` | [google.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/google.txt) · [reddit.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/reddit.txt) · [amazon.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/amazon.txt) · [instagram.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/instagram.txt) · [tiktok.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/tiktok.txt) |
190
+ | Gets through to Google · Reddit · Amazon · Instagram · TikTok · Discord (no captcha, no block in the last run) | `type://ip:port` | [google.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/google.txt) · [reddit.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/reddit.txt) · [amazon.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/amazon.txt) · [instagram.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/instagram.txt) · [tiktok.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/tiktok.txt) · [discord.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/discord.txt) |
171
191
  | Stable, on the list in 90 %+ of this week's runs | `type://ip:port` | [stable.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/stable.txt) |
172
192
  | With all details | latency, country, HTTPS, anonymity, exit IP, uptime, sites | [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) |
173
193
 
@@ -278,7 +298,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
278
298
  <td valign="top">
279
299
 
280
300
  **Real verification**<br>
281
- 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.
301
+ Every hit has to fetch two independent pages – that weeds out **honeypots** that only answer check requests: over 3.6 million checks, 54 % of the proxies that answered the first request failed the second. A third request catches proxies that **tamper with content**: about one in 40 working proxies changed a known page, usually by injecting a script ([the numbers](docs/free-proxies-in-numbers.md)). Plus: HTTPS through a tunnel with **verified TLS**, anonymity level *elite / anonymous / transparent* and the country of the exit IP.
282
302
 
283
303
  </td>
284
304
  <td valign="top">
@@ -320,13 +340,13 @@ Speed chart, latency histogram, protocols, countries and the latest hits in real
320
340
  <td valign="top">
321
341
 
322
342
  **Runs everywhere**<br>
323
- macOS, Linux and Windows, Python 3.9 to 3.13. Only two dependencies: `rich` and `certifi`. It even notices when a firewall blocks proxies.
343
+ macOS, Linux and Windows, Python 3.9 to 3.14. Only two dependencies: `rich` and `certifi`. It even notices when a firewall blocks proxies.
324
344
 
325
345
  </td>
326
346
  <td valign="top">
327
347
 
328
348
  **Thoroughly tested**<br>
329
- 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.
349
+ 760+ tests run offline against real mini proxies and honeypots on `localhost` – on Linux, macOS and Windows with Python 3.9, 3.11, 3.13 and 3.14.
330
350
 
331
351
  </td>
332
352
  </tr>
@@ -405,7 +425,7 @@ pool = itertools.cycle(p.url for p in proxies)
405
425
  r = requests.get("https://api.ipify.org", proxies={"https": next(pool)}, timeout=15) # pip install "requests[socks]"
406
426
  ```
407
427
 
408
- Same filters as `find_proxies`, plus `min_uptime`, `works_on` (`["google"]`, `"reddit"`, `"amazon"`, `"instagram"`, `"tiktok"`) and `limit`. Every result also has `uptime_24h`, `uptime_7d`, `first_seen`, `up_for_hours` and `sites`.
428
+ Same filters as `find_proxies`, plus `min_uptime`, `works_on` (`["google"]`, `"reddit"`, `"amazon"`, `"instagram"`, `"tiktok"`, `"discord"`) and `limit`. Every result also has `uptime_24h`, `uptime_7d`, `first_seen`, `up_for_hours` and `sites`.
409
429
 
410
430
  Or let the library do the retrying: `ProxyRotator` loads a URL through the list and moves on to the next proxy when one fails – HTTPS only through proxies with verified TLS.
411
431
 
@@ -474,7 +494,7 @@ Without a password, `--serve-host` means **anyone who reaches the port can use i
474
494
 
475
495
  - every connection goes through a different proxy (unless sticky); fast and proven ones are preferred
476
496
  - `CONNECT` for HTTPS and plain HTTP requests; HTTP, SOCKS4 and SOCKS5 proxies can sit behind it (SOCKS5 with DNS through the proxy)
477
- - HTTPS only uses proxies that passed the test with **verified TLS** – no broken encryption
497
+ - HTTPS prefers proxies that passed the test with **verified TLS**; when no such proxy fits right now – none matches a wish like `country-de`, or they have all dropped out – it uses the others – your client's own certificate check still catches a proxy that breaks the encryption, so leave it on
478
498
  - 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
479
499
  - 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
480
500
  - `--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
@@ -482,6 +502,10 @@ Without a password, `--serve-host` means **anyone who reaches the port can use i
482
502
 
483
503
  In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In the wizard this is **Proxy server right away**.
484
504
 
505
+ **Live dashboard:** open `http://127.0.0.1:8899/__proxy-scraper/` in a browser – the pool, success rate, traffic, a live chart of requests, countries, the best proxies and the latest connections, refreshed every two seconds. It needs nothing from the internet, and `--serve-password` protects it like the rest.
506
+
507
+ <div align="center"><img src="docs/dashboard-live.png" alt="The live dashboard of the rotating proxy server: usable proxies, success rate, requests per second, countries and the latest connections" width="860"></div>
508
+
485
509
  <a id="pool-api"></a>
486
510
 
487
511
  ### Proxy pool API
@@ -524,6 +548,13 @@ The live list can also come to you: [`bot/`](bot/) is a Discord bot that posts e
524
548
 
525
549
  ## How it works
526
550
 
551
+ <picture>
552
+ <source media="(prefers-color-scheme: dark)" srcset="docs/checks-dark.svg">
553
+ <source media="(prefers-color-scheme: light)" srcset="docs/checks-light.svg">
554
+ <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%">
555
+ </picture>
556
+
557
+
527
558
  ```mermaid
528
559
  flowchart LR
529
560
  A[sources.json<br/>meta lists<br/>GitHub discovery] --> B[Fetch & parse<br/>in parallel on all cores]
@@ -700,12 +731,32 @@ proxychains4 -f results/latest/proxychains.conf curl https://api.ipify.org
700
731
 
701
732
  `clash.yaml` has all HTTP and SOCKS5 proxies plus a `url-test` group that always picks the fastest. `singbox.json` does the same for sing-box, SOCKS4 included, and opens a local proxy: `sing-box run -c results/latest/singbox.json`, then use `127.0.0.1:2080` as HTTP or SOCKS5 proxy. All three leave out HTTP proxies that can't tunnel (`CONNECT`), because these tools tunnel everything.
702
733
 
734
+ **Browsers and the OS** – `--export pac` writes `proxy.pac`: point Firefox, Chrome (via the system settings), FoxyProxy or macOS/Windows proxy settings at it and every request goes through the best 30 HTTP and SOCKS5 proxies in order, the browser moving on by itself when one fails. Local names and private IP addresses stay direct (a host name like `10.example.com` doesn't count as private). The file itself has no `DIRECT` fallback and resolves no host names, and SOCKS4 is left out because it would make the browser resolve names with your own DNS. Two Firefox settings matter: turn on *Proxy DNS when using SOCKS v5*, and set `network.proxy.failover_direct` to `false` in `about:config` – otherwise Firefox goes direct once every proxy has failed. No install at all: the live list publishes one every hour at `https://maximilianfeix.github.io/proxy-scraper/proxy.pac`.
735
+
736
+ **Burp Suite, OWASP ZAP, mitmproxy** – put the rotating server behind your intercepting proxy, so a scan or a brute-force test comes from many IPs while you still see every request. Start it with `proxy-scraper --recheck live --serve`, then:
737
+
738
+ | Tool | Where | Set |
739
+ |---|---|---|
740
+ | Burp Suite | *Settings → Network → Connections → Upstream proxy servers* | a rule for destination host `*`, proxy host `127.0.0.1`, port `8899`; with `--serve-password` add Basic auth (user `any` or a wish like `country-de`, the password) |
741
+ | OWASP ZAP | *Options → Network → Connection → HTTP Proxy* | host `127.0.0.1`, port `8899`, and under its authentication the user (`any` or a wish) and the password – use the HTTP setting, not SOCKS: ZAP never sends loopback addresses through its SOCKS proxy |
742
+ | mitmproxy | command line | `mitmproxy --mode upstream:http://127.0.0.1:8899 --upstream-auth country-us:x` |
743
+
744
+ Username wishes – `country-us` sends everything out through US proxies, `session-NAME` keeps one exit IP for a login flow – reach the server as the proxy login. mitmproxy sends it right away; Burp and ZAP may wait to be asked, so start the server with `--serve-password` when you rely on a wish there. **Keep your tool's upstream certificate checks on** (no `--ssl-insecure` in mitmproxy, no "ignore certificate errors" upstream in Burp or ZAP): free proxies are strangers, and that check is what stops one from reading or changing your HTTPS traffic. Tested end to end with mitmproxy 12, certificate checks on: HTTP and HTTPS through mitmproxy and the rotating server, every request out through a US proxy, and a site with an expired certificate refused. Only test what you're allowed to.
745
+
703
746
  **In a pipe** – `-o -` prints the hits to stdout, the interface moves to stderr
704
747
 
705
748
  ```bash
706
749
  proxy-scraper --recheck live --want 20 -y -o - | grep '^socks5://' > socks.txt
707
750
  ```
708
751
 
752
+ **Check a list you already have** – `--recheck -` reads it from stdin: plain `ip:port` lines, `type://ip:port`, logins, JSON, a CSV export or a table pasted from a website (HTML or Markdown), in the order it came in. Only what works from your network comes out:
753
+
754
+ ```bash
755
+ curl -s https://example.com/proxies.txt | proxy-scraper --recheck - -o - > working.txt
756
+ ```
757
+
758
+ Proxies without a type are tried as HTTP and as SOCKS5 – or as SOCKS4 with `--types socks4` alone. A password with a comma, quote, `|` or bracket can't be told apart from the text around it in a paste; put such proxies in a file, one per line, and use `--recheck file.txt`.
759
+
709
760
  **Any tool, through the rotating server**
710
761
 
711
762
  ```bash
@@ -778,7 +829,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
778
829
  | `--no-blocklisted` | skip proxies whose exit IP is on the SpamCop blocklist – those often get captchas |
779
830
  | `--no-dnsbl` | skip the blocklist lookup |
780
831
  | `--target URL` | only proxies that reach this site (repeatable) |
781
- | `--recheck [FILE\|live]` | only check proxies from a file, the last run, or the public live list |
832
+ | `--recheck [FILE\|-\|live]` | only check proxies from a file, stdin (`-`), the last run, or the public live list |
782
833
  | `--fast` | skip the HTTPS test (confirmation and anonymity still run) |
783
834
  | `--no-geo` | skip the country lookup |
784
835
  | `-c`, `--concurrency N` | simultaneous checks (default: 2000) |
@@ -793,7 +844,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
793
844
  | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
794
845
  | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
795
846
  | `-o FILE` | also write all hits to this file; `-o -` prints them to stdout |
796
- | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl` or `all` |
847
+ | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl`, `pac` or `all` |
797
848
  | `-V`, `--version` | print the version |
798
849
  | `--completion SHELL` | print the tab completion script for bash, zsh, fish or PowerShell |
799
850
 
@@ -825,6 +876,25 @@ The repo does part of the work itself:
825
876
 
826
877
  ## FAQ
827
878
 
879
+ <a id="who-runs-free-proxies"></a>
880
+
881
+ <details open>
882
+ <summary><b>Who runs free proxies – and should you use them?</b></summary>
883
+ <br>
884
+
885
+ Almost nobody runs a free proxy for you. What ends up on public lists is usually one of these:
886
+
887
+ - **Misconfigured servers** – a Squid, a router or an app with a proxy port that was meant to stay internal.
888
+ - **Deliberately open proxies** – a few volunteers and research projects, and services that give some away to sell the rest.
889
+ - **Infected machines** – computers and IoT devices whose owners don't know they relay traffic. Many residential exits are like this.
890
+ - **Traps** – honeypots that log what goes through them, and proxies that rewrite pages to inject ads or scripts.
891
+
892
+ proxy-scraper can't tell an infected home router from an open office proxy, but it filters what it can measure: a proxy has to answer two independent requests with the same exit IP (honeypots that only answer scanners drop out), deliver a known page byte for byte (injectors drop out), and HTTPS counts only with a certificate that verifies end to end. Each hit says whether its exit is in a datacenter.
893
+
894
+ Good uses: public data, checking how a site looks from another country, testing your own blocking and rate limits, research. Never send passwords, cookies, payment or personal data through a free proxy, and keep HTTPS certificate checks on. Use them only where you're allowed to.
895
+
896
+ </details>
897
+
828
898
  <details>
829
899
  <summary><b>Almost nothing gets through.</b></summary>
830
900
  <br>
@@ -879,7 +949,9 @@ Only for things that don't matter. Public proxies are run by strangers who can r
879
949
 
880
950
  What's next is in the [open issues](../../issues) – 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.
881
951
 
882
- - [ ] [Mirror the daily snapshots to a Hugging Face dataset](../../issues/188)
952
+ Shipped in v1.24: `--recheck -` for lists you pipe in, which proxies get through to Discord, and a README you can try in five seconds.
953
+
954
+ Shipped in v1.22 and v1.23: a live dashboard for the rotating server, `--export pac` and an hourly `proxy.pac`, "best first" that counts how likely a proxy is still up, the lists in a repository of their own ([free-proxy-list](https://github.com/maximilianfeix/free-proxy-list)), daily snapshots on Hugging Face, `brew install`, a Chinese README, Python 3.14, and a recipe for Burp Suite, ZAP and mitmproxy.
883
955
 
884
956
  Shipped in v1.10 to v1.21: download speed per proxy and "best first" everywhere, daily snapshots, a rotating proxy URL for requests, httpx and Playwright, `--pick` for working proxies without a scan, a proxy pool API compatible with jhao104/proxy_pool, your own lists with `--source`, a GitHub Action, a Telegram bot and an Atom feed for the weekly report.
885
957
 
@@ -928,12 +1000,13 @@ proxyscraper/
928
1000
  ├── geodb.py DB-IP country database (monthly, binary search)
929
1001
  ├── targets.py target sites for --target
930
1002
  ├── output.py result files
931
- ├── exporters.py proxychains, Clash, sing-box and curl formats (--export)
1003
+ ├── exporters.py proxychains, Clash, sing-box, curl and PAC formats (--export)
932
1004
  ├── server/ rotating proxy server (--serve): pool · http · upstream · socks · status · api · core
933
1005
  ├── api.py find_proxies() / check_proxies() for Python
934
1006
  ├── agent.py MCP tools without the SDK: live list, filters, fetch through proxies
935
1007
  ├── mcp_server.py MCP server (proxy-scraper-mcp) for AI agents
936
1008
  ├── publish.py live list for GitHub Actions
1009
+ ├── mirror.py the same lists in their own repo (free-proxy-list)
937
1010
  ├── paths.py where state and results are stored
938
1011
  ├── compat.py differences between Unix and Windows
939
1012
  ├── netio.py small HTTP client on asyncio
@@ -948,6 +1021,14 @@ proxyscraper/
948
1021
 
949
1022
  Questions, ideas and things you built with it go to [Discussions](https://github.com/maximilianfeix/proxy-scraper/discussions) – bugs to the [issues](../../issues). If proxy-scraper saves you time, a ⭐ helps others find it.
950
1023
 
1024
+ Thanks to everyone who helped build it – new sources, countries, Python 3.14, examples and more:
1025
+
1026
+ <a href="https://github.com/maximilianfeix/proxy-scraper/graphs/contributors">
1027
+ <img src="https://contrib.rocks/image?repo=maximilianfeix/proxy-scraper" alt="Contributors to proxy-scraper">
1028
+ </a>
1029
+
1030
+ Want to join? [Beginner-friendly issues](../../issues?q=is%3Aopen+label%3A%22good+first+issue%22) say where to start.
1031
+
951
1032
  <a href="https://star-history.com/#maximilianfeix/proxy-scraper&Date">
952
1033
  <picture>
953
1034
  <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date&theme=dark">