proxy-scraper-cli 1.27.0__tar.gz → 1.28.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 (143) hide show
  1. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/PKG-INFO +62 -30
  2. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/README.md +60 -28
  3. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/PKG-INFO +62 -30
  4. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/SOURCES.txt +4 -0
  5. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/requires.txt +1 -1
  6. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/__init__.py +1 -1
  7. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/app.py +30 -1
  8. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/checker.py +3 -2
  9. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/cli.py +3 -2
  10. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/exporters.py +83 -0
  11. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/judges.py +2 -2
  12. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/netio.py +13 -1
  13. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/publish.py +9 -3
  14. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/runsteps.py +2 -2
  15. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/core.py +9 -0
  16. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/http.py +18 -2
  17. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/site/index.html +1 -1
  18. proxy_scraper_cli-1.28.0/proxyscraper/sourcepages.py +209 -0
  19. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/sources.py +9 -2
  20. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/targets.py +5 -5
  21. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/pyproject.toml +11 -1
  22. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_app.py +45 -0
  23. proxy_scraper_cli-1.28.0/tests/test_bad_hosts_and_host_header.py +144 -0
  24. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_exporters.py +50 -1
  25. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_mcp_server.py +11 -0
  26. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_mine_sources.py +54 -0
  27. proxy_scraper_cli-1.28.0/tests/test_readme_translations.py +42 -0
  28. proxy_scraper_cli-1.28.0/tests/test_source_pages.py +128 -0
  29. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/LICENSE +0 -0
  30. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
  31. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
  32. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
  33. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/__main__.py +0 -0
  34. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/action.py +0 -0
  35. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/agent.py +0 -0
  36. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/api.py +0 -0
  37. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/asndb.py +0 -0
  38. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/blocklist.py +0 -0
  39. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/charts.py +0 -0
  40. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/compat.py +0 -0
  41. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/completion.py +0 -0
  42. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/fetchcache.py +0 -0
  43. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/geo.py +0 -0
  44. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/geodb.py +0 -0
  45. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/handshake.py +0 -0
  46. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/history.py +0 -0
  47. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/mcp_entry.py +0 -0
  48. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/mcp_server.py +0 -0
  49. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/mirror.py +0 -0
  50. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/options.py +0 -0
  51. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/output.py +0 -0
  52. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/pages.py +0 -0
  53. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/parsing.py +0 -0
  54. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/paths.py +0 -0
  55. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/pipeline.py +0 -0
  56. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/preferences.py +0 -0
  57. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/proxypages.py +0 -0
  58. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ranking.py +0 -0
  59. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/report.py +0 -0
  60. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/__init__.py +0 -0
  61. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/api.py +0 -0
  62. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/dashboard.html +0 -0
  63. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/pool.py +0 -0
  64. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/socks.py +0 -0
  65. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/status.py +0 -0
  66. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/server/upstream.py +0 -0
  67. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/site/apple-touch-icon.png +0 -0
  68. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
  69. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/site/logo.png +0 -0
  70. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/site/og.png +0 -0
  71. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/sites.py +0 -0
  72. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/sources.json +0 -0
  73. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/speed.py +0 -0
  74. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/__init__.py +0 -0
  75. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/dashboard.py +0 -0
  76. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/keys.py +0 -0
  77. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/report.py +0 -0
  78. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/serve.py +0 -0
  79. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/widgets.py +0 -0
  80. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/proxyscraper/ui/wizard.py +0 -0
  81. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/setup.cfg +0 -0
  82. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_action.py +0 -0
  83. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_agent.py +0 -0
  84. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_api.py +0 -0
  85. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_asndb.py +0 -0
  86. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_auth.py +0 -0
  87. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_blocklist.py +0 -0
  88. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_charts.py +0 -0
  89. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_checker.py +0 -0
  90. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_citation.py +0 -0
  91. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_colon_logins.py +0 -0
  92. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_compat.py +0 -0
  93. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_completion.py +0 -0
  94. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_discovery_growth.py +0 -0
  95. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_fetchcache.py +0 -0
  96. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_geodb.py +0 -0
  97. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_hf_card.py +0 -0
  98. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_hf_parquet.py +0 -0
  99. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_judges.py +0 -0
  100. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_learning.py +0 -0
  101. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_live_api.py +0 -0
  102. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_mirror.py +0 -0
  103. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_options.py +0 -0
  104. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_output_stdout.py +0 -0
  105. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_own_sources.py +0 -0
  106. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_pac.py +0 -0
  107. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_packaging.py +0 -0
  108. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_pages.py +0 -0
  109. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_parsing.py +0 -0
  110. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_parsing_fuzz.py +0 -0
  111. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_paths.py +0 -0
  112. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_pick.py +0 -0
  113. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_pipeline.py +0 -0
  114. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_preferences.py +0 -0
  115. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_proxy_pages.py +0 -0
  116. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_proxy_sources.py +0 -0
  117. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_publish.py +0 -0
  118. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_pypi_readme.py +0 -0
  119. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_recheck_stdin.py +0 -0
  120. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_report.py +0 -0
  121. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_robustness.py +0 -0
  122. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_rotator.py +0 -0
  123. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_serve_api.py +0 -0
  124. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_serve_dashboard.py +0 -0
  125. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_serve_password.py +0 -0
  126. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_serve_refill.py +0 -0
  127. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_serve_v2.py +0 -0
  128. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_server.py +0 -0
  129. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_server_closed_writer.py +0 -0
  130. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_server_fixes.py +0 -0
  131. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_sites.py +0 -0
  132. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_sources_json.py +0 -0
  133. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_speed.py +0 -0
  134. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_speed_ranking.py +0 -0
  135. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_survival_ranking.py +0 -0
  136. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_tamper.py +0 -0
  137. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_targets.py +0 -0
  138. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_ui.py +0 -0
  139. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_uptime.py +0 -0
  140. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_wizard.py +0 -0
  141. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_workflow_permissions.py +0 -0
  142. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_workflow_pins.py +0 -0
  143. {proxy_scraper_cli-1.27.0 → proxy_scraper_cli-1.28.0}/tests/test_workflow_pip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proxy-scraper-cli
