IP代理池搭建:零基础搭建IP代理池完整教程(附代码)
为什么你需要一个IP代理池
做爬虫或大量HTTP请求时,单一IP容易被网站封禁。
IP代理池能自动收集、验证、轮换可用代理,让你的请求看起来来自不同地区与设备,大大降低被封风险。
本文适合完全没接触过代理池的新手,全程使用开源工具,不需要额外付费。
搭建前准备:环境与依赖
你需要一台具有公网IP的Linux服务器(CentOS 7/Ubuntu 20.04均可),并确认以下工具已安装:
- Python 3.6+(检查命令
python3 --version) - pip3(检查命令
pip3 --version) - Redis 服务器(用于存储代理IP列表,推荐版本5.0+)
- requests、lxml 两个Python库
安装Redis(以Ubuntu为例)
sudo apt update
sudo apt install redis-server -y
sudo systemctl enable redis
sudo systemctl start redis
# 测试连接
redis-cli ping # 应返回 PONG
安装Python依赖
pip3 install requests lxml redis
代理池核心搭建步骤
1. 编写代理源采集模块
代理IP可以从免费公开网站获取(如快代理、西刺等)。
本例使用 api.proxyscrape.com 作为示例源(接口稳定且无需注册)。
新建文件 proxy_fetcher.py,写入:
import requests
def fetch_proxies():
url = "https://api.proxyscrape.com/v2/?request=displayproxies&protocol=http&timeout=10000&country=all&ssl=all&anonymity=all"
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
proxies = resp.text.strip().split('\r\n')
return [p.strip() for p in proxies if p.strip()]
except Exception as e:
print(f"获取代理失败: {e}")
return []
2. 验证代理可用性
代理池必须剔除失效IP。
这里用 httpbin.org/ip 检测代理是否连通并返回真实IP。
新建 proxy_validator.py:
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
def check_proxy(proxy):
test_url = "http://httpbin.org/ip"
proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}
try:
resp = requests.get(test_url, proxies=proxies, timeout=5)
if resp.status_code == 200:
return proxy
except:
pass
return None
def validate_all(proxy_list, max_workers=20):
valid = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_proxy = {executor.submit(check_proxy, p): p for p in proxy_list}
for future in as_completed(future_to_proxy):
result = future.result()
if result:
valid.append(result)
return valid
3. 落地到Redis并定时更新
创建 proxy_pool.py 作为主程序:
import redis
import time
from proxy_fetcher import fetch_proxies
from proxy_validator import validate_all
# 配置Redis连接(默认本地6379)
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
REDIS_KEY = "proxy_pool"
def update_pool():
print("开始拉取代理...")
raw = fetch_proxies()
print(f"获取到 {len(raw)} 个代理")
valid = validate_all(raw)
print(f"验证通过 {len(valid)} 个")
if valid:
r.delete(REDIS_KEY)
r.sadd(REDIS_KEY, *valid) # 使用Set去重
# 设置过期时间,确保不会残留大量无效IP
r.expire(REDIS_KEY, 1800) # 30分钟后自动清空
return len(valid)
def get_proxy():
return r.srandmember(REDIS_KEY) # 随机取出一个
if __name__ == "__main__":
# 首次更新
count = update_pool()
print(f"代理池初始数量: {count}")
# 每10分钟更新一次
while True:
time.sleep(600)
update_pool()
4. 启动代理池
python3 proxy_pool.py &
程序会后台运行,每10分钟拉取并验证一次代理。
避坑说明:新手最容易犯的五个错误
- 免费代理稳定性差:不要一次只用一个代理,建议配合轮询或重试机制。
- Redis连接超时:确保服务器防火墙放行6379端口,或者使用密码连接。
- 代理去重不彻底:上面用了Redis Set存储,能自动去重。如果换用List需要手动去重。
- 验证目标单一:仅用 httpbin.org 验证可能漏掉一些对被访问网站也有效的代理。建议实际爬取目标网站作为二次验证。
- 更新频率过低:免费代理存活时间短,建议每5-10分钟更新一次。
如何验证代理池是否正常工作
编写测试脚本 test_pool.py:
import requests
from proxy_pool import get_proxy
def test():
proxy = get_proxy()
if not proxy:
print("代理池为空")
return
print(f"使用的代理: {proxy}")
try:
resp = requests.get("http://ip.sb", proxies={"http": f"http://{proxy}"}, timeout=10)
print(f"返回IP: {resp.text.strip()}")
except Exception as e:
print(f"请求失败: {e}")
if __name__ == "__main__":
test()
执行 python3 test_pool.py,如果看到输出中的IP与代理地址一致,说明代理池成功工作。
常见问题解答
Q:没有公网服务器怎么办? 可以用本地虚拟机或云厂商的轻量应用服务器(2核2G够用)。
Q:代理池只有HTTP没有HTTPS支持? 上面的验证模块同时做了HTTPS测试(通过https://httpbin.org/ip),返回的代理都是双协议可用。
Q:如何扩展更多代理源? 在 fetch_proxies 中增加多个来源,合并列表再验证即可。
注意每个源不要请求太频繁。
如果你在搭建IP代理池过程中遇到其他问题,建议先检查Redis状态、网络连通性,再查看代码日志。
实践几次后就能根据自身业务调整IP源和验证逻辑。