proxy-scraper-cli 1.28.0__tar.gz → 1.29.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 (144) hide show
  1. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/PKG-INFO +30 -29
  2. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/README.md +29 -28
  3. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/PKG-INFO +30 -29
  4. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/SOURCES.txt +1 -0
  5. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/__init__.py +1 -1
  6. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/app.py +17 -2
  7. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/cli.py +8 -1
  8. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/options.py +3 -0
  9. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_discovery_growth.py +1 -1
  10. proxy_scraper_cli-1.29.0/tests/test_serve_open.py +72 -0
  11. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_workflow_pip.py +5 -2
  12. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/LICENSE +0 -0
  13. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
  14. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
  15. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/requires.txt +0 -0
  16. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
  17. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/__main__.py +0 -0
  18. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/action.py +0 -0
  19. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/agent.py +0 -0
  20. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/api.py +0 -0
  21. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/asndb.py +0 -0
  22. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/blocklist.py +0 -0
  23. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/charts.py +0 -0
  24. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/checker.py +0 -0
  25. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/compat.py +0 -0
  26. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/completion.py +0 -0
  27. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/exporters.py +0 -0
  28. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/fetchcache.py +0 -0
  29. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/geo.py +0 -0
  30. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/geodb.py +0 -0
  31. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/handshake.py +0 -0
  32. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/history.py +0 -0
  33. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/judges.py +0 -0
  34. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mcp_entry.py +0 -0
  35. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mcp_server.py +0 -0
  36. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mirror.py +0 -0
  37. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/netio.py +0 -0
  38. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/output.py +0 -0
  39. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/pages.py +0 -0
  40. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/parsing.py +0 -0
  41. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/paths.py +0 -0
  42. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/pipeline.py +0 -0
  43. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/preferences.py +0 -0
  44. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/proxypages.py +0 -0
  45. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/publish.py +0 -0
  46. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ranking.py +0 -0
  47. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/report.py +0 -0
  48. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/runsteps.py +0 -0
  49. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/__init__.py +0 -0
  50. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/api.py +0 -0
  51. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/core.py +0 -0
  52. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/dashboard.html +0 -0
  53. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/http.py +0 -0
  54. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/pool.py +0 -0
  55. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/socks.py +0 -0
  56. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/status.py +0 -0
  57. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/upstream.py +0 -0
  58. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/apple-touch-icon.png +0 -0
  59. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
  60. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/index.html +0 -0
  61. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/logo.png +0 -0
  62. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/og.png +0 -0
  63. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sites.py +0 -0
  64. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sourcepages.py +0 -0
  65. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sources.json +0 -0
  66. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sources.py +0 -0
  67. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/speed.py +0 -0
  68. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/targets.py +0 -0
  69. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/__init__.py +0 -0
  70. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/dashboard.py +0 -0
  71. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/keys.py +0 -0
  72. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/report.py +0 -0
  73. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/serve.py +0 -0
  74. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/widgets.py +0 -0
  75. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/wizard.py +0 -0
  76. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/pyproject.toml +0 -0
  77. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/setup.cfg +0 -0
  78. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_action.py +0 -0
  79. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_agent.py +0 -0
  80. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_api.py +0 -0
  81. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_app.py +0 -0
  82. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_asndb.py +0 -0
  83. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_auth.py +0 -0
  84. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_bad_hosts_and_host_header.py +0 -0
  85. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_blocklist.py +0 -0
  86. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_charts.py +0 -0
  87. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_checker.py +0 -0
  88. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_citation.py +0 -0
  89. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_colon_logins.py +0 -0
  90. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_compat.py +0 -0
  91. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_completion.py +0 -0
  92. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_exporters.py +0 -0
  93. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_fetchcache.py +0 -0
  94. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_geodb.py +0 -0
  95. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_hf_card.py +0 -0
  96. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_hf_parquet.py +0 -0
  97. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_judges.py +0 -0
  98. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_learning.py +0 -0
  99. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_live_api.py +0 -0
  100. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mcp_server.py +0 -0
  101. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mine_sources.py +0 -0
  102. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mirror.py +0 -0
  103. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_options.py +0 -0
  104. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_output_stdout.py +0 -0
  105. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_own_sources.py +0 -0
  106. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pac.py +0 -0
  107. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_packaging.py +0 -0
  108. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pages.py +0 -0
  109. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_parsing.py +0 -0
  110. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_parsing_fuzz.py +0 -0
  111. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_paths.py +0 -0
  112. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pick.py +0 -0
  113. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pipeline.py +0 -0
  114. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_preferences.py +0 -0
  115. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_proxy_pages.py +0 -0
  116. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_proxy_sources.py +0 -0
  117. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_publish.py +0 -0
  118. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pypi_readme.py +0 -0
  119. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_readme_translations.py +0 -0
  120. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_recheck_stdin.py +0 -0
  121. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_report.py +0 -0
  122. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_robustness.py +0 -0
  123. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_rotator.py +0 -0
  124. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_api.py +0 -0
  125. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_dashboard.py +0 -0
  126. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_password.py +0 -0
  127. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_refill.py +0 -0
  128. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_v2.py +0 -0
  129. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server.py +0 -0
  130. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server_closed_writer.py +0 -0
  131. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server_fixes.py +0 -0
  132. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_sites.py +0 -0
  133. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_source_pages.py +0 -0
  134. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_sources_json.py +0 -0
  135. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_speed.py +0 -0
  136. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_speed_ranking.py +0 -0
  137. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_survival_ranking.py +0 -0
  138. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_tamper.py +0 -0
  139. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_targets.py +0 -0
  140. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_ui.py +0 -0
  141. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_uptime.py +0 -0
  142. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_wizard.py +0 -0
  143. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_workflow_permissions.py +0 -0
  144. {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_workflow_pins.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proxy-scraper-cli
3
- Version: 1.28.0
3
+ Version: 1.29.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
@@ -45,9 +45,9 @@ Dynamic: license-file
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.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%">
48
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/banner-dark.svg">
49
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/banner-light.svg">
50
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.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.28.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.29.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.28.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.29.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.28.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.29.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.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)
69
+ **English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.zh-CN.md) · [Español](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.es.md) · [Deutsch](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.de.md) · [Русский](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.ru.md) · [Português (Brasil)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.pt-BR.md) · [Français](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.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 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)
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.29.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
 
