Skip to content

schild/proxy_pool

 
 

Repository files navigation

ProxyPool 爬虫代理IP池

Build Status Packagist GitHub contributors

______                        ______             _
| ___ \_                      | ___ \           | |
| |_/ / \__ __   __  _ __   _ | |_/ /___   ___  | |
|  __/|  _// _ \ \ \/ /| | | ||  __// _ \ / _ \ | |
| |   | | | (_) | >  < \ |_| || |  | (_) | (_) || |___
\_|   |_|  \___/ /_/\_\ \__  |\_|   \___/ \___/ \_____\
                       __ / /
                      /___ /

ProxyPool

爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。

  • 文档: document Documentation Status

  • 支持版本:

  • 测试地址: http://demo.spiderpy.cn (勿压谢谢)

  • 付费代理推荐: 亮数据 Bright Data(前身 Luminati).全球代理与网络抓取行业头部领导者。覆盖 195+ 国家的 1.5亿+ 真人住宅IP,亲测成功率极高,轻松突破反爬封锁。需要高质量代理IP的可以注册后联系中文客服。申请免费试用 (PS:用不明白的同学可以参考这个使用教程)。

   想自建爬虫?接入 Bright Data MCP Server,让 Claude、Cursor、Windsurf 等 AI 助手直接实时抓取网页——自动破解验证码、绕过地区限制。Scraper Studio 支持 AI 一键生成或 JS 代码定制,全托管基础设施运行,无需自购代理、无需搭服务器,分钟级上线。所有产品底层均由同一套顶级代理网络驱动。

   API 产品现享7折 + 免费试用额度,注册后可联系中文客服快速上手。(用不明白的同学可参考使用教程,或注册后直接使用互动 AI 智能助手) 👉 https://get.brightdata.com/cd3yy5

运行项目

下载代码:
  • git clone
git clone git@github.com:jhao104/proxy_pool.git
  • releases
https://github.com/jhao104/proxy_pool/releases 下载对应zip文件
安装依赖:
pip install -r requirements.txt
更新配置:
# setting.py 为项目配置文件

# 配置API服务

HOST = "0.0.0.0"               # IP
PORT = 5000                    # 监听端口


# 配置数据库

DB_CONN = 'redis://:pwd@127.0.0.1:8888/0'


# 配置 ProxyFetcher

PROXY_FETCHER = [
    "freeProxy05",      # 快代理
    "freeProxy10",      # 89ip API
    "freeProxy11",      # 稻壳代理
    "freeProxy16",      # ProxyScrape
    "freeProxy18",      # Proxifly
]

PROXY_FETCHER_EXTRA = [
    "freeProxy07",      # 云代理 ip3366
    "freeProxy12",      # 66免费代理 API
    "freeProxy13",      # 齐云代理
    "freeProxy14",      # 积流代理
    "freeProxy15",      # Geonode
]

POOL_SIZE_MIN = 30             # 代理池低于该值时触发补采
POOL_SIZE_CHECK_TRIGGER = 60   # 低于该值时补充源开始介入

TARGET_SITE_VALIDATION = True
TARGET_SITE_URLS = [
    "http://q.10jqka.com.cn/thshy/detail/field/199112/order/desc/page/1/ajax/1/code/881101",
]
TARGET_SITE_REQUIRED_MARKERS = ["<table"]
TARGET_SITE_REJECT_MARKERS = ["Nginx forbidden", "request info:", "请求过于频繁"]
TARGET_SITE_COOKIE_URL = "http://localhost:3000/"
TARGET_SITE_COOKIE_NAME = "v"

FETCH_INTERVAL = 8             # 核心源抓取间隔(分钟)
CHECK_INTERVAL = 5             # 代理校验间隔(分钟)
EXTRA_FETCH_INTERVAL = 30      # 补充源抓取间隔(分钟)

TARGET_SITE_VALIDATION 用于目标站点过滤。代理只有通过通用连通性和同花顺目标页校验,才会进入 use_proxy;这样可以过滤掉“能访问通用网站、但访问同花顺返回 Nginx forbidden 或风控页”的代理。TARGET_SITE_COOKIE_URL 会读取本地 3000 token 服务并带上 v cookie,让校验路径尽量贴近真实采集请求。

启动项目:

# 如果已经具备运行条件, 可用通过proxyPool.py启动。
# 程序分为: schedule 调度程序 和 server Api服务

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

# 启动webApi服务
python proxyPool.py server

# 立即抓取、清洗、校验并写入代理池
python proxyPool.py refresh --force-extra

# 立即按当前校验规则重检已有可用代理池
python proxyPool.py check

Windows 后台常驻

项目里已经补了 Windows 后台脚本,默认优先使用 venv\Scripts\python.exe:

# 启动后台 schedule + server
powershell -ExecutionPolicy Bypass -File .\scripts\windows\start_background.ps1

