用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

代理IP池自动采集搭建零成本方案从手换到Docker一键拉起:GitHub上star了23k的proxy_pool项目Docker一行命令配10个免费代理源每20分钟自动采集一轮用百度首页做连通性校验,池子里稳定维持200个可用IP爬虫成功率从40%拉到92%

一开始是手动从快代理免费页面上复制粘贴IP到爬虫脚本里,每半小时换一批,换到第三批就发现90%的IP根本连不上。后来找到GitHub上star了23k的proxy_pool项目,Docker一行命令拉起来,配了10个免费代理源让它每20分钟自动采集一轮、每个IP用百度首页做连通性校验,跑了一晚上池子里稳定维持在200个可用IP,爬虫的请求成功率从原来手动换IP时的40%直接拉到92%。免费的做到这个程度,对于中小规模的站群数据采集已经足够用了

代理IP池这件事,搜这个词的人大概分三种:第一种是爬虫被目标站封了IP,需要自动换IP继续采数据;第二种是管着一批站要做SEO监控(查排名、查收录),每次请求得换不同IP避免触发风控;第三种是跨境电商或社交媒体矩阵运营,需要大量不同地区的IP来模拟真实用户。三种需求对代理IP的稳定性、匿名度、响应速度要求不一样,选错方案要么跑不起来要么浪费钱。下面从免费到付费、从开箱即用到自建全链路讲一遍。

三种需求速查

你的场景推荐方案月成本一句话理由
中小规模爬虫、预算敏感proxy_pool 自建免费池服务器成本Docker一键部署,200+可用IP
商业项目、要求高可用率付费代理 + 自建池做缓存¥200-2000/月可用率99%+,提取API直接调
跨境电商/社媒矩阵住宅代理 + 静态IP混合¥500-5000/月真实住宅IP,风控识别率低

一、开源方案:proxy_pool,Docker一行命令跑起来

GitHub上star最高的两个代理池项目:jhao104/proxy_pool(23k+ stars)和 Python3WebSpider/ProxyPool(6k+ stars)。前者功能更全、文档更完善、社区更活跃,是目前自建免费代理池的首选。

Docker部署(最快方式)

# 拉取并运行,一行搞定docker run -d --name proxy_pool \-p 5010:5010 \-e DB_CONN=redis://:password@你的Redis地址:6379/0 \jhao104/proxy_pool:latest# 查看日志确认启动成功docker logs -f proxy_pool# 查看当前池子里的IP数量curl http://localhost:5010/all/

proxy_pool 启动后自动做四件事

  • 采集(Crawler):每20分钟从10+个免费代理网站自动抓取最新IP列表
  • 验证(Validator):每个新入库的IP先用百度首页做HTTP连通性测试,不通的直接丢弃
  • 轮检(Scheduler):已入库的IP每10分钟重新验证一次,连续3次不通的自动剔除
  • API(Server):Flask提供RESTful接口,GET请求返回可用代理

核心API接口

接口URL说明
随机获取一个代理/get/返回评分最高的一个可用代理
获取所有代理/all/返回池子中全部已验证通过的代理
获取代理数量/count/查看当前池子中有多少可用IP
手动删除代理/delete/?proxy=ip:port某个IP出问题了手动踢掉

二、自写采集脚本:不依赖开源项目,完全自己掌控

如果你不想引入整个proxy_pool项目,或者需要更灵活的控制(比如自定义验证目标网站、自己决定采集哪些代理源),200行Python代码就能搭一套精简版。

采集模块:从免费代理网站抓IP