@@ -94,7 +94,7 @@ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
94
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
95
 
96
96
  <div align="center">
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">
97
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
98
98
  </div>
99
99
 
100
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)
@@ -166,7 +166,7 @@ pip install -r requirements.txt
166
166
  python3 proxy_scraper.py
167
167
  ```
168
168
 
169
- Every [release](https://github.com/maximilianfeix/proxy-scraper/releases/latest) also ships a wheel you can install with `pip install <file>.whl`, and a multi-arch image (amd64/arm64) on `ghcr.io`. In the container the wizard never shows up, it runs straight away. For the proxy server use `--serve --serve-host 0.0.0.0` with `-p 127.0.0.1:8899:8899`, so the port is only open on your own machine.
169
+ Every [release](https://github.com/maximilianfeix/proxy-scraper/releases/latest) also ships a wheel you can install with `pip install <file>.whl`, and a multi-arch image (amd64/arm64) on `ghcr.io`. In the container the wizard never shows up, it runs straight away. For the proxy server use `--serve --serve-host 0.0.0.0 --serve-open` with `-p 127.0.0.1:8899:8899`, so the port is only open on your own machine – or set `-e PROXY_SCRAPER_SERVE_PASSWORD=…` instead of `--serve-open`.
170
170
 
171
171
  Tab completion for bash, zsh, fish and PowerShell:
172
172
 
@@ -183,7 +183,7 @@ Installed, the learned state lives in your user data folder (`~/Library/Applicat
183
183
  Started without arguments, a wizard asks what you are looking for:
184
184
 
185
185
  <div align="center">
186
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/wizard.svg" alt="Setup wizard" width="760">
186
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/wizard.svg" alt="Setup wizard" width="760">
187
187
  </div>
188
188
 
189
189
  | Preset | What it does |
@@ -218,7 +218,7 @@ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and pub
218
218
 