3
- Version: 1.27.0
3
+ Version: 1.28.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
@@ -39,15 +39,15 @@ Requires-Dist: pytest; extra == "dev"
39
39
  Requires-Dist: hypothesis; extra == "dev"
40
40
  Requires-Dist: pyyaml; extra == "dev"
41
41
  Requires-Dist: markdown-it-py; extra == "dev"
42
- Requires-Dist: ruff==0.16.9; extra == "dev"
42
+ Requires-Dist: ruff==0.16.10; extra == "dev"
43
43
  Dynamic: license-file
44
44
 
45
45
  <div align="center">
46
46
 
47
47
  <picture>
48
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/banner-dark.svg">
49
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/banner-light.svg">
50
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/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.28.0/docs/banner-dark.svg">
49
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/banner-light.svg">
50
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
51
51
  </picture>
52
52
 
53
53
  [![tests](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml/badge.svg)](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
@@ -55,18 +55,18 @@ Dynamic: license-file
55
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)
56
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/)
57
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.27.0/pyproject.toml)
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.28.0/pyproject.toml)
59
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)
60
- [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/LICENSE)
60
+ [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/LICENSE)
61
61
 
62
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>
63
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>
64
64
  <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
65
65
  <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
66
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>
67
- <a href="https://github.com/maximilianfeix/proxy-scraper/tree/v1.27.0/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.28.0/bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
68
68
 
69
- **English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/README.zh-CN.md)
69
+ **English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.zh-CN.md) · [Español](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.es.md) · [Deutsch](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.de.md) · [Русский](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.ru.md) · [Português (Brasil)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.pt-BR.md) · [Français](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/README.fr.md)
70
70
 
71
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)
72
72
 
@@ -76,7 +76,7 @@ Dynamic: license-file
76
76
 
77
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.
78
78
 
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.27.0/docs/free-proxies-in-numbers.md)
79
+ **In numbers:** in one day it ran 3.6 million checks on free proxies – 1.1 % passed, 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.28.0/docs/free-proxies-in-numbers.md)
80
80
 
81
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).
82
82
 
@@ -91,8 +91,10 @@ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
91
91
 