# proxy_collector.py — 多源采集 + 并发验证import reimport timeimport queueimport threadingimport requestsfrom bs4 import BeautifulSoup# 免费代理源(只列还在稳定运行的)PROXY_SOURCES = [# 快代理免费页{'url': 'https://www.kuaidaili.com/free/inha/{page}/', 'pages': 5},# 89免费代理{'url': 'https://www.89ip.cn/index_{page}.html', 'pages': 3},# 云代理{'url': 'https://www.ip3366.net/free/?page={page}', 'pages': 5},# 小幻代理{'url': 'https://ip.ihuan.me/', 'pages': 1},]def fetch_from_kuaidaili(url):"""快代理专用解析器"""resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)soup = BeautifulSoup(resp.text, 'html.parser')proxies = []for row in soup.select('table tbody tr'):cols = row.find_all('td')if len(cols) >= 2:ip = cols[0].text.strip()port = cols[1].text.strip()proxies.append(f'{ip}:{port}')return proxiesdef fetch_from_89ip(url):"""89代理专用解析器"""resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)# 89代理的IP在纯文本中,用正则提取pattern = r'(\d+\.\d+\.\d+\.\d+):(\d+)'return [f'{m[0]}:{m[1]}' for m in re.findall(pattern, resp.text)]def collect_all():"""从所有源采集代理IP"""all_proxies = set()for source in PROXY_SOURCES:for page in range(1, source['pages'] + 1):try:url = source['url'].format(page=page)if 'kuaidaili' in url:proxies = fetch_from_kuaidaili(url)elif '89ip' in url:proxies = fetch_from_89ip(url)else:proxies = fetch_from_kuaidaili(url)  # 默认用通用解析all_proxies.update(proxies)print(f'  [{url}] -> {len(proxies)} proxies')except Exception as e:print(f'  [SKIP] {url}: {e}')time.sleep(1)  # 礼貌爬取print(f'Total collected: {len(all_proxies)}')return list(all_proxies)

验证模块:多线程并发测试连通性

# proxy_validator.py — 并发验证代理可用性import timeimport threadingfrom concurrent.futures import ThreadPoolExecutor, as_completedimport requests# 用于验证的目标URL(选一个稳定的)TEST_URL = 'https://www.baidu.com'TIMEOUT = 5MAX_WORKERS = 50valid_proxies = []lock = threading.Lock()def validate_one(proxy):"""验证单个代理"""proxies = {'http': f'http://{proxy}', 'https': f'http://{proxy}'}try:start = time.time()resp = requests.get(TEST_URL, proxies=proxies, timeout=TIMEOUT)elapsed = time.time() - startif resp.status_code == 200:with lock:valid_proxies.append({'proxy': proxy,'speed': round(elapsed, 2),})return Trueexcept:passreturn Falsedef batch_validate(proxy_list):"""并发批量验证"""valid_proxies.clear()total = len(proxy_list)with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:futures = {executor.submit(validate_one, p): p for p in proxy_list}done = 0for future in as_completed(futures):done += 1if done % 50 == 0:print(f'  Progress: {done}/{total}, valid: {len(valid_proxies)}')# 按速度排序,快的排前面valid_proxies.sort(key=lambda x: x['speed'])print(f'Validation done: {len(valid_proxies)}/{total} valid')return valid_proxies

调度模块:定时采集+验证+提供API

# proxy_server.py — Flask API + 定时调度import jsonimport randomimport scheduleimport threadingfrom flask import Flask, jsonify, requestapp = Flask(__name__)pool = []  # 全局代理池def refresh_pool():"""定时刷新代理池"""global poolprint(f'[{time.strftime("%H:%M:%S")}] Refreshing proxy pool...')raw = collect_all()pool = batch_validate(raw)print(f'[{time.strftime("%H:%M:%S")}] Pool refreshed: {len(pool)} proxies')def scheduler_loop():"""后台定时调度线程"""schedule.every(20).minutes.do(refresh_pool)while True:schedule.run_pending()time.sleep(10)# 启动时立即采集一次refresh_pool()# 后台定时线程t = threading.Thread(target=scheduler_loop, daemon=True)t.start()@app.route('/get')def get_proxy():"""随机返回一个可用代理"""if not pool:return jsonify({'error': 'pool empty'}), 503p = random.choice(pool)return jsonify({'proxy': p['proxy'], 'speed': p['speed']})@app.route('/all')def all_proxies():"""返回全部可用代理"""return jsonify(pool)@app.route('/count')def count():return jsonify({'count': len(pool)})if __name__ == '__main__':app.run(host='0.0.0.0', port=8899)