219
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`).
220
220
 
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>
221
+ <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/website.png" alt="The live list website" width="860"></a></div>
222
222
 
223
223
  <div align="center">
224
224
 
@@ -364,7 +364,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
364
364
  <td valign="top">
365
365
 
366
366
  **Real verification**<br>
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.
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.29.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.
368
368
 
369
369
  </td>
370
370
  <td valign="top">
@@ -435,7 +435,7 @@ macOS, Linux and Windows, Python 3.9 to 3.14. Only two dependencies: `rich` and
435
435
  | API to fetch a proxy (proxy_pool compatible) | ❌ | ✅ [`/get`](#pool-api) |
436
436
  | Ready-made list without running anything | ✅ | ✅ [live list](#live-list) |
437
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).
438
+ Named and dated: [how it compares to proxifly, TheSpeedX, monosans and clarketm](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/docs/comparison.md).
439
439
 
440
440
  <a id="examples"></a>
441
441
 
@@ -551,7 +551,7 @@ proxy-scraper --recheck --serve --serve-host 0.0.0.0
551
551
  curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
552
552
  ```
553
553
 
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`.
554
+ Without a password the server refuses to start on any address but `127.0.0.1`: that would be an open proxy for **anyone who reaches the port** (Docker publishes ports past host firewalls like ufw). If a firewall or `-p 127.0.0.1:…` already keeps others out, say so with `--serve-open`. The ready-made [`compose.yaml`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.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`.
555
555
 
556
556
  | Option | What it does |
557
557
  |---|---|
@@ -572,7 +572,7 @@ In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In th
572
572
 
573
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.
574
574
 
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>
575
+ <div align="center"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.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>
576
576
 
577
577
  <a id="pool-api"></a>
578
578
 
@@ -610,16 +610,16 @@ requests.get("https://example.com", proxies={"http": proxy, "https": proxy})
610
610
 
611
611
  ## Discord and Telegram bot
612
612
 
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).
613
+ The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.29.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.29.0/bot/README.md).
614
614
 
615
615
  <a id="how-it-works"></a>
616
616
 
617
617
  ## How it works
618
618
 
619
619
  <picture>
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%">
620
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/checks-dark.svg">
621
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/checks-light.svg">
622
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.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%">
623
623
  </picture>
624
624
 
625
625
 
@@ -634,7 +634,7 @@ flowchart LR
634
634
  G -. next run .-> C
635
635
  ```
636
636
 
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.
637
+ 1. **Sources** – the curated list in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.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.
638
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.
639
639
  3. **Prioritize** – known working proxies first, then by the learned hit rate of their sources.
640
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.
@@ -646,9 +646,9 @@ flowchart LR
646
646
  <summary><b>📸 See the live dashboard and final report</b></summary>
647
647
  <br>
648
648
  <div align="center">
649
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
649
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
650
650
  <br><br>
651
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/summary.svg" alt="Final report after a run" width="860">
651
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/summary.svg" alt="Final report after a run" width="860">
652
652
  </div>
653
653
  </details>
654
654
 
@@ -856,7 +856,7 @@ pip download requests # git, pip, npm & co. now go through the pool
856
856
 
857
857
  **In a GitHub workflow** – the action picks working proxies for the next steps
858
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)
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.29.0/docs/github-action.md)
860
860
 
861
861
  ```yaml
862
862
  - id: proxies
@@ -929,8 +929,9 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
929
929
  | `--no-cache` | download every list again (unchanged ones are normally skipped via ETag) |
930
930
  | `--list-sources [N]` | show the source ranking (add `--json` for scripts: url, status, hit rate, checks, last change) |
931
931
  | `--pick [N]` | print N proxies (default 1) from the hourly checked list and exit – no scan, same filters, plus `--min-uptime PERCENT`, `--min-speed KBPS` and `--works-on google,reddit,…` |
932
- | `--serve-host ADDR` | where the proxy server listens (default `127.0.0.1`; `0.0.0.0` for Docker, with a warning) |
932
+ | `--serve-host ADDR` | where the proxy server listens (default `127.0.0.1`; any other address needs a password or `--serve-open`) |
933
933
  | `--serve-password SECRET` | clients must send this password in the proxy login; better set `PROXY_SCRAPER_SERVE_PASSWORD` |