92
92
  `uvx` comes with [uv](https://docs.astral.sh/uv/); `pipx run proxy-scraper-cli --pick 5` does the same.
93
93
 
94
+ **Only want proxies?** The lists, rebuilt every hour, best first: [all.txt](https://maximilianfeix.github.io/proxy-scraper/all.txt) · [http.txt](https://maximilianfeix.github.io/proxy-scraper/http.txt) · [socks4.txt](https://maximilianfeix.github.io/proxy-scraper/socks4.txt) · [socks5.txt](https://maximilianfeix.github.io/proxy-scraper/socks5.txt) · [proxies.json](https://maximilianfeix.github.io/proxy-scraper/proxies.json) · [by country](https://maximilianfeix.github.io/proxy-scraper/) · [more formats](#live-list)
95
+
94
96
  <div align="center">
95
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
97
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
96
98
  </div>
97
99
 
98
100
  > **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)
@@ -181,7 +183,7 @@ Installed, the learned state lives in your user data folder (`~/Library/Applicat
181
183
  Started without arguments, a wizard asks what you are looking for:
182
184
 
183
185
  <div align="center">
184
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/wizard.svg" alt="Setup wizard" width="760">
186
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/wizard.svg" alt="Setup wizard" width="760">
185
187
  </div>
186
188
 
187
189
  | Preset | What it does |
@@ -216,7 +218,7 @@ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and pub
216
218
 
217
219
  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`).
218
220
 
219
- <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/website.png" alt="The live list website" width="860"></a></div>
221
+ <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/website.png" alt="The live list website" width="860"></a></div>
220
222
 
221
223
  <div align="center">
222
224
 
@@ -248,6 +250,8 @@ Every protocol and country also has its own page with a plain download, e.g. [SO
248
250
  curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt | head
249
251
  ```
250
252
 
253
+ **Where they come from:** [which free proxy lists actually work](https://maximilianfeix.github.io/proxy-scraper/sources/) ranks all 700+ sources every hour – how many proxies each one lists, how many passed every check and the share. The same as data: [sources.json](https://maximilianfeix.github.io/proxy-scraper/sources.json).
254
+
251
255
  **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.
252
256
 
253
257
  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.
@@ -360,7 +364,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
360
364
  <td valign="top">
361
365
 
362
366
  **Real verification**<br>
363
- 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.27.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.
367
+ 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.28.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.
364
368
 
365
369
  </td>
366
370
  <td valign="top">
@@ -431,6 +435,8 @@ macOS, Linux and Windows, Python 3.9 to 3.14. Only two dependencies: `rich` and
431
435
  | API to fetch a proxy (proxy_pool compatible) | ❌ | ✅ [`/get`](#pool-api) |
432
436
  | Ready-made list without running anything | ✅ | ✅ [live list](#live-list) |
433
437
 
438
+ Named and dated: [how it compares to proxifly, TheSpeedX, monosans and clarketm](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/docs/comparison.md).
439
+
434
440
  <a id="examples"></a>
435
441
 
436
442
  ## Examples
@@ -545,7 +551,7 @@ proxy-scraper --recheck --serve --serve-host 0.0.0.0
545
551
  curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
546
552
  ```
547
553
 
548
- 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.27.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`.
554
+ 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.28.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`.
549
555
 
550
556
  | Option | What it does |
551
557
  |---|---|
@@ -566,7 +572,7 @@ In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In th
566
572
 
567
573
  **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.
568
574
 
569
- <div align="center"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.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>
575
+ <div align="center"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.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>
570
576
 
571
577
  <a id="pool-api"></a>
572
578
 
@@ -604,16 +610,16 @@ requests.get("https://example.com", proxies={"http": proxy, "https": proxy})
604
610
 
605
611
  ## Discord and Telegram bot
606
612
 
607
- The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.27.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.27.0/bot/README.md).
613
+ The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.28.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.28.0/bot/README.md).
608
614
 
609
615
  <a id="how-it-works"></a>
610
616
 
611
617
  ## How it works
612
618
 
613
619
  <picture>
614
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/checks-dark.svg">
615
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/checks-light.svg">
616
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.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%">
620
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/checks-dark.svg">
621
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/checks-light.svg">
622
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.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%">
617
623
  </picture>
618
624
 
619
625
 
@@ -628,7 +634,7 @@ flowchart LR
628
634
  G -. next run .-> C