自写 vs proxy_pool 开源项目,选哪个

  • proxy_pool 开源项目:功能完整、社区维护、Docker一键部署、有Web管理界面、支持Redis持久化。适合"懒得写代码,搭起来能用就行"
  • 自写精简版:代码完全可控、可以自定义验证目标(不只能用百度验证,换成你的目标站更精准)、代理源想加就加想删就删。适合"需要精细控制每一个环节"

三、付费代理:什么情况下免费的不够用了

免费代理池有一个天花板:可用率一般在30%-60%,响应速度在1-5秒之间,而且IP大多是机房IP(非住宅),部分目标站会直接拒绝机房IP的请求。如果你的场景属于以下任一种,付费代理是值得的:

服务商类型起步价格IP池规模提取方式适合场景
快代理隧道代理/独享¥200/月起百万级API提取+白名单通用爬虫、SEO监控
站大爷动态隧道/短效按量付费千万级API提取高并发采集、可用率99%+
亿牛云爬虫代理/隧道¥300/月起百万级API提取电商数据采集
IPIPGO住宅代理按流量付费千万级API+账密认证社媒运营、跨境电商
注意付费代理的"隧道代理"和"API提取"是两种不同模式。隧道代理是给你一个固定的代理地址和端口,每次请求自动换IP,代码最简单;API提取是你主动调接口拿一个IP用完再拿下一个,灵活度更高。一般爬虫用隧道代理就够了,需要指定地区或运营商的场景用API提取。

四、爬虫里怎么接入代理池

不管是自建的proxy_pool还是付费代理的API,在爬虫代码里接入都很简单。以requests为例:

import requestsimport randomclass ProxyPoolMiddleware:def __init__(self, pool_url='http://localhost:5010'):self.pool_url = pool_urlself.failed_proxies = set()def get_proxy(self):"""从代理池获取一个可用代理"""try:resp = requests.get(f'{self.pool_url}/get/', timeout=3)if resp.status_code == 200:proxy = resp.json()['proxy']if proxy not in self.failed_proxies:return proxyexcept:passreturn Nonedef mark_failed(self, proxy):"""标记失败的代理"""self.failed_proxies.add(proxy)# 也可以调 /delete/ 接口从池子里删掉try:requests.get(f'{self.pool_url}/delete/?proxy={proxy}', timeout=3)except:passdef request_with_retry(self, url, max_retries=3, **kwargs):"""带代理切换的重试请求"""for i in range(max_retries):proxy = self.get_proxy()if not proxy:raise Exception('No proxy available')proxies = {'http': f'http://{proxy}', 'https': f'http://{proxy}'}try:resp = requests.get(url, proxies=proxies, timeout=10, **kwargs)if resp.status_code == 200:return respif resp.status_code in [403, 429]:  # 被限制self.mark_failed(proxy)continuereturn respexcept requests.RequestException:self.mark_failed(proxy)continueraise Exception(f'Failed after {max_retries} retries')# 使用middleware = ProxyPoolMiddleware('http://localhost:5010')try:resp = middleware.request_with_retry('https://目标网站.com/page')print(resp.text[:200])except Exception as e:print(f'Request failed: {e}')

五、免费代理源怎么选,哪些已经不能用了

免费代理网站变化很快,有的今天能爬明天就加反爬了,有的干脆关站了。下面列的是截至当前还在稳定运行的:

快代理免费页

kuaidaili.com/free — 每15分钟更新一次,可用率约40%,IP数量稳定在100-200个。有反爬需要带UA。

1 - 代理IP池自动采集搭建零成本方案从手换到Docker一键拉起:GitHub上star了23k的proxy_pool项目Docker一行命令配10个免费代理源每20分钟自动采集一轮用百度首页做连通性校验,池子里稳定维持200个可用IP爬虫成功率从40%拉到92% - UC建站系统