934
+ | `--serve-open` | allow `--serve-host` without a password – only behind a firewall or with `docker -p 127.0.0.1:…` |
934
935
  | `--rotate STRATEGY` · `--sticky SEC` | how the proxy server picks proxies, see [above](#proxy-server) |
935
936
  | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
936
937
  | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
@@ -1058,7 +1059,7 @@ Shipped in [v1.5](https://github.com/maximilianfeix/proxy-scraper/milestone/5):
1058
1059
 
1059
1060
  ## Contributing
1060
1061
 
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:
1062
+ Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
1062
1063
 
1063
1064
  ```bash
1064
1065
  pip install -e ".[dev]"
@@ -1135,7 +1136,7 @@ From the same author: [dejabuilt](https://github.com/maximilianfeix/dejabuilt),
1135
1136
 
1136
1137
  ## Acknowledgements
1137
1138
 
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
1139
+ 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.29.0/proxyscraper/sources.json), and especially to
1139
1140
 
1140
1141
  - [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
1141
1142
  - [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
@@ -1150,7 +1151,7 @@ This tool only collects publicly listed proxies and checks whether they work. Yo
1150
1151
 
1151
1152
  ---
1152
1153
 
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>
1154
+ <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CONTRIBUTING.md">Contributing</a></sub>
1154
1155
 
1155
1156
  <sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
1156
1157
 
@@ -1,9 +1,9 @@
1
1
  <div align="center">
2
2
 
3
3
  <picture>
4
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/banner-dark.svg">
5
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/banner-light.svg">
6
- <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%">
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/banner-dark.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/banner-light.svg">
6
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
7
7
  </picture>
8
8
 
9
9
  [![tests](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml/badge.svg)](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
@@ -11,18 +11,18 @@
11
11
  [![Live proxies](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmaximilianfeix%2Fproxy-scraper%2Fproxy-list%2Fbadges%2Ftotal.json&style=flat-square&labelColor=121113)](#live-list)
12
12
  [![PyPI](https://img.shields.io/pypi/v/proxy-scraper-cli?style=flat-square&color=D4F77A&labelColor=121113&label=pypi)](https://pypi.org/project/proxy-scraper-cli/)
13
13
  [![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)
14
- [![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)
14
+ [![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.29.0/pyproject.toml)
15
15
  [![Stars](https://img.shields.io/github/stars/maximilianfeix/proxy-scraper?style=flat-square&color=D4F77A&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/stargazers)
16
- [![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)
16
+ [![License](https://img.shields.io/badge/license-MIT-D4F77A?style=flat-square&labelColor=121113)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/LICENSE)
17
17
 
18
18
  <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>
19
19
  <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>
20
20
  <a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
21
21
  <a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
22
22
  <a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
23
- <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>
23
+ <a href="https://github.com/maximilianfeix/proxy-scraper/tree/v1.29.0/bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
24
24
 
25
- **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)
25
+ **English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.zh-CN.md) · [Español](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.es.md) · [Deutsch](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.de.md) · [Русский](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.ru.md) · [Português (Brasil)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.pt-BR.md) · [Français](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/README.fr.md)
26
26
 
27
27
  [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)
28
28
 
@@ -32,7 +32,7 @@
32
32
 
33
33
  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.
34
34
 
35
- **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)
35
+ **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.29.0/docs/free-proxies-in-numbers.md)
36
36
 
37
37
  **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).
38
38
 
@@ -50,7 +50,7 @@ curl -s https://maximilianfeix.github.io/proxy-scraper/socks5.txt | head
50
50
  **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)
51
51
 
52
52
  <div align="center">
53
- <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">
53
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/demo.svg" alt="Animated demo: the live dashboard during a check, the report, the setup wizard and collecting" width="880">
54
54
  </div>
55
55
 
56
56
  > **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)
@@ -122,7 +122,7 @@ pip install -r requirements.txt
122
122
  python3 proxy_scraper.py
123
123
  ```
124
124
 
125
- Every [release](https://github.com/maximilianfeix/proxy-scraper/releases/latest) also ships a wheel you can install with `pip install <file>.whl`, and a multi-arch image (amd64/arm64) on `ghcr.io`. In the container the wizard never shows up, it runs straight away. For the proxy server use `--serve --serve-host 0.0.0.0` with `-p 127.0.0.1:8899:8899`, so the port is only open on your own machine.
125
+ Every [release](https://github.com/maximilianfeix/proxy-scraper/releases/latest) also ships a wheel you can install with `pip install <file>.whl`, and a multi-arch image (amd64/arm64) on `ghcr.io`. In the container the wizard never shows up, it runs straight away. For the proxy server use `--serve --serve-host 0.0.0.0 --serve-open` with `-p 127.0.0.1:8899:8899`, so the port is only open on your own machine – or set `-e PROXY_SCRAPER_SERVE_PASSWORD=…` instead of `--serve-open`.
126
126
 
127
127
  Tab completion for bash, zsh, fish and PowerShell:
128
128
 
@@ -139,7 +139,7 @@ Installed, the learned state lives in your user data folder (`~/Library/Applicat
139
139
  Started without arguments, a wizard asks what you are looking for:
140
140
 
141
141
  <div align="center">
142
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/wizard.svg" alt="Setup wizard" width="760">
142
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/wizard.svg" alt="Setup wizard" width="760">
143
143
  </div>
144
144
 
145
145
  | Preset | What it does |
@@ -174,7 +174,7 @@ Don't want to scan yourself? Every hour **GitHub Actions** runs the tool and pub
174
174
 
175
175
  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`).
176
176
 
177
- <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>
177
+ <div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/website.png" alt="The live list website" width="860"></a></div>
178
178
 
179
179
  <div align="center">
180
180
 
@@ -320,7 +320,7 @@ Started without arguments, the tool asks what you need using the arrow keys –
320
320
  <td valign="top">
321
321
 
322
322
  **Real verification**<br>
323
- 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.
323
+ 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.29.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.
324
324
 
325
325
  </td>
326
326
  <td valign="top">
@@ -391,7 +391,7 @@ macOS, Linux and Windows, Python 3.9 to 3.14. Only two dependencies: `rich` and
391
391
  | API to fetch a proxy (proxy_pool compatible) | ❌ | ✅ [`/get`](#pool-api) |
392
392
  | Ready-made list without running anything | ✅ | ✅ [live list](#live-list) |
393
393
 
394
- 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).
394
+ Named and dated: [how it compares to proxifly, TheSpeedX, monosans and clarketm](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/docs/comparison.md).
395
395
 
396
396
  <a id="examples"></a>
397
397
 
@@ -507,7 +507,7 @@ proxy-scraper --recheck --serve --serve-host 0.0.0.0
507
507
  curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
508
508
  ```
509
509
 
510
- 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`.
510
+ Without a password the server refuses to start on any address but `127.0.0.1`: that would be an open proxy for **anyone who reaches the port** (Docker publishes ports past host firewalls like ufw). If a firewall or `-p 127.0.0.1:…` already keeps others out, say so with `--serve-open`. The ready-made [`compose.yaml`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.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`.
511
511
 
512
512
  | Option | What it does |
513
513
  |---|---|
@@ -528,7 +528,7 @@ In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In th
528
528
 
529
529
  **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.
530
530
 
531
- <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>
531
+ <div align="center"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.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>
532
532
 
533
533
  <a id="pool-api"></a>
534
534
 
@@ -566,16 +566,16 @@ requests.get("https://example.com", proxies={"http": proxy, "https": proxy})
566
566
 
567
567
  ## Discord and Telegram bot
568
568
 
569
- 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).
569
+ The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.29.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.29.0/bot/README.md).
570
570
 
571
571
  <a id="how-it-works"></a>
572
572
 
573
573
  ## How it works
574
574
 
575
575
  <picture>
576
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/checks-dark.svg">
577
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/checks-light.svg">
578
- <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%">
576
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/checks-dark.svg">
577
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/checks-light.svg">
578
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.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%">
579
579
  </picture>
580
580
 
581
581
 
@@ -590,7 +590,7 @@ flowchart LR
590
590
  G -. next run .-> C
591
591
  ```
592
592
 
593
- 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.
593
+ 1. **Sources** – the curated list in [`sources.json`](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.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.
594
594
  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.
595
595
  3. **Prioritize** – known working proxies first, then by the learned hit rate of their sources.
596
596
  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.
@@ -602,9 +602,9 @@ flowchart LR
602
602
  <summary><b>📸 See the live dashboard and final report</b></summary>
603
603
  <br>
604
604
  <div align="center">
605
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
605
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/dashboard.svg" alt="Live dashboard while checking" width="860">
606
606
  <br><br>
607
- <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.28.0/docs/summary.svg" alt="Final report after a run" width="860">
607
+ <img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.29.0/docs/summary.svg" alt="Final report after a run" width="860">
608
608
  </div>
609
609
  </details>
610
610
 
@@ -812,7 +812,7 @@ pip download requests # git, pip, npm & co. now go through the pool
812
812
 
813
813
  **In a GitHub workflow** – the action picks working proxies for the next steps
814
814
 
815
- [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)
815
+ [Marketplace](https://github.com/marketplace/actions/proxy-scraper-free-working-proxies) · [Complete workflow, inputs and outputs](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/docs/github-action.md)
816
816
 
817
817
  ```yaml
818
818
  - id: proxies
@@ -885,8 +885,9 @@ curl.exe -x (Get-Content "$run\all.txt" -TotalCount 1) http://api.ipify.org
885
885
  | `--no-cache` | download every list again (unchanged ones are normally skipped via ETag) |
886
886
  | `--list-sources [N]` | show the source ranking (add `--json` for scripts: url, status, hit rate, checks, last change) |
887
887
  | `--pick [N]` | print N proxies (default 1) from the hourly checked list and exit – no scan, same filters, plus `--min-uptime PERCENT`, `--min-speed KBPS` and `--works-on google,reddit,…` |
888
- | `--serve-host ADDR` | where the proxy server listens (default `127.0.0.1`; `0.0.0.0` for Docker, with a warning) |
888
+ | `--serve-host ADDR` | where the proxy server listens (default `127.0.0.1`; any other address needs a password or `--serve-open`) |
889
889
  | `--serve-password SECRET` | clients must send this password in the proxy login; better set `PROXY_SCRAPER_SERVE_PASSWORD` |
890
+ | `--serve-open` | allow `--serve-host` without a password – only behind a firewall or with `docker -p 127.0.0.1:…` |
890
891
  | `--rotate STRATEGY` · `--sticky SEC` | how the proxy server picks proxies, see [above](#proxy-server) |
891
892
  | `--serve-refill HOURS` | while serving, check fresh proxies every HOURS and add the hits to the pool |
892
893
  | `--serve [PORT]` | afterwards serve as a rotating proxy on `127.0.0.1:PORT` (default: 8899) |
@@ -1014,7 +1015,7 @@ Shipped in [v1.5](https://github.com/maximilianfeix/proxy-scraper/milestone/5):
1014
1015
 
1015
1016
  ## Contributing
1016
1017
 
1017
- 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:
1018
+ Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
1018
1019
 
1019
1020
  ```bash
1020
1021
  pip install -e ".[dev]"
@@ -1091,7 +1092,7 @@ From the same author: [dejabuilt](https://github.com/maximilianfeix/dejabuilt),
1091
1092
 
1092
1093
  ## Acknowledgements
1093
1094
 
1094
- 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
1095
+ 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.29.0/proxyscraper/sources.json), and especially to
1095
1096
 
1096
1097
  - [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
1097
1098
  - [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
@@ -1106,7 +1107,7 @@ This tool only collects publicly listed proxies and checks whether they work. Yo
1106
1107
 
1107
1108
  ---
1108
1109
 
1109
- <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>
1110
+ <sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/CONTRIBUTING.md">Contributing</a></sub>
1110
1111
 
1111
1112
  <sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
1112
1113