proxy-scraper-cli 1.29.0__tar.gz → 1.31.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.31.0/PKG-INFO +510 -0
- proxy_scraper_cli-1.31.0/README.md +456 -0
- proxy_scraper_cli-1.31.0/proxy_scraper_cli.egg-info/PKG-INFO +510 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxy_scraper_cli.egg-info/SOURCES.txt +14 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxy_scraper_cli.egg-info/requires.txt +1 -1
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/__init__.py +1 -1
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/agent.py +43 -6
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/api.py +74 -14
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/app.py +52 -8
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/asndb.py +2 -5
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/blocklist.py +22 -3
- proxy_scraper_cli-1.31.0/proxyscraper/checker.py +821 -0
- proxy_scraper_cli-1.31.0/proxyscraper/checkstate.py +153 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/cli.py +169 -17
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/fetchcache.py +2 -5
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/geo.py +13 -3
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/geodb.py +2 -5
- proxy_scraper_cli-1.31.0/proxyscraper/httpframing.py +104 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/judges.py +47 -17
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/mcp_server.py +17 -6
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/mirror.py +16 -13
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/netio.py +63 -9
- proxy_scraper_cli-1.31.0/proxyscraper/netpolicy.py +180 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/output.py +19 -1
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/pages.py +8 -8
- proxy_scraper_cli-1.31.0/proxyscraper/paths.py +108 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/pipeline.py +56 -13
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/publish.py +57 -8
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/report.py +30 -25
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/__init__.py +12 -1
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/core.py +153 -61
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/http.py +40 -2
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/site/index.html +53 -54
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/sourcepages.py +7 -7
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/sources.py +25 -11
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/dashboard.py +7 -5
- proxy_scraper_cli-1.31.0/proxyscraper/verify.py +353 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/pyproject.toml +12 -2
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_agent.py +1 -1
- proxy_scraper_cli-1.31.0/tests/test_atomic_writes.py +128 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_blocklist.py +104 -0
- proxy_scraper_cli-1.31.0/tests/test_check_states.py +519 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_checker.py +4 -2
- proxy_scraper_cli-1.31.0/tests/test_doc_links.py +67 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_hf_parquet.py +27 -1
- proxy_scraper_cli-1.31.0/tests/test_http_framing.py +129 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_judges.py +110 -2
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_learning.py +1 -1
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_mine_sources.py +6 -5
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_pipeline.py +110 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_publish.py +58 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_report.py +2 -2
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_rotator.py +80 -0
- proxy_scraper_cli-1.31.0/tests/test_safe_fetch.py +283 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_server.py +29 -2
- proxy_scraper_cli-1.31.0/tests/test_server_limits.py +272 -0
- proxy_scraper_cli-1.31.0/tests/test_server_replay.py +162 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_sites.py +4 -4
- proxy_scraper_cli-1.31.0/tests/test_untrusted_sources.py +52 -0
- proxy_scraper_cli-1.31.0/tests/test_verify.py +415 -0
- proxy_scraper_cli-1.31.0/tests/test_workflow_ci.py +145 -0
- proxy_scraper_cli-1.29.0/PKG-INFO +0 -1158
- proxy_scraper_cli-1.29.0/README.md +0 -1114
- proxy_scraper_cli-1.29.0/proxy_scraper_cli.egg-info/PKG-INFO +0 -1158
- proxy_scraper_cli-1.29.0/proxyscraper/checker.py +0 -520
- proxy_scraper_cli-1.29.0/proxyscraper/paths.py +0 -55
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/LICENSE +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxy_scraper_cli.egg-info/dependency_links.txt +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxy_scraper_cli.egg-info/entry_points.txt +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxy_scraper_cli.egg-info/top_level.txt +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/__main__.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/action.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/charts.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/compat.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/completion.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/exporters.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/handshake.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/history.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/mcp_entry.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/options.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/parsing.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/preferences.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/proxypages.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ranking.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/runsteps.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/api.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/dashboard.html +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/pool.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/socks.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/status.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/server/upstream.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/site/apple-touch-icon.png +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/site/googleaac1161b7853c5b5.html +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/site/logo.png +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/site/og.png +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/sites.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/sources.json +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/speed.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/targets.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/__init__.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/keys.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/report.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/serve.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/widgets.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/proxyscraper/ui/wizard.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/setup.cfg +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_action.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_api.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_app.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_asndb.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_auth.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_bad_hosts_and_host_header.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_charts.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_citation.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_colon_logins.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_compat.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_completion.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_discovery_growth.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_exporters.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_fetchcache.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_geodb.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_hf_card.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_live_api.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_mcp_server.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_mirror.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_options.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_output_stdout.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_own_sources.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_pac.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_packaging.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_pages.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_parsing.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_parsing_fuzz.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_paths.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_pick.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_preferences.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_proxy_pages.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_proxy_sources.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_pypi_readme.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_readme_translations.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_recheck_stdin.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_robustness.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_api.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_dashboard.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_open.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_password.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_refill.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_serve_v2.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_server_closed_writer.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_server_fixes.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_source_pages.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_sources_json.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_speed.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_speed_ranking.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_survival_ranking.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_tamper.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_targets.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_ui.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_uptime.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_wizard.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_workflow_permissions.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_workflow_pins.py +0 -0
- {proxy_scraper_cli-1.29.0 → proxy_scraper_cli-1.31.0}/tests/test_workflow_pip.py +0 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: proxy-scraper-cli
|
|
3
|
+
Version: 1.31.0
|
|
4
|
+
Summary: Finds and checks free HTTP, SOCKS4 and SOCKS5 proxies and shows what each check found: passed, failed or not run, and when. With a rotating local proxy server.
|
|
5
|
+
Author: Maximilian Feix
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/maximilianfeix/proxy-scraper
|
|
8
|
+
Project-URL: Documentation, https://maximilianfeix.github.io/proxy-scraper/
|
|
9
|
+
Project-URL: Source, https://github.com/maximilianfeix/proxy-scraper
|
|
10
|
+
Project-URL: Issues, https://github.com/maximilianfeix/proxy-scraper/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/maximilianfeix/proxy-scraper/releases
|
|
12
|
+
Project-URL: Live proxy list, https://github.com/maximilianfeix/proxy-scraper/tree/proxy-list
|
|
13
|
+
Keywords: proxy,proxy-list,proxy-checker,proxy-scraper,socks5,socks4,http-proxy,rotating-proxy,asyncio,mcp,mcp-server,ai-agents
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Framework :: AsyncIO
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: Intended Audience :: Information Technology
|
|
19
|
+
Classifier: Intended Audience :: System Administrators
|
|
20
|
+
Classifier: Operating System :: MacOS
|
|
21
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
22
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
23
|
+
Classifier: Programming Language :: Python :: 3
|
|
24
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
30
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
31
|
+
Classifier: Topic :: Internet :: Proxy Servers
|
|
32
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
33
|
+
Classifier: Topic :: Security
|
|
34
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
35
|
+
Classifier: Topic :: System :: Networking
|
|
36
|
+
Classifier: Topic :: System :: Networking :: Monitoring
|
|
37
|
+
Classifier: Topic :: Utilities
|
|
38
|
+
Requires-Python: >=3.9
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
License-File: LICENSE
|
|
41
|
+
Requires-Dist: rich>=13
|
|
42
|
+
Requires-Dist: certifi
|
|
43
|
+
Provides-Extra: fast
|
|
44
|
+
Requires-Dist: uvloop; sys_platform != "win32" and extra == "fast"
|
|
45
|
+
Provides-Extra: mcp
|
|
46
|
+
Requires-Dist: mcp<3,>=2.2; python_version >= "3.10" and extra == "mcp"
|
|
47
|
+
Provides-Extra: dev
|
|
48
|
+
Requires-Dist: pytest; extra == "dev"
|
|
49
|
+
Requires-Dist: hypothesis; extra == "dev"
|
|
50
|
+
Requires-Dist: pyyaml; extra == "dev"
|
|
51
|
+
Requires-Dist: markdown-it-py; extra == "dev"
|
|
52
|
+
Requires-Dist: ruff==0.17.1; extra == "dev"
|
|
53
|
+
Dynamic: license-file
|
|
54
|
+
|
|
55
|
+
<div align="center">
|
|
56
|
+
|
|
57
|
+
<picture>
|
|
58
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.31.0/docs/banner-dark.svg">
|
|
59
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.31.0/docs/banner-light.svg">
|
|
60
|
+
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.31.0/docs/banner-dark.svg" alt="proxy-scraper – free proxies that actually work" width="100%">
|
|
61
|
+
</picture>
|
|
62
|
+
|
|
63
|
+
[](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/tests.yml)
|
|
64
|
+
[](https://github.com/maximilianfeix/proxy-scraper/releases/latest)
|
|
65
|
+
[](#live-list)
|
|
66
|
+
[](https://pypi.org/project/proxy-scraper-cli/)
|
|
67
|
+
[](https://pepy.tech/projects/proxy-scraper-cli)
|
|
68
|
+
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/pyproject.toml)
|
|
69
|
+
[](https://github.com/maximilianfeix/proxy-scraper/stargazers)
|
|
70
|
+
[](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/LICENSE)
|
|
71
|
+
|
|
72
|
+
<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>
|
|
73
|
+
<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>
|
|
74
|
+
<a href="#install"><img src="https://img.shields.io/badge/Install-121113?style=for-the-badge" alt="Install"></a>
|
|
75
|
+
<a href="#from-python"><img src="https://img.shields.io/badge/Python_API-121113?style=for-the-badge" alt="Python API"></a>
|
|
76
|
+
<a href="#mcp"><img src="https://img.shields.io/badge/MCP_server-121113?style=for-the-badge" alt="MCP server for AI agents"></a>
|
|
77
|
+
<a href="https://github.com/maximilianfeix/proxy-scraper/tree/v1.31.0/bot/"><img src="https://img.shields.io/badge/Discord_bot-121113?style=for-the-badge" alt="Discord bot"></a>
|
|
78
|
+
|
|
79
|
+
**English** · [简体中文](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.zh-CN.md) · [Español](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.es.md) · [Deutsch](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.de.md) · [Русский](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.ru.md) · [Português (Brasil)](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.pt-BR.md) · [Français](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/README.fr.md)
|
|
80
|
+
|
|
81
|
+
[Install](#install) · [Live list](#live-list) · [Check states](#check-states) · [For AI agents](#mcp) · [Proxy server](#proxy-server) · [Recipes](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/recipes.md) · [Options](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/options.md) · [FAQ](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/faq.md) · [All docs](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/README.md)
|
|
82
|
+
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
**Proxy checks you can inspect: what passed, what failed, and when.** proxy-scraper collects public HTTP, SOCKS4 and SOCKS5 proxies from hundreds of lists, runs up to four checks on each one and keeps the outcome of each check for the proxies it lists (for the rest it counts how each check ended), so "working" is something you can look at instead of a label you have to trust.
|
|
88
|
+
|
|
89
|
+
https://github.com/user-attachments/assets/b99c1d8f-5bce-4a52-a8a9-b9c2c726301b
|
|
90
|
+
|
|
91
|
+
<sub>21 seconds · real interface, example numbers, documentation IPs · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/video/proxy-scraper.mp4">mp4</a></sub>
|
|
92
|
+
|
|
93
|
+
**Try it** – no install needed, `uvx` comes with [uv](https://docs.astral.sh/uv/) (`pipx run` does the same):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
uvx proxy-scraper-cli --pick 3 --verify # up to 3 proxies from the hourly list that pass right now, from your network
|
|
97
|
+
uvx proxy-scraper-cli --diagnose socks5://HOST:PORT # one proxy, check by check: what it did and what it didn't
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
<div align="center">
|
|
101
|
+
<img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.31.0/docs/demo/checks.gif" alt="Terminal recording: proxy-scraper --pick 2 --verify --https-only prints two proxies and says on stderr why the other four were left out; proxy-scraper --diagnose shows each check of one proxy with its result" width="880">
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<sub>A real terminal recording, made against six simulated proxies on localhost ([reproduce it](https://github.com/maximilianfeix/proxy-scraper/tree/v1.31.0/docs/demo/)). It shows how results are reported. It measures nothing about public proxies.</sub>
|
|
105
|
+
|
|
106
|
+
The package is `proxy-scraper-cli` on PyPI (the plain name is taken). Once [installed](#install), the command is `proxy-scraper`. `--verify` and `--diagnose` need version 1.30 or newer.
|
|
107
|
+
|
|
108
|
+
**Three ways to get proxies, and what "checked" means for each:**
|
|
109
|
+
|
|
110
|
+
| Command | Where the proxies come from | Checked | Takes |
|
|
111
|
+
|---|---|---|---|
|
|
112
|
+
| `proxy-scraper --pick 5` | the [published list](#live-list) | from GitHub's servers when the list was built, about every hour | under a second |
|
|
113
|
+
| `proxy-scraper --pick 5 --verify` | the published list | **now, from your network** | seconds to a minute and a half at most |
|
|
114
|
+
| `proxy-scraper -y` | every list the tool knows | now, from your network | minutes (about three in the hourly runs) |
|
|
115
|
+
|
|
116
|
+
**What you get**
|
|
117
|
+
|
|
118
|
+
- **Every check has an outcome you can read.** `passed`, `failed`, `unavailable` or `skipped`, with a reason code, the target and the time, in the terminal, in JSON and from Python. A check that didn't run is never shown as passed, and a check target that is down doesn't turn the proxies checked against it into failures. → [Check states](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/check-states.md)
|
|
119
|
+
- **Fresh when it matters.** `--pick --verify` checks a few proxies from your own network, usually in seconds. `--recheck` does the same for [a list of your own](#examples), and `--diagnose` tells you why one proxy doesn't work.
|
|
120
|
+
- **More than a list.** A [rotating local proxy server](#proxy-server), a [Python API](#from-python), an [MCP server](#mcp) for AI agents, Docker, and exports for curl, proxychains, Clash and sing-box.
|
|
121
|
+
|
|
122
|
+
**What it can't do.** Free proxies are run by strangers, and of one hour's list only about a quarter is on the list again a day later. A pass is one measurement, from one network, against test targets: it is not a promise for the next hour or for the site you care about. The HTTPS check is a verified TLS connection to one test host, not a security rating. Use free proxies for public data and testing, never for logins, payments or anything personal. → [What the numbers show and what they don't](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/free-proxies-in-numbers.md) · [Why free proxies fail](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/why-free-proxies-fail.md) · [How it compares](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/comparison.md) · [Who runs free proxies](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/faq.md#who-runs-free-proxies)
|
|
123
|
+
|
|
124
|
+
**Only want the lists?** You don't need this tool: [free-proxy-list](https://github.com/maximilianfeix/free-proxy-list) has them as plain files per protocol and country, rebuilt about every hour. Or straight from here: [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) · [more formats](#live-list)
|
|
125
|
+
|
|
126
|
+
**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).
|
|
127
|
+
|
|
128
|
+
<a id="install"></a>
|
|
129
|
+
|
|
130
|
+
## Install
|
|
131
|
+
|
|
132
|
+
**With [pipx](https://pipx.pypa.io/)** (recommended – gives you a `proxy-scraper` command in its own environment):
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
pipx install proxy-scraper-cli
|
|
136
|
+
proxy-scraper
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**With [Homebrew](https://brew.sh)** on macOS and Linux:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
brew install maximilianfeix/tap/proxy-scraper
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The formula follows each release within about a day.
|
|
146
|
+
|
|
147
|
+
Docker, pip, a faster event loop, the latest main, tab completion and where state and results are stored: [every other way to install](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/install.md).
|
|
148
|
+
|
|
149
|
+
Started without arguments, a wizard asks what you are looking for – a preset (find everything, browsing, maximum anonymity, fast, a few right now, recheck, proxy server right away, …) or step by step: [the wizard and its presets](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/options.md#wizard-presets).
|
|
150
|
+
|
|
151
|
+
Keys: <kbd>↑</kbd><kbd>↓</kbd> select · <kbd>Space</kbd> toggle · <kbd>1</kbd>–<kbd>9</kbd> jump · <kbd>Enter</kbd> next · <kbd>Esc</kbd> back · <kbd>q</kbd> quit. In scripts and cron jobs the wizard never shows up – pass options or `-y`.
|
|
152
|
+
|
|
153
|
+
<a id="live-list"></a>
|
|
154
|
+
|
|
155
|
+
## Live proxy list
|
|
156
|
+
|
|
157
|
+
Don't want to scan yourself? About every hour **GitHub Actions** runs the tool and publishes the hits to the [`proxy-list`](https://github.com/maximilianfeix/proxy-scraper/tree/proxy-list) branch – every entry passed the first request, the second request and the content check in the last run (the HTTPS test is recorded per entry, not required), best first: fast ones that are likely to still be up come on top.
|
|
158
|
+
|
|
159
|
+
> **Just want the lists?** They also live in a repository of their own, **[maximilianfeix/free-proxy-list](https://github.com/maximilianfeix/free-proxy-list)** – one list per protocol, per country and per site, updated every hour, with the numbers of the last run on the front page. Watch or star it to keep it at hand. Other tools pull it too: [monosans/proxy-scraper-checker](https://github.com/monosans/proxy-scraper-checker) and [gfpcom/free-proxy-list](https://github.com/gfpcom/free-proxy-list) use it as a built-in source.
|
|
160
|
+
|
|
161
|
+
<a href="https://maximilianfeix.github.io/proxy-scraper/"><picture>
|
|
162
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://maximilianfeix.github.io/proxy-scraper/chart-dark.svg">
|
|
163
|
+
<source media="(prefers-color-scheme: light)" srcset="https://maximilianfeix.github.io/proxy-scraper/chart-light.svg">
|
|
164
|
+
<img src="https://maximilianfeix.github.io/proxy-scraper/chart-dark.svg" alt="Working proxies over the last days, stacked by protocol – redrawn with every run" width="100%">
|
|
165
|
+
</picture></a>
|
|
166
|
+
|
|
167
|
+
**→ [Browse it on the website](https://maximilianfeix.github.io/proxy-scraper/)** – search, filter by type, country, HTTPS, provider and latency, see how long each proxy has been on the list and in how many of the week's runs, copy or download exactly the proxies you need.
|
|
168
|
+
|
|
169
|
+
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`).
|
|
170
|
+
|
|
171
|
+
<div align="center"><a href="https://maximilianfeix.github.io/proxy-scraper/"><img src="https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/v1.31.0/docs/website.png" alt="The live list website" width="860"></a></div>
|
|
172
|
+
|
|
173
|
+
<div align="center">
|
|
174
|
+
|
|
175
|
+
[](https://github.com/maximilianfeix/proxy-scraper/tree/proxy-list)
|
|
176
|
+
[](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/http.txt)
|
|
177
|
+
[](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks4.txt)
|
|
178
|
+
[](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt)
|
|
179
|
+
[](https://github.com/maximilianfeix/proxy-scraper/actions/workflows/proxy-list.yml)
|
|
180
|
+
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
| List | Format | Link |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| All | `socks5://1.2.3.4:1080` | [all.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/all.txt) |
|
|
186
|
+
| HTTP · SOCKS4 · SOCKS5 | `1.2.3.4:8080` | [http.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/http.txt) · [socks4.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks4.txt) · [socks5.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt) |
|
|
187
|
+
| HTTPS-capable only | `type://ip:port` | [https.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/https.txt) |
|
|
188
|
+
| Elite only | `type://ip:port` | [elite.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/elite.txt) |
|
|
189
|
+
| Gets through to Google · Reddit · Amazon · Instagram · TikTok · Discord (one test request got a normal page in the last run) | `type://ip:port` | [google.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/google.txt) · [reddit.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/reddit.txt) · [amazon.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/amazon.txt) · [instagram.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/instagram.txt) · [tiktok.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/tiktok.txt) · [discord.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/works-with/discord.txt) |
|
|
190
|
+
| Stable, on the list in 90 %+ of this week's runs | `type://ip:port` | [stable.txt](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/stable.txt) |
|
|
191
|
+
| With all details | latency, country, HTTPS, anonymity, exit IP, uptime, sites | [proxies.json](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/proxies.json) · [proxies.csv](https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/proxies.csv) |
|
|
192
|
+
|
|
193
|
+
<a href="https://maximilianfeix.github.io/proxy-scraper/"><picture>
|
|
194
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://maximilianfeix.github.io/proxy-scraper/countries-dark.svg">
|
|
195
|
+
<source media="(prefers-color-scheme: light)" srcset="https://maximilianfeix.github.io/proxy-scraper/countries-light.svg">
|
|
196
|
+
<img src="https://maximilianfeix.github.io/proxy-scraper/countries-dark.svg" alt="Countries with the most working proxies right now" width="100%">
|
|
197
|
+
</picture></a>
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt | head
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Where they come from:** [which free proxy lists actually work](https://maximilianfeix.github.io/proxy-scraper/sources/) ranks every source of the hourly runs – how many proxies each one lists, how many passed every check and the share. The same as data: [sources.json](https://maximilianfeix.github.io/proxy-scraper/sources.json).
|
|
204
|
+
|
|
205
|
+
**Over time:** every day the first run's `proxies.json` is kept for good as a gzipped asset of the release of that year, like [snapshots-2026](https://github.com/maximilianfeix/proxy-scraper/releases/tag/snapshots-2026) – `proxies-2026-09-28.json.gz` and so on, for anyone who wants to look at free proxies over weeks and months.
|
|
206
|
+
|
|
207
|
+
Every file is also on GitHub Pages, which sits behind a CDN, isn't rate limited like raw.githubusercontent and sends CORS headers, so it works straight from the browser: `https://maximilianfeix.github.io/proxy-scraper/socks5.txt`. [jsDelivr](https://cdn.jsdelivr.net/gh/maximilianfeix/proxy-scraper@proxy-list/) works too, but can lag behind by a few hours.
|
|
208
|
+
|
|
209
|
+
Or let the tool start from it: `proxy-scraper --recheck live` downloads the list and checks it again from **your** network – well under a minute instead of a full scan. How many still work from your network differs a lot from the list's own count, which is the point of checking again. Add `--serve` and the result is a rotating proxy.
|
|
210
|
+
|
|
211
|
+
<a id="check-states"></a>
|
|
212
|
+
|
|
213
|
+
## Check states
|
|
214
|
+
|
|
215
|
+
Every check of a proxy ends in one of four states. They are in `proxies.json`, in the CSV, in `--pick --json`, in `--diagnose`, in the Python API (`result.checks`) and in the MCP results.
|
|
216
|
+
|
|
217
|
+
| State | Meaning |
|
|
218
|
+
|---|---|
|
|
219
|
+
| `passed` | The check ran and the proxy did what was asked. |
|
|
220
|
+
| `failed` | The check ran, its target was fine, and the proxy did not do what was asked. |
|
|
221
|
+
| `unavailable` | The check could not run, or says nothing about the proxy: its target didn't answer directly either, there was no reference to compare with, or this machine ran out of sockets. |
|
|
222
|
+
| `skipped` | Left out on purpose: `--fast`, a filter had already ruled the proxy out, or an earlier check failed. |
|
|
223
|
+
|
|
224
|
+
Two rules follow from that:
|
|
225
|
+
|
|
226
|
+
- **A check that didn't run is never `passed`.** Before 1.30, a run without a reachable second target kept every proxy as if it had been confirmed, and a missing reference page looked like "content unchanged".
|
|
227
|
+
- **A check target that is down doesn't fail the proxies checked against it.** When a second request, a content request that returned a different page, or an HTTPS test fails, the tool asks the target directly: at most once every 3 seconds however many proxies fail in between, and a "down" answer is reused for 10 seconds. If the target doesn't answer, the proxy's check is `unavailable`, not `failed`. For the first request a scan does it differently: it watches the target, switches to another one and checks the affected proxies again. `--diagnose` and `--pick --verify` have no such watcher and ask directly, as for the later checks. Two things are never asked about, because the target did answer: a second site that saw a different exit IP, and a proxy that could not be connected to in the first place.
|
|
228
|
+
|
|
229
|
+
The checks, what each `passed` does and doesn't mean, the fields and every reason code: [docs/check-states.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/check-states.md).
|
|
230
|
+
|
|
231
|
+
<a id="mcp"></a>
|
|
232
|
+
|
|
233
|
+
## For AI agents (MCP)
|
|
234
|
+
|
|
235
|
+
<!-- mcp-name: io.github.maximilianfeix/proxy-scraper -->
|
|
236
|
+
|
|
237
|
+
`proxy-scraper-mcp` is an [MCP](https://modelcontextprotocol.io) server: Claude Code, Claude Desktop, Cursor, VS Code, Codex and any other MCP client can ask for working proxies and load pages through them.
|
|
238
|
+
|
|
239
|
+
[](https://glama.ai/mcp/servers/maximilianfeix/proxy-scraper)
|
|
240
|
+
|
|
241
|
+
| Tool | What it does |
|
|
242
|
+
|---|---|
|
|
243
|
+
| `get_proxies` | proxies from the hourly list, as checked in its last run – filter by protocol, country, HTTPS, elite, no datacenter, not blocklisted, stable, uptime, latency, gets through to Google/Reddit/Amazon |
|
|
244
|
+
| `check_proxies` | checks proxies from your own network, so they work from where your code runs (30–90 s, reports progress) |
|
|
245
|
+
| `fetch_url` | loads a page through a proxy from the checked list, switches proxies by itself when one fails, returns readable text – HTTPS only through proxies that passed the TLS test |
|
|
246
|
+
|
|
247
|
+
Things to ask your agent: *"Load bbc.com/news as seen from the UK"*, *"Give me 5 SOCKS5 proxies from Germany that aren't in a datacenter"*, *"Check which of these sites block free proxies"*.
|
|
248
|
+
|
|
249
|
+
Needs [uv](https://docs.astral.sh/uv/) – it fetches a suitable Python by itself if yours is older than 3.10. **Claude Code:**
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
claude mcp add proxy-scraper -- uvx --python ">=3.10" --from "proxy-scraper-cli[mcp]" proxy-scraper-mcp
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Claude Desktop, Cursor and most other clients** – add this to the MCP config (Claude Desktop: Settings → Developer → Edit Config, Cursor: `~/.cursor/mcp.json`):
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"mcpServers": {
|
|
260
|
+
"proxy-scraper": {
|
|
261
|
+
"command": "uvx",
|
|
262
|
+
"args": ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"]
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**VS Code, Codex, Docker, or without uv:** [setup for every other client](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/mcp.md). It's also in the [official MCP registry](https://registry.modelcontextprotocol.io) as `io.github.maximilianfeix/proxy-scraper`, so clients that browse the registry can install it from there.
|
|
269
|
+
|
|
270
|
+
The server tells agents what it tells you: free proxies are run by strangers, so no logins, cookies or personal data through them. Local and private addresses are refused, and results go to proxy-scraper's data folder, not into the project you're working in.
|
|
271
|
+
|
|
272
|
+
<a id="examples"></a>
|
|
273
|
+
|
|
274
|
+
## Examples
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# 50 proxies that can do HTTPS – then stop
|
|
278
|
+
proxy-scraper --want 50 --https-only
|
|
279
|
+
|
|
280
|
+
# only Germany, Austria and Switzerland, the 20,000 most promising candidates
|
|
281
|
+
proxy-scraper --country DE,AT,CH -l 20000
|
|
282
|
+
|
|
283
|
+
# fast elite SOCKS5 proxies
|
|
284
|
+
proxy-scraper --types socks5 --anonymity elite --max-latency 1500
|
|
285
|
+
|
|
286
|
+
# 20 proxies that really reach Google AND Discord
|
|
287
|
+
proxy-scraper --target google.com --target discord.com --want 20
|
|
288
|
+
|
|
289
|
+
# only recheck the last hits (plus history) – takes seconds
|
|
290
|
+
proxy-scraper --recheck
|
|
291
|
+
|
|
292
|
+
# wizard with defaults – it keeps what you already passed
|
|
293
|
+
proxy-scraper -i --country DE
|
|
294
|
+
|
|
295
|
+
# which sources deliver the most?
|
|
296
|
+
proxy-scraper --list-sources
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Running from a clone? Replace `proxy-scraper` with `python3 proxy_scraper.py`.
|
|
300
|
+
|
|
301
|
+
<a id="from-python"></a>
|
|
302
|
+
|
|
303
|
+
### From Python
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
from proxyscraper import check_proxies, find_proxies
|
|
307
|
+
|
|
308
|
+
if __name__ == "__main__": # needed on macOS/Windows, the parser uses a process pool
|
|
309
|
+
for p in find_proxies(want=20, https=True, countries=["DE", "NL"], no_datacenter=True):
|
|
310
|
+
print(p.url, p.latency, p.country, p.org)
|
|
311
|
+
|
|
312
|
+
alive = check_proxies(["socks5://1.2.3.4:1080", "5.6.7.8:3128"]) # your own list
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Same run as the command line – sources, learning, every check, result files – just without terminal output. Each result has `url`, `latency`, `exit_ip`, `https`, `anonymity`, `country`, `asn`, `org` and `hosting`. There's an async version of both (`find_proxies_async`, `check_proxies_async`).
|
|
316
|
+
|
|
317
|
+
Don't need a fresh scan? `live_proxies` takes the [live list](#live-list) instead – no checks, one download, done in about a second:
|
|
318
|
+
|
|
319
|
+
```python
|
|
320
|
+
import itertools, requests
|
|
321
|
+
from proxyscraper import live_proxies
|
|
322
|
+
|
|
323
|
+
proxies = live_proxies(types=["socks5"], https=True, min_uptime=90) # the reliable ones this week
|
|
324
|
+
pool = itertools.cycle(p.url for p in proxies)
|
|
325
|
+
r = requests.get("https://api.ipify.org", proxies={"https": next(pool)}, timeout=15) # pip install "requests[socks]"
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Same filters as `find_proxies`, plus `min_uptime`, `works_on` (`["google"]`, `"reddit"`, `"amazon"`, `"instagram"`, `"tiktok"`, `"discord"`) and `limit`. Every result also has `uptime_24h`, `uptime_7d`, `first_seen`, `up_for_hours` and `sites`.
|
|
329
|
+
|
|
330
|
+
Or let the library do the retrying: `ProxyRotator` loads a URL through the list and moves on to the next proxy when one fails, and `proxy_url()` gives requests, httpx, Playwright or Scrapy one local address that rotates behind the scenes – [Python API: rotating through the list](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/python.md).
|
|
331
|
+
|
|
332
|
+
<a id="proxy-server"></a>
|
|
333
|
+
|
|
334
|
+
## Rotating proxy server
|
|
335
|
+
|
|
336
|
+
A list is nice – but usually you just want to enter **one** proxy address and have something behind it that keeps trying:
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
proxy-scraper --recheck --serve # recheck the last hits, then go – takes seconds
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
curl -x http://127.0.0.1:8899 https://api.ipify.org # a different IP every time
|
|
344
|
+
curl -x socks5h://127.0.0.1:8899 https://api.ipify.org # SOCKS5 on the same port
|
|
345
|
+
curl -x http://country-de:x@127.0.0.1:8899 https://api.ipify.org # only German exits
|
|
346
|
+
curl -x http://session-cart42:x@127.0.0.1:8899 https://shop.example # same proxy for this session
|
|
347
|
+
curl http://127.0.0.1:8899/__proxy-scraper/status # pool and counters as JSON
|
|
348
|
+
curl http://127.0.0.1:8899/__proxy-scraper/metrics # the same for Prometheus/Grafana
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Like commercial rotating proxies, the **username** carries what you want: `country-XX`, `type-http|socks4|socks5` and `session-NAME`, combinable (`country-us-type-socks5-session-a`). It works for HTTP (`Proxy-Authorization`) and SOCKS5 (username/password auth). By default the password is ignored and the server only listens on `127.0.0.1`.
|
|
352
|
+
|
|
353
|
+
To reach it from other machines, give it a password – every client then has to send it, over HTTP and SOCKS5 alike, and the status page wants it as Basic auth:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
export PROXY_SCRAPER_SERVE_PASSWORD=$(openssl rand -hex 16) # the env var keeps it out of `ps`
|
|
357
|
+
proxy-scraper --recheck --serve --serve-host 0.0.0.0
|
|
358
|
+
curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
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.31.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`.
|
|
362
|
+
|
|
363
|
+
Rotation strategies, sticky sessions, failover, background refill and the live dashboard: [docs/proxy-server.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/proxy-server.md).
|
|
364
|
+
|
|
365
|
+
<a id="pool-api"></a>
|
|
366
|
+
|
|
367
|
+
### Proxy pool API
|
|
368
|
+
|
|
369
|
+
Some programs want a proxy *address*, not a proxy – to hand it to a browser, a worker or a queue. The same port answers plain HTTP requests with one:
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
curl http://127.0.0.1:8899/get # one proxy as JSON, chosen like a connection would be
|
|
373
|
+
curl "http://127.0.0.1:8899/get?country=DE&https=1&format=txt" # → http://203.0.113.7:8080
|
|
374
|
+
curl "http://127.0.0.1:8899/all?protocol=socks5&limit=20" # the 20 best SOCKS5 proxies
|
|
375
|
+
curl "http://127.0.0.1:8899/report?proxy=203.0.113.7:8080&ok=0" # it failed you – three times and it's out
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
All endpoints, filters and what's compatible with jhao104/proxy_pool: [Proxy pool API](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/proxy-server.md#pool-api).
|
|
379
|
+
|
|
380
|
+
<a id="discord-bot"></a>
|
|
381
|
+
|
|
382
|
+
## Discord and Telegram bot
|
|
383
|
+
|
|
384
|
+
The live list can also come to you: [`bot/`](https://github.com/maximilianfeix/proxy-scraper/tree/v1.31.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.31.0/bot/README.md).
|
|
385
|
+
|
|
386
|
+
<a id="docs"></a>
|
|
387
|
+
|
|
388
|
+
## Documentation
|
|
389
|
+
|
|
390
|
+
Everything that used to be further down this README now has its own page – [all docs](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/README.md):
|
|
391
|
+
|
|
392
|
+
<a id="features"></a>
|
|
393
|
+
|
|
394
|
+
### Features
|
|
395
|
+
|
|
396
|
+
What the tool does, check by check and feature by feature: [How it works → Features](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/how-it-works.md#features).
|
|
397
|
+
|
|
398
|
+
<a id="why-not-just-download-a-list"></a>
|
|
399
|
+
|
|
400
|
+
### Why not just download a list?
|
|
401
|
+
|
|
402
|
+
A list tells you what worked for its author when it was built. What the tool adds: [How it works → Why not just download a list?](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/how-it-works.md#why-not-just-download-a-list) · [how it compares](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/comparison.md).
|
|
403
|
+
|
|
404
|
+
<a id="how-it-works"></a>
|
|
405
|
+
|
|
406
|
+
### How it works
|
|
407
|
+
|
|
408
|
+
Sources, collecting, prioritizing, the checks, countries and providers, blocklists, learning: [docs/how-it-works.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/how-it-works.md). Your own lists with `--source`: [recipes](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/recipes.md#your-own-lists).
|
|
409
|
+
|
|
410
|
+
<a id="output"></a>
|
|
411
|
+
|
|
412
|
+
### Output
|
|
413
|
+
|
|
414
|
+
Every run gets its own folder; `results/latest.txt` always names the newest one – the layout is in [docs/options.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/options.md#output).
|
|
415
|
+
|
|
416
|
+
<a id="recipes"></a>
|
|
417
|
+
|
|
418
|
+
### Recipes
|
|
419
|
+
|
|
420
|
+
requests, httpx, aiohttp, Scrapy, Selenium, proxychains, Clash / Mihomo, sing-box, PAC, Proxifier, Burp Suite / ZAP / mitmproxy, pipes, a GitHub workflow, Windows: [docs/recipes.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/recipes.md).
|
|
421
|
+
|
|
422
|
+
<a id="options"></a>
|
|
423
|
+
|
|
424
|
+
### Options
|
|
425
|
+
|
|
426
|
+
Every option in one table: [docs/options.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/options.md). Everything else: `proxy-scraper --help`
|
|
427
|
+
|
|
428
|
+
<a id="github-actions"></a>
|
|
429
|
+
|
|
430
|
+
### GitHub Actions
|
|
431
|
+
|
|
432
|
+
The workflows that test, lint, build the hourly list and release: [docs/how-it-works.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/how-it-works.md#github-actions). To use proxies in your own workflow: [the GitHub Action](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/github-action.md).
|
|
433
|
+
|
|
434
|
+
<a id="faq"></a>
|
|
435
|
+
|
|
436
|
+
### FAQ
|
|
437
|
+
|
|
438
|
+
[Who runs free proxies – and should you use them?](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/faq.md#who-runs-free-proxies) · almost nothing gets through · Windows · fewer proxies than other lists · logins · how fresh the list is · is it safe: [docs/faq.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/faq.md).
|
|
439
|
+
|
|
440
|
+
<a id="who-runs-free-proxies"></a>
|
|
441
|
+
|
|
442
|
+
<a id="roadmap"></a>
|
|
443
|
+
|
|
444
|
+
### Roadmap
|
|
445
|
+
|
|
446
|
+
What's next is in the [open issues](https://github.com/maximilianfeix/proxy-scraper/issues) – ideas and wishes are welcome as an [issue](https://github.com/maximilianfeix/proxy-scraper/issues/new/choose). During Hacktoberfest there are [beginner-friendly issues](https://github.com/maximilianfeix/proxy-scraper/issues?q=is%3Aopen+label%3Ahacktoberfest) with pointers on where to start. What shipped in each version: [docs/roadmap.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/roadmap.md).
|
|
447
|
+
|
|
448
|
+
<a id="contributing"></a>
|
|
449
|
+
|
|
450
|
+
## Contributing
|
|
451
|
+
|
|
452
|
+
Bug reports, new sources and pull requests are very welcome – see [CONTRIBUTING.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/CONTRIBUTING.md), and [docs/ARCHITECTURE.md](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/ARCHITECTURE.md) for how the pieces fit together. The short version:
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
pip install -e ".[dev]"
|
|
456
|
+
python3 -m pytest # runs offline – fake proxies on localhost
|
|
457
|
+
ruff check .
|
|
458
|
+
python3 docs/make_demo.py # regenerate the images in this README
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
The project structure, file by file, is in [How it works](https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/docs/how-it-works.md#project-structure).
|
|
462
|
+
|
|
463
|
+
<a id="community"></a>
|
|
464
|
+
|
|
465
|
+
## Community
|
|
466
|
+
|
|
467
|
+
Questions, ideas and things you built with it go to [Discussions](https://github.com/maximilianfeix/proxy-scraper/discussions) – bugs to the [issues](https://github.com/maximilianfeix/proxy-scraper/issues). If proxy-scraper saves you time, a ⭐ helps others find it.
|
|
468
|
+
|
|
469
|
+
Thanks to everyone who helped build it – new sources, countries, Python 3.14, examples and more:
|
|
470
|
+
|
|
471
|
+
<a href="https://github.com/maximilianfeix/proxy-scraper/graphs/contributors">
|
|
472
|
+
<img src="https://contrib.rocks/image?repo=maximilianfeix/proxy-scraper" alt="Contributors to proxy-scraper">
|
|
473
|
+
</a>
|
|
474
|
+
|
|
475
|
+
Want to join? [Beginner-friendly issues](https://github.com/maximilianfeix/proxy-scraper/issues?q=is%3Aopen+label%3A%22good+first+issue%22) say where to start.
|
|
476
|
+
|
|
477
|
+
From the same author: [dejabuilt](https://github.com/maximilianfeix/dejabuilt), an agent skill that checks GitHub before you build – it tells you whether a project idea already exists, with the numbers.
|
|
478
|
+
|
|
479
|
+
<a href="https://star-history.com/#maximilianfeix/proxy-scraper&Date">
|
|
480
|
+
<picture>
|
|
481
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date&theme=dark">
|
|
482
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date">
|
|
483
|
+
<img alt="Star history of proxy-scraper" src="https://api.star-history.com/svg?repos=maximilianfeix/proxy-scraper&type=Date" width="600">
|
|
484
|
+
</picture>
|
|
485
|
+
</a>
|
|
486
|
+
|
|
487
|
+
<a id="acknowledgements"></a>
|
|
488
|
+
|
|
489
|
+
## Acknowledgements
|
|
490
|
+
|
|
491
|
+
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.31.0/proxyscraper/sources.json), and especially to
|
|
492
|
+
|
|
493
|
+
- [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
|
|
494
|
+
- [Textualize/rich](https://github.com/Textualize/rich), which draws the whole terminal UI
|
|
495
|
+
- [IP Geolocation by DB-IP](https://db-ip.com) – the free country database (CC BY 4.0) used for offline country lookups
|
|
496
|
+
- [httpbin](https://httpbin.org), [checkip.amazonaws.com](https://checkip.amazonaws.com), [ifconfig.me](https://ifconfig.me), [ipinfo.io](https://ipinfo.io), [wtfismyip.com](https://wtfismyip.com), [ident.me](https://ident.me) and [ip-api.com](https://ip-api.com), used as check targets and for country lookups
|
|
497
|
+
|
|
498
|
+
## Disclaimer
|
|
499
|
+
|
|
500
|
+
This tool only collects publicly listed proxies and checks whether they work. You are responsible for how you use them – respect the terms of the sites you visit and the laws where you live.
|
|
501
|
+
|
|
502
|
+
<div align="center">
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
<sub>Made in Germany by <a href="https://github.com/maximilianfeix">@maximilianfeix</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/LICENSE">MIT License</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/CHANGELOG.md">Changelog</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/SECURITY.md">Security</a> · <a href="https://github.com/maximilianfeix/proxy-scraper/blob/v1.31.0/CONTRIBUTING.md">Contributing</a></sub>
|
|
507
|
+
|
|
508
|
+
<sub>If proxy-scraper saves you time, a ⭐ helps others find it.</sub>
|
|
509
|
+
|
|
510
|
+
</div>
|