89免费代理

89ip.cn — 页面结构简单纯文本,极易解析,可用率约30%,胜在稳定不挂。

云代理

ip3366.net — 国内+国外混合,可用率约25%,适合需要海外IP的场景。

2 - 代理IP池自动采集搭建零成本方案从手换到Docker一键拉起:GitHub上star了23k的proxy_pool项目Docker一行命令配10个免费代理源每20分钟自动采集一轮用百度首页做连通性校验,池子里稳定维持200个可用IP爬虫成功率从40%拉到92% - UC建站系统

小幻代理

ip.ihuan.me — 动态页面,需要用headless浏览器或分析API接口获取,可用率较高约50%。

已失效西刺代理(xicidaili.com)已关站;66免费代理(66ip.cn)时好时坏;米扑代理免费页反爬严格。这些就别往采集脚本里加了。

六、免费 vs 付费,怎么选看这张表

对比维度自建免费池 (proxy_pool)付费隧道代理付费住宅代理
月成本服务器 ¥50-200¥200-1000¥500-5000
可用IP数量100-500个百万级千万级
可用率30%-60%95%-99%99%+
响应速度1-5秒0.3-1秒0.5-2秒
IP类型机房IP为主机房+少量住宅真实住宅IP
反爬识别率中等
运维成本需要自己维护零运维零运维

七、代理池运维中容易碰到的问题

免费IP用着用着就断了

免费代理的生命周期通常只有几分钟到几十分钟。解决方式是缩短验证间隔(proxy_pool默认10分钟验证一次,可以改成5分钟),以及在爬虫请求层面加自动重试和代理切换逻辑。上面的 ProxyPoolMiddleware 类已经做了这个处理:请求失败自动标记坏代理、自动换下一个重试。

3 - 代理IP池自动采集搭建零成本方案从手换到Docker一键拉起:GitHub上star了23k的proxy_pool项目Docker一行命令配10个免费代理源每20分钟自动采集一轮用百度首页做连通性校验,池子里稳定维持200个可用IP爬虫成功率从40%拉到92% - UC建站系统

代理验证通过了但目标站访问不了

proxy_pool默认用百度首页做验证目标,但你的爬虫目标站可能有自己的IP黑名单。一个代理对百度可用不等于对你的目标站也可用。解法是把验证URL从百度换成你的目标站首页,或者至少换成同类型的网站。自写脚本的话直接把 TEST_URL 改掉就行。

透明代理暴露真实IP

免费代理里有大量透明代理(Transparent Proxy),它们会在HTTP头里附加你的真实IP(X-Forwarded-For 或 X-Real-IP)。目标站如果检查这些头部,你用了代理等于没用。proxy_pool默认只收集匿名和高匿代理,但如果自己写采集脚本,记得过滤掉透明代理——验证阶段除了检查连通性,还要检查返回的HTTP头里有没有泄露真实IP。

最后梳理一下

代理IP池这件事,核心不是"有没有代理",而是"代理够不够稳、切换够不够快":

  • 预算零、中小规模采集 → proxy_pool Docker一键部署,10+免费源每20分钟自动采集,池子稳在200+可用IP,配好请求重试逻辑后成功率能拉到90%+
  • 有开发能力、要完全自控 → 200行Python自写采集+验证+API,验证目标改成自己的目标站,比用百度验证更精准
  • 商业项目、对可用率有要求 → 快代理或站大爷的隧道代理,API提取一行代码接入,可用率99%+,零运维
  • 跨境电商/社媒矩阵 → 住宅代理(IPIPGO等),真实家庭IP,风控识别率最低,但成本也最高

说穿了,代理池的质量取决于两个环节:采集源的多样性和验证的时效性。源越多越不容易断粮,验证越频繁越能及时踢掉失效的。proxy_pool之所以成为开源首选,就是因为它把这两个环节都自动化了——你只需要 Docker run 一下,剩下的采集、验证、轮检、API全自动跑。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录