# 查看状态
powershell -ExecutionPolicy Bypass -File .\scripts\windows\status_background.ps1

# 停止后台进程
powershell -ExecutionPolicy Bypass -File .\scripts\windows\stop_background.ps1

# 注册为“登录后自动启动”
powershell -ExecutionPolicy Bypass -File .\scripts\windows\install_startup_task.ps1

# 取消自动启动
powershell -ExecutionPolicy Bypass -File .\scripts\windows\uninstall_startup_task.ps1

后台日志默认写到 log/background/,运行 PID 文件写到 .runtime/

Docker Image

docker pull jhao104/proxy_pool

docker run --env DB_CONN=redis://:password@ip:port/0 -p 5010:5010 jhao104/proxy_pool:latest

docker-compose

项目目录下运行:

docker-compose up -d

使用

  • Api

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

api method Description params
/ GET api介绍 None
/get GET 随机获取一个代理 可选参数: ?type=https 过滤支持https的代理
/pop GET 获取并删除一个代理 可选参数: ?type=https 过滤支持https的代理
/all GET 获取所有代理 可选参数: ?type=https 过滤支持https的代理
/count GET 查看代理数量 None
/delete GET 删除代理 ?proxy=host:ip
  • 爬虫使用

  如果要在爬虫代码中使用的话, 可以将此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

扩展代理

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

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

  • 1、首先在ProxyFetcher类中添加自定义的获取代理的静态方法, 该方法需要以生成器(yield)形式返回host:ip格式的代理,例如:
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正确的格式返回
  • 2、添加好方法后,修改setting.py文件中的PROXY_FETCHER项:

  在PROXY_FETCHER下添加自定义方法的名字:

PROXY_FETCHER = [
    "freeProxy05",
    "freeProxy10",
    "freeProxy11",
    "freeProxy16",
    # ....
    "freeProxyCustom1"  #  # 确保名字和你添加方法名字一致
]

  如果你的新源属于低质量公共源,建议放进 PROXY_FETCHER_EXTRA,不要直接加入核心抓取列表。

  schedule 进程会每隔一段时间抓取一次代理,下次抓取时会自动识别调用你定义的方法。

免费代理源

当前默认启用的是已重新核对并更新过解析方式的源,主要参考了 CharlesPikachu/freeproxy 里仍在维护的来源实现,并结合实际连通性做了筛选。为了减少低质量公共源对校验线程的冲击,项目现在区分为“核心源”和“补充源":

代理名称 分组 默认启用 地址 代码
快代理 核心源 地址 freeProxy05
89ip API 核心源 地址 freeProxy10
稻壳代理 核心源 地址 freeProxy11
ProxyScrape 核心源 地址 freeProxy16
Proxifly 核心源 地址 freeProxy18
云代理 补充源 低频启用 地址 freeProxy07
66免费代理 补充源 低频启用 地址 freeProxy12
齐云代理 补充源 低频启用 地址 freeProxy13
积流代理 补充源 低频启用 地址 freeProxy14
Geonode 补充源 低频启用 地址 freeProxy15

OpenProxyList 当前保留代码但不再进入默认调度,最近一次 10 条样本校验中为 0 通过。

以下旧源目前已不再默认启用,原因是实际探测中出现了超时、403、404、405 或 DNS 失效等问题,后续若站点恢复可再手动开启并更新解析:

代理名称 当前情况 原代码
站大爷 页面返回 405 freeProxy01
66代理 连接超时 freeProxy02
开心代理 页面异常 500 freeProxy03
FreeProxyList 页面 404 freeProxy04
冰凌代理 域名失效 freeProxy06
小幻代理 页面 403 freeProxy08
免费代理库 页面 404 freeProxy09

如果还有其他好的免费代理网站, 可以在提交在issues, 下次更新时会考虑在项目中支持。

问题反馈

  任何问题欢迎在Issues 中反馈,同时也可以到我的博客中留言。

  你的反馈会让此项目变得更加完美。

贡献代码

  本项目仅作为基本的通用的代理池架构,不接收特有功能(当然,不限于特别好的idea)。

  本项目依然不够完善,如果发现bug或有新的功能添加,请在Issues中提交bug(或新功能)描述,我会尽力改进,使她更加完美。

  这里感谢以下contributor的无私奉献:

  @kangnwh | @bobobo80 | @halleywj | @newlyedward | @wang-ye | @gladmo | @bernieyangmh | @PythonYXY | @zuijiawoniu | @netAir | @scil | @tangrela | @highroom | @luocaodan | @vc5 | @1again | @obaiyan | @zsbh | @jiannanya | @Jerry12228

Release Notes

changelog

Featured|HelloGitHub

About

Python爬虫代理IP池(proxy pool)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Python 93.7%
  • PowerShell 5.7%
  • Other 0.6%