629
635
  ```
630
636
 
631
- 1. **Sources** – the curated list in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.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.
637
+ 1. **Sources** – the curated list in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.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.
632
638
  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.
633
639
  3. **Prioritize** – known working proxies first, then by the learned hit rate of their sources.
634
640
  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.
@@ -640,9 +646,9 @@ flowchart LR
640
646
  <summary><b>📸 See the live dashboard and final report</b></summary>
641
647
  <br>
642
648
  <div align="center">
643
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
649
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
644
650
  <br><br>
645
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.27.0/docs/summary.svg" alt="Final report after a run" width="860">
651
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/summary.svg" alt="Final report after a run" width="860">
646
652
  </div>
647
653
  </details>
648
654
 
@@ -653,7 +659,7 @@ proxy-scraper --source https://example.com/my-list.txt --source socks5=./socks.t
653
659
  proxy-scraper --only-sources --source bought.txt --want 50 # only yours
654
660
  ```
655
661
 
656
- 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.
662
+ 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`, `--recheck https://example.com/proxies.txt` for a list on the web, or pipe the list into `--recheck -` – sources leave that form alone, since lists like `ip:port:US:elite` look the same.
657
663
 
658
664
  <a id="output"></a>
659
665
 
@@ -784,6 +790,25 @@ if __name__ == "__main__":
784
790
 
785
791
  In a Scrapy project, put `RotatingProxy` in `middlewares.py` and add it to `DOWNLOADER_MIDDLEWARES` in `settings.py`. For long crawls, reload the pool now and then – the list changes every hour.
786
792
 
793
+ **Selenium** – Chrome and Firefox can't send a proxy login, so point them at the local rotating server instead: every page load goes out through another checked proxy, and dead ones are skipped for you
794
+
795
+ ```bash
796
+ proxy-scraper --recheck live --serve --https-only # 127.0.0.1:8899, ready in about 30 s
797
+ ```
798
+
799
+ ```python
800
+ from selenium import webdriver
801
+
802
+ options = webdriver.ChromeOptions()
803
+ options.add_argument("--proxy-server=http://127.0.0.1:8899")
804
+ driver = webdriver.Chrome(options=options)
805
+ driver.get("https://api.ipify.org")
806
+ print(driver.find_element("tag name", "body").text) # a different IP on each start
807
+ driver.quit()
808
+ ```
809
+
810
+ Firefox takes the proxy as preferences: `options = webdriver.FirefoxOptions()`, then `options.set_preference("network.proxy.type", 1)`, `"network.proxy.http"` / `"network.proxy.ssl"` to `"127.0.0.1"` and `"network.proxy.http_port"` / `"network.proxy.ssl_port"` to `8899`. Keep the server without `--serve-host`, so only your own machine can use it, and start it with `--https-only` when the pages are `https://` – then only proxies that passed the HTTPS test with verified TLS serve them. One browser session keeps its connections, so for a new IP per page use `session-NAME` in the proxy login (not possible in Selenium) or restart the driver.
811
+
787
812
  **proxychains, Clash / Mihomo, sing-box** – ready-made configs with `--export`
788
813
 
789
814
  ```bash
@@ -795,6 +820,8 @@ proxychains4 -f results/latest/proxychains.conf curl https://api.ipify.org
795
820
 
796
821
  **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`.
797
822
 
823
+ **Proxifier** (Windows, macOS) sends *any* program through a proxy, even ones without proxy settings. `--export proxifier` writes `proxifier.ppx`: import it via *File → Import Profile*, and every connection goes through a redundancy chain of the best 50 proxies – Proxifier tries them in order and takes the first that answers. `localhost` stays direct. HTTP proxies are included only when they can tunnel (`CONNECT`), SOCKS4 only without a login. Needs Proxifier 4; add `--https-only` for proxies that passed the HTTPS test.
824
+
798
825
  **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:
799
826
 
800
827
  | Tool | Where | Set |
@@ -829,6 +856,8 @@ pip download requests # git, pip, npm & co. now go through the pool
829
856
 
830
857
  **In a GitHub workflow** – the action picks working proxies for the next steps
831
858
 
