Skip to the content.

ProxyPool 爬虫代理IP池 优化增强

ProxyPool

原作者项目地址 感谢jhao104之前项目贡献,因原项目停更,根据自己需求修改了下

演示站:https://vps.122520.xyz (第一次请求可能会SSL handshake failed,刷新几下就可以了)
仅供展示,请勿进行实际测试

修复:
  1、去除imp依赖报错
  2、代理地区获取失败
  3、ProxyValidator中httpTimeOutValidator、httpsTimeOutValidator代理使用错误
  4、docker运行时报错,sh: can’t open ‘start.sh’: No such file or directory

新增:
  1、随机user_agents列表更新
  2、代理源更新,部分代理源需要外网或代理访问
  3、新增WebRequest.Session方法,解决简易反爬虫,用于需要传递Cookie才能显示完整内容的网站
  4、PROXY_FETCHER列表自动加载,不再需要手动新增,会扫描proxyFetcher.py中的所有方法,所以不用的注释掉
  5、重构getCount方法
  6、get、pop、all新增返回ip:port列表,对应gettxt、poptxt、alltxt
  7、get、pop、all、gettxt、poptxt、alltxt新增查询参数,更便捷
  8、获取http代理的匿名级别
  9、抓取代理时新增代理选项(setting.py配置),适合国内用户拉取国外网站
  10、新增日志文件配置(setting.py配置),适合机器硬盘小的用户,可只输出到控制台,不输出到文件
  11、新增proxy_type字段,用于标识该代理的类型,去除https字段
  12、ProxyValidator代理测试时采用随机user_agent
  13、实现socks4/socks5代理的抓取和检测
  14、将docker内项目根目录挂载到宿主机
  15、count方法修改,新增爬取全部代理数和存活率
  16、引入quickjs模块,使其支持js运算
  17、重构proxy采集/检查的定时任务逻辑
  18、使用异步工作协程和aiohttp重构proxy检测逻辑,大幅度提高检测速度

结果示例
/count
{
  "count": "2411/378242 有效率:0.64%",
  "proxy_type": {
    "http": 1833,
    "https": 115,
    "socks4": 1431,
    "socks4tohttps": 93,
    "socks5": 1101,
    "socks5tohttps": 96
  },
  "source": {
    "customProxy01": "2338/374780 有效率:0.62%",
    "freeProxy02": "98/300 有效率:32.67%",
    "freeProxy03": "46/228 有效率:20.18%",
    "freeProxy04": "23/50 有效率:46.00%",
    "freeProxy05": "58/126 有效率:46.03%",
    "freeProxy07": "14/300 有效率:4.67%",
    "freeProxy08": "8/200 有效率:4.00%",
    "freeProxy09": "34/90 有效率:37.78%",
    "freeProxy10": "1/280 有效率:0.36%",
    "freeProxy11": "77/1273 有效率:6.05%",
    "freeProxy12": "1/175 有效率:0.57%",
    "freeProxy13": "2/11 有效率:18.18%",
    "freeProxy14": "20/20 有效率:100.00%",
    "freeProxy15": "16/20 有效率:80.00%",
    "freeProxy16": "26/60 有效率:43.33%"
  }
}


/get
{
  "anonymous": 2,
  "check_count": 1,
  "fail_count": 0,
  "last_status": true,
  "last_time": "2025-05-14 05:01:07",
  "proxy": "123.154.30.68:8085",
  "proxy_type": [
    "http"
  ],
  "region": "浙江省温州市 联通",
  "source": "customProxy01"
}

运行项目

Windows中运行需要python版本3.12及以下,3.13部分依赖安装报错。其他系统无要求

不管哪种方式运行,请提前安装好redis

源代码运行

下载代码:
git clone https://github.com/jin-ting2520/proxy_pool_new.git
安装依赖:
pip install -r requirements.txt
更新配置:
# setting.py 为项目配置文件

# 配置API服务
HOST = "0.0.0.0"               # IP
PORT = 5000                    # 监听端口
# 配置数据库

# 修改pwd
DB_CONN = 'redis://:pwd@127.0.0.1:6379/0'

# 抓取代理时使用的代理是否使用代理
USE_PROXY = True
# 抓取代理时使用的代理
PROXIES = {'http': "http://127.0.0.1:7897", 'https': "http://127.0.0.1:7897"}

# 是否将日志输出到文件
INPUT_LOG_FILE = True
# 日志文件保存日期
LOG_FILE_SAVE_DATE = 1

启动项目:

# 启动调度程序
python proxyPool.py schedule

# 启动webApi服务
python proxyPool.py server


Docker 运行

# 必须拉取源代码
git clone https://github.com/jin-ting2520/proxy_pool_new.git
# 启动之前注意修改setting.py文件中的代理配置以及下方命令中redis的password
docker run -v $PWD/proxy-pool-new:/proxy-pool-new --env DB_CONN=redis://:password@172.17.0.1:6379/0 -p 5010:5010 --name proxy_pool_new ywtm/proxy_pool_new:latest

docker-compose 运行

项目目录下运行:

git clone https://github.com/jin-ting2520/proxy_pool_new.git
cd proxy_pool_new
# 启动之前注意修改setting.py文件中的代理配置
docker-compose up -d

使用

启动web服务后, 默认配置下会开启 http://127.0.0.1:5010 的api接口服务:

api method Description params
/ GET api介绍 None
/get GET 随机获取一个代理 可选参数: 见下表
/gettxt GET 随机获取一个代理,ip:port格式 可选参数: 见下表
/pop GET 获取并删除一个代理 可选参数: 见下表
/poptxt GET 获取并删除一个代理,ip:port格式 可选参数: 见下表
/all GET 获取所有代理 可选参数: 见下表
/alltxt GET 获取所有代理,ip:port格式 可选参数: 见下表
/count GET 查看代理数量 None
/delete GET 删除代理 ?proxy=host:ip
/cleardb GET 清空代理 None
参数名 参数可选值 说明
type http, httptohttps,
https,
socks4,socks4tohttps,
socks5, socks5tohttps
获取代理类型
http: http代理连接http网站
httptohttps: http代理连接https网站
https: https代理连接https网站
socks4: socks4代理连接http网站
socks4tohttps: socks4代理连接https网站
socks5: socks5代理连接http网站
socks5tohttps: socks5代理连接https网站
region 目前只支持中文 e.g. 香港 代理地区
anonymous 0,1,2 HTTP代理匿名级别
0(透明代理)
1(匿名代理)
2(高匿代理)

  如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:

import requests

def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").json()

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

# your spider code

def getHtml():
    # ....
    retry_count = 5
    proxy = get_proxy().get("proxy")
    while retry_count > 0:
        try:
            html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
            # 使用代理访问
            return html
        except Exception:
            retry_count -= 1
    # 删除代理池中代理
    delete_proxy(proxy)
    return None

扩展代理

  项目默认包含几个免费的代理获取源,但是免费的毕竟质量有限,所以如果直接运行可能拿到的代理质量不理想。所以,提供了代理获取的扩展方法。

  添加一个新的代理源方法如下:


class ProxyFetcher(object):
    # ....

    # 自定义代理源获取方法
    @staticmethod
    def freeProxyCustom1():  # 命名不和已有重复即可

        # 通过某网站或者某接口或某数据库获取代理
        # 假设你已经拿到了一个代理列表
        proxies = ["x.x.x.x:3128", "x.x.x.x:80"]
        for proxy in proxies:
            yield proxy
        # 确保每个proxy都是 host:ip正确的格式返回


优惠流量卡

> >