proxy-scraper-cli 1.24.0__tar.gz → 1.26.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 (138) hide show
  1. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/PKG-INFO +65 -47
  2. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/README.md +62 -46
  3. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/PKG-INFO +65 -47
  4. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/SOURCES.txt +8 -1
  5. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/requires.txt +2 -0
  6. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/__init__.py +1 -1
  7. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/app.py +11 -4
  8. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/mirror.py +2 -0
  9. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/parsing.py +29 -4
  10. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/pyproject.toml +1 -1
  11. proxy_scraper_cli-1.26.0/tests/test_citation.py +23 -0
  12. proxy_scraper_cli-1.26.0/tests/test_colon_logins.py +86 -0
  13. proxy_scraper_cli-1.26.0/tests/test_hf_card.py +18 -0
  14. proxy_scraper_cli-1.26.0/tests/test_hf_parquet.py +98 -0
  15. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_mirror.py +8 -0
  16. proxy_scraper_cli-1.26.0/tests/test_pypi_readme.py +129 -0
  17. proxy_scraper_cli-1.26.0/tests/test_workflow_permissions.py +42 -0
  18. proxy_scraper_cli-1.26.0/tests/test_workflow_pins.py +34 -0
  19. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/LICENSE +0 -0
  20. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
  21. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
  22. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
  23. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/__main__.py +0 -0
  24. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/action.py +0 -0
  25. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/agent.py +0 -0
  26. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/api.py +0 -0
  27. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/asndb.py +0 -0
  28. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/blocklist.py +0 -0
  29. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/charts.py +0 -0
  30. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/checker.py +0 -0
  31. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/cli.py +0 -0
  32. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/compat.py +0 -0
  33. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/completion.py +0 -0
  34. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/exporters.py +0 -0
  35. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/fetchcache.py +0 -0
  36. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/geo.py +0 -0
  37. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/geodb.py +0 -0
  38. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/handshake.py +0 -0
  39. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/history.py +0 -0
  40. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/judges.py +0 -0
  41. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/mcp_entry.py +0 -0
  42. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/mcp_server.py +0 -0
  43. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/netio.py +0 -0
  44. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/options.py +0 -0
  45. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/output.py +0 -0
  46. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/pages.py +0 -0
  47. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/paths.py +0 -0
  48. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/pipeline.py +0 -0
  49. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/preferences.py +0 -0
  50. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/proxypages.py +0 -0
  51. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/publish.py +0 -0
  52. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ranking.py +0 -0
  53. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/report.py +0 -0
  54. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/runsteps.py +0 -0
  55. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/__init__.py +0 -0
  56. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/api.py +0 -0
  57. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/core.py +0 -0
  58. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/dashboard.html +0 -0
  59. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/http.py +0 -0
  60. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/pool.py +0 -0
  61. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/socks.py +0 -0
  62. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/status.py +0 -0
  63. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/server/upstream.py +0 -0
  64. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/site/apple-touch-icon.png +0 -0
  65. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
  66. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/site/index.html +0 -0
  67. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/site/logo.png +0 -0
  68. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/site/og.png +0 -0
  69. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/sites.py +0 -0
  70. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/sources.json +0 -0
  71. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/sources.py +0 -0
  72. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/speed.py +0 -0
  73. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/targets.py +0 -0
  74. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/__init__.py +0 -0
  75. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/dashboard.py +0 -0
  76. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/keys.py +0 -0
  77. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/report.py +0 -0
  78. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/serve.py +0 -0
  79. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/widgets.py +0 -0
  80. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/proxyscraper/ui/wizard.py +0 -0
  81. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/setup.cfg +0 -0
  82. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_action.py +0 -0
  83. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_agent.py +0 -0
  84. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_api.py +0 -0
  85. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_app.py +0 -0
  86. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_asndb.py +0 -0
  87. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_auth.py +0 -0
  88. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_blocklist.py +0 -0
  89. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_charts.py +0 -0
  90. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_checker.py +0 -0
  91. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_compat.py +0 -0
  92. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_completion.py +0 -0
  93. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_discovery_growth.py +0 -0
  94. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_exporters.py +0 -0
  95. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_fetchcache.py +0 -0
  96. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_geodb.py +0 -0
  97. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_judges.py +0 -0
  98. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_learning.py +0 -0
  99. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_live_api.py +0 -0
  100. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_mcp_server.py +0 -0
  101. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_mine_sources.py +0 -0
  102. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_options.py +0 -0
  103. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_output_stdout.py +0 -0
  104. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_own_sources.py +0 -0
  105. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_pac.py +0 -0
  106. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_packaging.py +0 -0
  107. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_pages.py +0 -0
  108. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_parsing.py +0 -0
  109. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_parsing_fuzz.py +0 -0
  110. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_paths.py +0 -0
  111. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_pick.py +0 -0
  112. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_pipeline.py +0 -0
  113. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_preferences.py +0 -0
  114. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_proxy_pages.py +0 -0
  115. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_proxy_sources.py +0 -0
  116. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_publish.py +0 -0
  117. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_recheck_stdin.py +0 -0
  118. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_report.py +0 -0
  119. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_robustness.py +0 -0
  120. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_rotator.py +0 -0
  121. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_serve_api.py +0 -0
  122. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_serve_dashboard.py +0 -0
  123. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_serve_password.py +0 -0
  124. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_serve_refill.py +0 -0
  125. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_serve_v2.py +0 -0
  126. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_server.py +0 -0
  127. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_server_closed_writer.py +0 -0
  128. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_server_fixes.py +0 -0
  129. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_sites.py +0 -0
  130. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_sources_json.py +0 -0
  131. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_speed.py +0 -0
  132. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_speed_ranking.py +0 -0
  133. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_survival_ranking.py +0 -0
  134. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_tamper.py +0 -0
  135. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_targets.py +0 -0
  136. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_ui.py +0 -0
  137. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.0}/tests/test_uptime.py +0 -0
  138. {proxy_scraper_cli-1.24.0 → proxy_scraper_cli-1.26.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.24.0
3
+ Version: 1.26.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
@@ -37,33 +37,36 @@ Requires-Dist: mcp<3,>=2.2; python_version >= "3.10" and extra == "mcp"
37
37
  Provides-Extra: dev
38
38
  Requires-Dist: pytest; extra == "dev"
39
39
  Requires-Dist: hypothesis; extra == "dev"
40
+ Requires-Dist: pyyaml; extra == "dev"
41
+ Requires-Dist: markdown-it-py; extra == "dev"
40
42
  Requires-Dist: ruff==0.16.9; extra == "dev"
41
43
  Dynamic: license-file
42
44
 
43
45
  <div align="center">
44
46
 
45
47
  <picture>
46
- <source media="(prefers-color-scheme: dark)" srcset="docs/banner-dark.svg">
47
- <source media="(prefers-color-scheme: light)" srcset="docs/banner-light.svg">
48
- <img src="docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
48
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/banner-dark.svg">
49
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/banner-light.svg">
50
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
49
51
  </picture>
50
52
 
51
53
  [![tests](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml/badge.svg)](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
52
54
  [![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)
53
55
  [![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)
54
56
  [![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/)
55
- [![Python](https://img.shields.io/badge/python-3.9–3.14-D4F77A?style=flat-square&labelColor=121113)](pyproject.toml)
57
+ [![Downloads](https://img.shields.io/pepy/dt/proxy-scraper-cli?style=flat-square&color=D4F77A&labelColor=121113&label=downloads)](https://pepy.tech/projects/proxy-scraper-cli)
58
+ [![Python](https://img.shields.io/badge/python-3.9–3.14-D4F77A?style=flat-square&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/pyproject.toml)
56
59
  [![Stars](https://img.shields.io/github/stars/maximilianfeix/proxy-scraper?style=flat-square&color=D4F77A&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/stargazers)
57
- [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](LICENSE)
60
+ [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/LICENSE)
58
61
 
59
62
  <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
63
  <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>
61
64
  <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
62
65
  <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
63
66
  <a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
64
- <a href="bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
67
+ <a href="https://github.com/maximilianfeix/proxy-scraper/tree/v1.26.0/bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
65
68
 
66
- **English** · [简体中文](README.zh-CN.md)
69
+ **English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/README.zh-CN.md)
67
70
 
68
71
  [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)
69
72
 
@@ -73,7 +76,9 @@ Dynamic: license-file
73
76
 
74
77
  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.
75
78
 
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)
79
+ **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 →](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/docs/free-proxies-in-numbers.md)
80
+
81
+ **Used by:** the hourly list is a built-in source of [monosans/proxy-scraper-checker](https://github.com/monosans/proxy-scraper-checker) and [gfpcom/free-proxy-list](https://github.com/gfpcom/free-proxy-list).
77
82
 
78
83
  **Try it – no install, about five seconds:**
79
84
 
@@ -87,7 +92,7 @@ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
87
92
  `uvx` comes with [uv](https://docs.astral.sh/uv/); `pipx run proxy-scraper-cli --pick 5` does the same.
88
93
 
89
94
  <div align="center">
90
- <img src="docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
95
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
91
96
  </div>
92
97
 
93
98
  > **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)
@@ -176,7 +181,7 @@ Installed, the learned state lives in your user data folder (`~/Library/Applicat
176
181
  Started without arguments, a wizard asks what you are looking for:
177
182
 
178
183
  <div align="center">
179
- <img src="docs/wizard.svg" alt="Setup wizard" width="760">
184
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/wizard.svg" alt="Setup wizard" width="760">
180
185
  </div>
181
186
 
182
187
  | Preset | What it does |
@@ -197,9 +202,9 @@ Keys: <kbd>↑</kbd><kbd>↓</kbd> select · <kbd>Space</kbd> toggle · <kbd>1</
197
202
 
198
203
  ## Live proxy list
199
204
 
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.
205
+ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and publishes the hits to the [`proxy-list`](https://github.com/maximilianfeix/proxy-scraper/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
206
 
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.
207
+ > **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. Other tools pull it too: [monosans/proxy-scraper-checker](https://github.com/monosans/proxy-scraper-checker) and [gfpcom/free-proxy-list](https://github.com/gfpcom/free-proxy-list) use it as a built-in source.
203
208
 
204
209
  <a href="https://maximilianfeix.github.io/proxy-scraper/"><picture>
205
210
  <source media="(prefers-color-scheme: dark)" srcset="https://maximilianfeix.github.io/proxy-scraper/chart-dark.svg">
@@ -211,15 +216,15 @@ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and pub
211
216
 
212
217
  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`).
213
218
 
214
- <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>
219
+ <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/website.png" alt="The live list website" width="860"></a></div>
215
220
 
216
221
  <div align="center">
217
222
 
218
- [![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)
223
+ [![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)](https://github.com/maximilianfeix/proxy-scraper/tree/proxy-list)
219
224
  [![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)
220
225
  [![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)
221
226
  [![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)
222
- [![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)
227
+ [![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)](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/proxy-list.yml)
223
228
 
224
229
  </div>
225
230
 
@@ -243,7 +248,7 @@ Every protocol and country also has its own page with a plain download, e.g. [SO
243
248
  curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt | head
244
249
  ```
245
250
 
246
- **Over time:** every day the first run's `proxies.json` is kept for good as a gzipped asset of the release of that year, like [snapshots-2026](../../releases/tag/snapshots-2026) – `proxies-2026-09-28.json.gz` and so on, for anyone who wants to look at free proxies over weeks and months.
251
+ **Over time:** every day the first run's `proxies.json` is kept for good as a gzipped asset of the release of that year, like [snapshots-2026](https://github.com/maximilianfeix/proxy-scraper/releases/tag/snapshots-2026) – `proxies-2026-09-28.json.gz` and so on, for anyone who wants to look at free proxies over weeks and months.
247
252
 
248
253
  Every file is also on GitHub Pages, which sits behind a CDN, isn't rate limited like raw.githubusercontent and sends CORS headers, so it works straight from the browser: `https://maximilianfeix.github.io/proxy-scraper/socks5.txt`. [jsDelivr](https://cdn.jsdelivr.net/gh/maximilianfeix/proxy-scraper@proxy-list/) works too, but can lag behind by a few hours.
249
254
 
@@ -285,7 +290,7 @@ claude mcp add proxy-scraper -- uvx --python ">=3.10" --from "proxy-scraper-cli[
285
290
  ```
286
291
 
287
292
  <details>
288
- <summary><b>VS Code, Codex, or without uv</b></summary>
293
+ <summary><b>VS Code, Codex, Docker, or without uv</b></summary>
289
294
 
290
295
  **VS Code** – `.vscode/mcp.json`:
291
296
 
@@ -311,6 +316,19 @@ args = ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper
311
316
 
312
317
  **Without uv:** `pipx install --python python3.12 "proxy-scraper-cli[mcp]"` (any Python 3.10+), then use `proxy-scraper-mcp` as the command.
313
318
 
319
+ **Docker** – no Python needed, the image has everything:
320
+
321
+ ```json
322
+ {
323
+ "mcpServers": {
324
+ "proxy-scraper": {
325
+ "command": "docker",
326
+ "args": ["run", "-i", "--rm", "ghcr.io/maximilianfeix/proxy-scraper", "--mcp"]
327
+ }
328
+ }
329
+ }
330
+ ```
331
+
314
332
  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.
315
333
 
316
334
  </details>
@@ -340,7 +358,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
340
358
  <td valign="top">
341
359
 
342
360
  **Real verification**<br>
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.
361
+ 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](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/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.
344
362
 
345
363
  </td>
346
364
  <td valign="top">
@@ -525,7 +543,7 @@ proxy-scraper --recheck --serve --serve-host 0.0.0.0
525
543
  curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
526
544
  ```
527
545
 
528
- 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`.
546
+ Without a password, `--serve-host` means **anyone who reaches the port can use it**. The ready-made [`compose.yaml`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/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`.
529
547
 
530
548
  | Option | What it does |
531
549
  |---|---|
@@ -546,7 +564,7 @@ In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In th
546
564
 
547
565
  **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
566
 
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>
567
+ <div align="center"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/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
568
 
551
569
  <a id="pool-api"></a>
552
570
 
@@ -584,16 +602,16 @@ requests.get("https://example.com", proxies={"http": proxy, "https": proxy})
584
602
 
585
603
  ## Discord and Telegram bot
586
604
 
587
- 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. The same process answers on Telegram too: `/proxy de socks5` for one proxy with a curl line, `/proxies 10 us https` for a short list. Setup in [bot/README.md](bot/README.md).
605
+ The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.26.0/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. The same process answers on Telegram too: `/proxy de socks5` for one proxy with a curl line, `/proxies 10 us https` for a short list. Setup in [bot/README.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/bot/README.md).
588
606
 
589
607
  <a id="how-it-works"></a>
590
608
 
591
609
  ## How it works
592
610
 
593
611
  <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%">
612
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/checks-dark.svg">
613
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/checks-light.svg">
614
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/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
615
  </picture>
598
616
 
599
617
 
@@ -608,7 +626,7 @@ flowchart LR
608
626
  G -. next run .-> C
609
627
  ```
610
628
 
611
- 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.
629
+ 1. **Sources** – the curated list in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/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.
612
630
  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.
613
631
  3. **Prioritize** – known working proxies first, then by the learned hit rate of their sources.
614
632
  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.
@@ -620,9 +638,9 @@ flowchart LR
620
638
  <summary><b>📸 See the live dashboard and final report</b></summary>
621
639
  <br>
622
640
  <div align="center">
623
- <img src="docs/dashboard.svg" alt="Live dashboard while checking" width="860">
641
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
624
642
  <br><br>
625
- <img src="docs/summary.svg" alt="Final report after a run" width="860">
643
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.26.0/docs/summary.svg" alt="Final report after a run" width="860">
626
644
  </div>
627
645
  </details>
628
646
 
@@ -633,7 +651,7 @@ proxy-scraper --source https://example.com/my-list.txt --source socks5=./socks.t
633
651
  proxy-scraper --only-sources --source bought.txt --want 50 # only yours
634
652
  ```
635
653
 
636
- Any text with `ip:port` works; lines like `socks5://user:pass@host:port` keep their type, bare ones are tried as HTTP and SOCKS5 unless you write `http=…`.
654
+ Any text with `ip:port` works; lines like `socks5://user:pass@host:port` keep their type, bare ones are tried as HTTP and SOCKS5 unless you write `http=…`. For logins written the way many paid lists export them, `ip:port:user:pass`, use `--recheck bought.txt` or pipe the list into `--recheck -` – sources leave that form alone, since lists like `ip:port:US:elite` look the same.
637
655
 
638
656
  <a id="output"></a>
639
657
 
@@ -791,7 +809,7 @@ Username wishes – `country-us` sends everything out through US proxies, `sessi
791
809
  proxy-scraper --recheck live --want 20 -y -o - | grep '^socks5://' > socks.txt
792
810
  ```
793
811
 
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:
812
+ **Check a list you already have** – `--recheck -` reads it from stdin: plain `ip:port` lines, `type://ip:port`, logins (`user:pass@ip:port` or `ip:port:user:pass`), 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
813
 
796
814
  ```bash
797
815
  curl -s https://example.com/proxies.txt | proxy-scraper --recheck - -o - > working.txt
@@ -905,13 +923,13 @@ The repo does part of the work itself:
905
923
 
906
924
  | Workflow | What it does |
907
925
  |---|---|
908
- | [**tests**](../../actions/workflows/tests.yml) | 3 operating systems × 3 Python versions, plus a built and installed package – on every push and pull request |
909
- | [**lint**](../../actions/workflows/lint.yml) | `ruff` with a pinned version – same rules locally and in CI |
910
- | [**codeql**](../../actions/workflows/codeql.yml) | security analysis on every push and once a week |
911
- | [**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 |
912
- | [**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` |
913
- | [**release**](../../actions/workflows/release.yml) | on a version tag: test, build, smoke-test and publish a GitHub release with the wheel |
914
- | [**discord bot**](../../actions/workflows/bot.yml) | tests the bot and deploys it to the server on every change in `bot/` |
926
+ | [**tests**](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml) | 3 operating systems × 3 Python versions, plus a built and installed package – on every push and pull request |
927
+ | [**lint**](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/lint.yml) | `ruff` with a pinned version – same rules locally and in CI |
928
+ | [**codeql**](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/codeql.yml) | security analysis on every push and once a week |
929
+ | [**proxy list**](https://github.com/maximilianfeix/proxy-scraper/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 |
930
+ | [**docker**](https://github.com/maximilianfeix/proxy-scraper/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` |
931
+ | [**release**](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/release.yml) | on a version tag: test, build, smoke-test and publish a GitHub release with the wheel |
932
+ | [**discord bot**](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/bot.yml) | tests the bot and deploys it to the server on every change in `bot/` |
915
933
  | **Dependabot** | keeps the action versions up to date |
916
934
 
917
935
  <a id="faq"></a>
@@ -989,9 +1007,9 @@ Only for things that don't matter. Public proxies are run by strangers who can r
989
1007
 
990
1008
  ## Roadmap
991
1009
 
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.
1010
+ What's next is in the [open issues](https://github.com/maximilianfeix/proxy-scraper/issues) – ideas and wishes are welcome as an [issue](https://github.com/maximilianfeix/proxy-scraper/issues/new/choose). During Hacktoberfest there are [beginner-friendly issues](https://github.com/maximilianfeix/proxy-scraper/issues?q=is%3Aopen+label%3Ahacktoberfest) with pointers on where to start.
993
1011
 
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.
1012
+ Shipped in v1.24 to v1.26: `--recheck -` for lists you pipe in, which proxies get through to Discord, a README you can try in five seconds, the MCP server in the Docker image, logins written as `ip:port:user:pass`, and a Hugging Face dataset that loads in one line.
995
1013
 
996
1014
  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.
997
1015
 
@@ -999,17 +1017,17 @@ Shipped in v1.10 to v1.21: download speed per proxy and "best first" everywhere,
999
1017
 
1000
1018
  Shipped in v1.8 and v1.9: uptime per proxy and `stable.txt`, which proxies get through to Google, Reddit and Amazon, `live_proxies()` in Python, a page per proxy with its week of checks, a weekly report, live charts in this README, shareable filters on the website, sources mined from other scrapers' lists, untyped lists tried as HTTP and SOCKS5, `--export singbox`, PowerShell completion and recipes for httpx, aiohttp and Scrapy.
1001
1019
 
1002
- 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.
1020
+ Shipped in [v1.7](https://github.com/maximilianfeix/proxy-scraper/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.
1003
1021
 
1004
- 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.
1022
+ Shipped in [v1.6](https://github.com/maximilianfeix/proxy-scraper/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.
1005
1023
 
1006
- 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)).
1024
+ Shipped in [v1.5](https://github.com/maximilianfeix/proxy-scraper/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](https://github.com/maximilianfeix/proxy-scraper/issues/3)) and IPv6 ([#1](https://github.com/maximilianfeix/proxy-scraper/issues/1)).
1007
1025
 
1008
1026
  <a id="contributing"></a>
1009
1027
 
1010
1028
  ## Contributing
1011
1029
 
1012
- 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:
1030
+ Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
1013
1031
 
1014
1032
  ```bash
1015
1033
  pip install -e ".[dev]"
@@ -1061,7 +1079,7 @@ proxyscraper/
1061
1079
 
1062
1080
  ## Community
1063
1081
 
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.
1082
+ Questions, ideas and things you built with it go to [Discussions](https://github.com/maximilianfeix/proxy-scraper/discussions) – bugs to the [issues](https://github.com/maximilianfeix/proxy-scraper/issues). If proxy-scraper saves you time, a ⭐ helps others find it.
1065
1083
 
1066
1084
  Thanks to everyone who helped build it – new sources, countries, Python 3.14, examples and more:
1067
1085
 
@@ -1069,7 +1087,7 @@ Thanks to everyone who helped build it – new sources, countries, Python 3.14,
1069
1087
  <img src="https://contrib.rocks/image?repo=maximilianfeix/proxy-scraper" alt="Contributors to proxy-scraper">
1070
1088
  </a>
1071
1089
 
1072
- Want to join? [Beginner-friendly issues](../../issues?q=is%3Aopen+label%3A%22good+first+issue%22) say where to start.
1090
+ Want to join? [Beginner-friendly issues](https://github.com/maximilianfeix/proxy-scraper/issues?q=is%3Aopen+label%3A%22good+first+issue%22) say where to start.
1073
1091
 
1074
1092
  <a href="https://star-history.com/#maximilianfeix/proxy-scraper&Date">
1075
1093
  <picture>
@@ -1083,7 +1101,7 @@ Want to join? [Beginner-friendly issues](../../issues?q=is%3Aopen+label%3A%22goo
1083
1101
 
1084
1102
  ## Acknowledgements
1085
1103
 
1086
- 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
1104
+ proxy-scraper stands on the work of the people who publish free proxy lists. Thanks to everyone listed in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/proxyscraper/sources.json), and especially to
1087
1105
 
1088
1106
  - [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
1089
1107
  - [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
@@ -1098,7 +1116,7 @@ This tool only collects publicly listed proxies and checks whether they work. Yo
1098
1116
 
1099
1117
  ---
1100
1118
 
1101
- <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>
1119
+ <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.26.0/CONTRIBUTING.md">Contributing</a></sub>
1102
1120
 
1103
1121
  <sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
1104
1122