859
+ [Marketplace](https://github.com/marketplace/actions/proxy-scraper-free-working-proxies) · [Complete workflow, inputs and outputs](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/docs/github-action.md)
860
+
832
861
  ```yaml
833
862
  - id: proxies
834
863
  uses: maximilianfeix/proxy-scraper@v1
@@ -891,7 +920,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
891
920
  | `--no-blocklisted` | skip proxies whose exit IP is on the SpamCop blocklist – those often get captchas |
892
921
  | `--no-dnsbl` | skip the blocklist lookup |
893
922
  | `--target URL` | only proxies that reach this site (repeatable) |
894
- | `--recheck [FILE\|-\|live]` | only check proxies from a file, stdin (`-`), the last run, or the public live list |
923
+ | `--recheck [FILE\|URL\|-\|live]` | only check proxies from a file, a URL, stdin (`-`), the last run, or the public live list |
895
924
  | `--fast` | skip the HTTPS test (confirmation and anonymity still run) |
896
925
  | `--no-geo` | skip the country lookup |
897
926
  | `-c`, `--concurrency N` | simultaneous checks (default: 2000) |
@@ -906,7 +935,7 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
906
935
  | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
907
936
  | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
908
937
  | `-o FILE` | also write all hits to this file; `-o -` prints them to stdout |
909
- | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl`, `pac` or `all` |
938
+ | `--export FORMATS` | extra files for other tools: `proxychains`, `clash`, `singbox`, `curl`, `pac`, `proxifier` or `all` |
910
939
  | `-V`, `--version` | print the version |
911
940
  | `--completion SHELL` | print the tab completion script for bash, zsh, fish or PowerShell |
912
941
 
@@ -1029,7 +1058,7 @@ Shipped in [v1.5](https://github.com/maximilianfeix/proxy-scraper/milestone/5):
1029
1058
 
1030
1059
  ## Contributing
1031
1060
 
1032
- Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
1061
+ Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
1033
1062
 
1034
1063
  ```bash
1035
1064
  pip install -e ".[dev]"
@@ -1062,12 +1091,13 @@ proxyscraper/
1062
1091
  ├── geodb.py DB-IP country database (monthly, binary search)
1063
1092
  ├── targets.py target sites for --target
1064
1093
  ├── output.py result files
1065
- ├── exporters.py proxychains, Clash, sing-box, curl and PAC formats (--export)
1094
+ ├── exporters.py proxychains, Clash, sing-box, curl, PAC and Proxifier formats (--export)
1066
1095
  ├── server/ rotating proxy server (--serve): pool · http · upstream · socks · status · api · core
1067
1096
  ├── api.py find_proxies() / check_proxies() for Python
1068
1097
  ├── agent.py MCP tools without the SDK: live list, filters, fetch through proxies
1069
1098
  ├── mcp_server.py MCP server (proxy-scraper-mcp) for AI agents
1070
1099
  ├── publish.py live list for GitHub Actions
1100
+ ├── sourcepages.py the ranking of the sources on the website
1071
1101
  ├── mirror.py the same lists in their own repo (free-proxy-list)
1072
1102
  ├── paths.py where state and results are stored
1073
1103
  ├── compat.py differences between Unix and Windows
@@ -1091,6 +1121,8 @@ Thanks to everyone who helped build it – new sources, countries, Python 3.14,
1091
1121
 
1092
1122
  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.
1093
1123
 
1124
+ From the same author: [dejabuilt](https://github.com/maximilianfeix/dejabuilt), an agent skill that checks GitHub before you build – it tells you whether a project idea already exists, with the numbers.
1125
+
1094
1126
  <a href="https://star-history.com/#maximilianfeix/proxy-scraper&Date">
1095
1127
  <picture>
1096
1128
  <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date&theme=dark">
@@ -1103,7 +1135,7 @@ Want to join? [Beginner-friendly issues](https://github.com/maximilianfeix/proxy
1103
1135
 
1104
1136
  ## Acknowledgements
1105
1137
 
1106
- 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.27.0/proxyscraper/sources.json), and especially to
1138
+ 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.28.0/proxyscraper/sources.json), and especially to
1107
1139
 
1108
1140
  - [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
1109
1141
  - [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
@@ -1118,7 +1150,7 @@ This tool only collects publicly listed proxies and checks whether they work. Yo
1118
1150
 
1119
1151
  ---
1120
1152
 
1121
- <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.27.0/CONTRIBUTING.md">Contributing</a></sub>
1153
+ <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.28.0/CONTRIBUTING.md">Contributing</a></sub>
1122
1154
 
1123
1155
  <sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
1124
1156