Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,20 +194,20 @@ class MyProxyFetcher(BaseFetcher):

目前实现的采集免费代理网站有(排名不分先后, 下面仅是对其发布的免费代理情况, 付费代理测评可以参考[这里](https://zhuanlan.zhihu.com/p/33576641)):

| 代理名称 | 状态 | 更新速度 | 可用率 | 地址 | 代码 |
|-------------| ---- | -------- |----|----------------------------------|-----------------------------------------------------|
| 开心代理 | ✔ | ★ | * | [地址](http://www.kxdaili.com/) | [`kxdaili.py`](/fetcher/sources/kxdaili.py) |
| 快代理 | ✔ | ★ | * | [地址](https://www.kuaidaili.com/) | [`kuaidaili.py`](/fetcher/sources/kuaidaili.py) |
| 云代理 | ✔ | ★ | * | [地址](http://www.ip3366.net/) | [`ip3366.py`](/fetcher/sources/ip3366.py) |
| 小幻代理 | ✔ | ★ | * | [地址](https://ip.ihuan.me/) | [`ihuan.py`](/fetcher/sources/ihuan.py) |
| 免费代理库 | ✔ | | * | [地址](http://ip.jiangxianli.com/) | [`jiangxianli.py`](/fetcher/sources/jiangxianli.py) |
| 89代理 | ✔ | | * | [地址](https://www.89ip.cn/) | [`ip89.py`](/fetcher/sources/ip89.py) |
| 稻壳代理 | ✔ | ★★ | *** | [地址](https://www.docip.ne) | [`docip.py`](/fetcher/sources/docip.py) |
| 谷德代理 | ✔ | ★★ | *** | [地址](https://www.goodips.com) | [`goodips.py`](/fetcher/sources/goodips.py) |
| 66代理 | ✔ | ★★ | * | [地址](https://www.66daili.com) | [`daili66.py`](/fetcher/sources/daili66.py) |
| Proxifly | ✔ | ★★ | ** | [地址](https://proxifly.dev) | [`proxifly.py`](/fetcher/sources/proxifly.py) |
| FreeVPNNode | ✔ | ★★ | * | [地址](https://cn.freevpnnode.com) | [`freevpnnode.py`](/fetcher/sources/freevpnnode.py) |
| Geonode | ✔ | ★★ | ** | [地址](https://geonode.com) | [`geonode.py`](/fetcher/sources/geonode.py) |
| 代理名称 | 状态 | 更新速度 | 可用率 | 地址 | 代码 |
|--------------| ---- |------|-----|---------------------------------------------------|---------------------------------------------------------|
| 开心代理 | ✔ | ★ | * | [地址](http://www.kxdaili.com/) | [`kxdaili.py`](/fetcher/sources/kxdaili.py) |
| 快代理 | ✔ | ★ | * | [地址](https://www.kuaidaili.com/) | [`kuaidaili.py`](/fetcher/sources/kuaidaili.py) |
| 云代理 | ✔ | ★ | * | [地址](http://www.ip3366.net/) | [`ip3366.py`](/fetcher/sources/ip3366.py) |
| 小幻代理 | ✔ | ★ | * | [地址](https://ip.ihuan.me/) | [`ihuan.py`](/fetcher/sources/ihuan.py) |
| 89代理 | ✔ | ★★ | ** | [地址](https://www.89ip.cn) | [`ip89.py`](/fetcher/sources/ip89.py) |
| 稻壳代理 | ✔ | ★★ | *** | [地址](https://www.docip.ne) | [`docip.py`](/fetcher/sources/docip.py) |
| 谷德代理 | ✔ | ★★ | *** | [地址](https://www.goodips.com) | [`goodips.py`](/fetcher/sources/goodips.py) |
| 66代理 | ✔ | ★★ | * | [地址](https://www.66daili.com) | [`daili66.py`](/fetcher/sources/daili66.py) |
| Proxifly | ✔ | ★★ | ** | [地址](https://proxifly.dev) | [`proxifly.py`](/fetcher/sources/proxifly.py) |
| FreeVPNNode | ✔ | ★★ | * | [地址](https://cn.freevpnnode.com) | [`freevpnnode.py`](/fetcher/sources/freevpnnode.py) |
| Geonode | | ★★ | ** | [地址](https://geonode.com) | [`geonode.py`](/fetcher/sources/geonode.py) |
| RoundProxies | ✔ | | * | [地址](https://roundproxies.com/free-proxy-list) | [`roundproxies.py`](/fetcher/sources/roundproxies.py) |


如果还有其他好的免费代理网站, 可以在提交在[issues](https://github.com/jhao104/proxy_pool/issues/71), 下次更新时会考虑在项目中支持。
Expand Down
3 changes: 3 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
9. 移除失效代理源 **FreeProxyList**; (2026-06-02)
10. 新增代理源 **66代理 (daili66)**; (2026-06-08)
11. 移除失效代理源 **66代理 (ip66)**; (2026-06-08)
12. 新增代理源 **RoundProxies**; (2026-06-09)
13. 移除失效代理源 **免费代理库 (jiangxianli)**; (2026-06-09)



## 2.4.2 (2024-01-18)
Expand Down
37 changes: 0 additions & 37 deletions fetcher/sources/jiangxianli.py

This file was deleted.

43 changes: 43 additions & 0 deletions fetcher/sources/roundproxies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: roundproxies.py
Description : Roundproxies
Author : JHao
date: 2026/06/09
-------------------------------------------------
Change Activity:
2026/06/09:
-------------------------------------------------
"""
__author__ = 'JHao'

from fetcher.baseFetcher import BaseFetcher
from handler.logHandler import LogHandler
from util.webRequest import WebRequest

logger = LogHandler("fetcher")

class RoundProxiesFetcher(BaseFetcher):
"""Roundproxies https://roundproxies.com/free-proxy-list"""

name = "roundproxies"
url = "https://roundproxies.com/free-proxy-list"

enabled = True

def fetch(self):
page_size = 50
_url = f"https://roundproxies.com/api/get-free-proxies/?limit={page_size}&page=1&sort_by=lastChecked&sort_type=desc"
r = WebRequest().get(_url, timeout=10)
try:
for each in r.json.get("data", []):
yield "%s:%s" % (each["ip"], each["port"])
except Exception as e:
logger.error("ProxyFetch - roundproxies: %s" % e)



if __name__ == '__main__':
for proxy in RoundProxiesFetcher().fetch():
print(proxy)
45 changes: 32 additions & 13 deletions tests/unit/test_fetcher_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ class TestFetcherInterface(object):
FETCHER_CLASSES = [
("fetcher.sources.kxdaili", "KxdailiFetcher"),
("fetcher.sources.ip3366", "Ip3366Fetcher"),
("fetcher.sources.jiangxianli", "JiangxianliFetcher"),
("fetcher.sources.ip89", "Ip89Fetcher"),
("fetcher.sources.docip", "DocipFetcher"),
("fetcher.sources.goodips", "GoodipsFetcher"),
Expand All @@ -70,6 +69,7 @@ class TestFetcherInterface(object):
("fetcher.sources.ihuan", "IhuanFetcher"),
("fetcher.sources.proxifly", "ProxiFlyFetcher"),
("fetcher.sources.daili66", "DaiLi66Fetcher"),
("fetcher.sources.roundproxies", "RoundProxiesFetcher"),
]

def test_all_fetchers_have_name_url_enabled(self):
Expand Down Expand Up @@ -120,18 +120,6 @@ def test_fetch(self, mock_wr):
assert "5.6.7.8:3128" in result


class TestJiangxianliFetcher(object):

@patch("fetcher.sources.jiangxianli.WebRequest")
def test_fetch(self, mock_wr):
from fetcher.sources.jiangxianli import JiangxianliFetcher
html = _html_table([("IP", "Port"), ("1.2.3.4", "8080")])
tree = etree.HTML(html)
mock_wr.return_value.get.return_value = _make_response(tree=tree)
result = list(JiangxianliFetcher().fetch())
assert "1.2.3.4:8080" in result


class TestIp89Fetcher(object):

@patch("fetcher.sources.ip89.WebRequest")
Expand Down Expand Up @@ -395,3 +383,34 @@ def test_fetch_empty_data_returns_empty(self, mock_wr):
mock_wr.return_value.get.return_value = _make_response(json_data={})
result = list(DaiLi66Fetcher().fetch())
assert result == []


class TestRoundProxiesFetcher(object):

@patch("fetcher.sources.roundproxies.WebRequest")
def test_fetch(self, mock_wr):
from fetcher.sources.roundproxies import RoundProxiesFetcher
json_data = {
"data": [
{"ip": "1.2.3.4", "port": "8080"},
{"ip": "5.6.7.8", "port": "3128"},
]
}
mock_wr.return_value.get.return_value = _make_response(json_data=json_data)
result = list(RoundProxiesFetcher().fetch())
assert "1.2.3.4:8080" in result
assert "5.6.7.8:3128" in result

@patch("fetcher.sources.roundproxies.WebRequest")
def test_fetch_empty_data_returns_empty(self, mock_wr):
from fetcher.sources.roundproxies import RoundProxiesFetcher
mock_wr.return_value.get.return_value = _make_response(json_data={})
result = list(RoundProxiesFetcher().fetch())
assert result == []

@patch("fetcher.sources.roundproxies.WebRequest")
def test_fetch_exception_returns_empty(self, mock_wr):
from fetcher.sources.roundproxies import RoundProxiesFetcher
mock_wr.return_value.get.return_value = _make_response(json_data=None)
result = list(RoundProxiesFetcher().fetch())
assert result == []
Loading