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.
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/PKG-INFO +30 -29
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/README.md +29 -28
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/PKG-INFO +30 -29
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/SOURCES.txt +1 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/__init__.py +1 -1
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/app.py +17 -2
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/cli.py +8 -1
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/options.py +3 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_discovery_growth.py +1 -1
- proxy_scraper_cli-1.29.0/tests/test_serve_open.py +72 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_workflow_pip.py +5 -2
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/LICENSE +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/requires.txt +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/__main__.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/action.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/agent.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/api.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/asndb.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/blocklist.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/charts.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/checker.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/compat.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/completion.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/exporters.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/fetchcache.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/geo.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/geodb.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/handshake.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/history.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/judges.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mcp_entry.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mcp_server.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/mirror.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/netio.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/output.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/pages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/parsing.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/paths.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/pipeline.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/preferences.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/proxypages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/publish.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ranking.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/report.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/runsteps.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/__init__.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/api.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/core.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/dashboard.html +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/http.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/pool.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/socks.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/status.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/server/upstream.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/apple-touch-icon.png +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/index.html +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/logo.png +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/site/og.png +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sites.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sourcepages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sources.json +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/sources.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/speed.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/targets.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/__init__.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/dashboard.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/keys.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/report.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/serve.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/widgets.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/proxyscraper/ui/wizard.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/pyproject.toml +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/setup.cfg +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_action.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_agent.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_api.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_app.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_asndb.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_auth.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_bad_hosts_and_host_header.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_blocklist.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_charts.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_checker.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_citation.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_colon_logins.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_compat.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_completion.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_exporters.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_fetchcache.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_geodb.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_hf_card.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_hf_parquet.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_judges.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_learning.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_live_api.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mcp_server.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mine_sources.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_mirror.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_options.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_output_stdout.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_own_sources.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pac.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_packaging.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_parsing.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_parsing_fuzz.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_paths.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pick.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pipeline.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_preferences.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_proxy_pages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_proxy_sources.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_publish.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_pypi_readme.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_readme_translations.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_recheck_stdin.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_report.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_robustness.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_rotator.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_api.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_dashboard.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_password.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_refill.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_serve_v2.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server_closed_writer.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_server_fixes.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_sites.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_source_pages.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_sources_json.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_speed.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_speed_ranking.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_survival_ranking.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_tamper.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_targets.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_ui.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_uptime.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_wizard.py +0 -0
- {proxy_scraper_cli-1.28.0 → proxy_scraper_cli-1.29.0}/tests/test_workflow_permissions.py +0 -0
- {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.
|
|
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.
|
|
49
|
-
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
50
|
-
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
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
|
[](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
|
|
@@ -55,18 +55,18 @@ Dynamic: license-file
|
|
|
55
55
|
[](#live-list)
|
|
56
56
|
[](https://pypi.org/project/proxy-scraper-cli/)
|
|
57
57
|
[](https://pepy.tech/projects/proxy-scraper-cli)
|
|
58
|
-
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.
|
|
58
|
+
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/pyproject.toml)
|
|
59
59
|
[](https://github.com/maximilianfeix/proxy-scraper/stargazers)
|
|
60
|
-
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.
|
|
60
|
+
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
621
|
-
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
622
|
-
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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`;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
5
|
-
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
6
|
-
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
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
|
[](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
|
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
[](#live-list)
|
|
12
12
|
[](https://pypi.org/project/proxy-scraper-cli/)
|
|
13
13
|
[](https://pepy.tech/projects/proxy-scraper-cli)
|
|
14
|
-
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.
|
|
14
|
+
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.29.0/pyproject.toml)
|
|
15
15
|
[](https://github.com/maximilianfeix/proxy-scraper/stargazers)
|
|
16
|
-
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.
|
|
16
|
+
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
577
|
-
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
578
|
-
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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`;
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|