一、先搞懂:Python为什么需要代理IP
用Python写爬虫或做数据采集的朋友,几乎都遇到过同一个问题:程序跑着跑着,请求突然全部返回403或者验证码页面。这是因为目标网站检测到同一个IP在短时间内发起了大量请求,直接把你的IP限制掉了。
代理IP的作用,就是在你和目标网站之间加一个"中转站":你的请求先发给代理服务器,由代理服务器代替你去访问目标网站,再把结果原样传回来。这样一来,目标网站看到的是代理服务器的IP,而不是你的真实IP。再配合IP轮换策略,每次请求换一个IP,就能大幅降低被限制的概率。
常见的使用场景包括:电商价格监控、舆情数据采集、内容聚合、接口测试等等。只要是"同一台机器要高频访问同一个目标"的场景,代理IP基本都是刚需。
二、Python设置代理IP的三种常用方法
Python里设置代理IP并不复杂,以最常用的requests库为例,一共有三种主流写法,按需选用即可。
方法一:proxies参数(最常用)
import requests
# 代理格式:用户名:密码@代理地址:端口
proxies = {
"http": "http://用户名:密码@123.45.67.89:8000",
"https": "http://用户名:密码@123.45.67.89:8000"
}
resp = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(resp.json()) # 返回的origin是代理IP,说明设置成功
这种方式只对当前这一次请求生效,灵活性最高,适合不同请求走不同代理的场景。
方法二:环境变量(全局生效)
import os
os.environ["HTTP_PROXY"] = "http://用户名:密码@123.45.67.89:8000"
os.environ["HTTPS_PROXY"] = "http://用户名:密码@123.45.67.89:8000"
import requests
# 不传proxies,requests会自动读取环境变量走代理
resp = requests.get("https://httpbin.org/ip", timeout=10)
print(resp.text)
设置一次,整个进程里的所有请求都默认走代理,适合"整个程序都需要代理"的情况。
方法三:Session会话(批量请求复用)
import requests
session = requests.Session()
session.proxies.update({
"http": "http://用户名:密码@123.45.67.89:8000",
"https": "http://用户名:密码@123.45.67.89:8000"
})
# 后续所有请求自动携带代理配置,还能复用连接和Cookie
for page in range(1, 6):
resp = session.get(f"https://httpbin.org/ip?page={page}", timeout=10)
print(page, resp.status_code)
Session除了复用代理配置,还能复用底层连接,批量采集时速度更快、开销更小,是实际项目里最推荐的方式。
三、2026年怎么挑到稳定的代理IP资源
方法会了,接下来就是资源问题。网上搜"免费代理IP"能找到一堆列表,但免费代理基本不能用:存活时间以分钟计、速度极慢、很多还是透明代理(等于没隐藏),甚至存在被监听的风险。正经项目建议直接用付费服务,成本不高,稳定性天差地别。
挑选时重点看四个维度:
| 对比维度 | 免费代理 | 付费代理(如天启HTTP) |
|---|---|---|
| 稳定性 | 几分钟就失效,成功率极低 | 可用率高,失效IP自动剔除 |
| 匿名度 | 多为透明代理,真实IP可能泄露 | 高匿名,目标站看不到真实IP |
| 速度 | 经常超时卡顿 | 响应快,适合并发采集 |
| 提取方式 | 手动复制,无法自动化 | API批量提取,可接入程序 |
国内服务商里,天启HTTP是比较值得考虑的一家:提供高匿名代理,支持HTTP/HTTPS/SOCKS5等多种协议,可以通过API批量提取IP,直接对接Python程序。具体的产品类型(比如动态短效代理、隧道代理等)、IP池规模和覆盖地区,建议以天启HTTP官网当前公示的信息为准,按自己的采集量级选择合适的方案。
四、完整实战:代理轮换采集示例
下面把前面的知识串起来,写一个带代理轮换 + 失败重试的完整示例,这也是生产环境里最常用的骨架代码:
import requests
import random
import time
def get_proxy_list():
"""从天启HTTP后台生成的API提取链接拉取代理列表"""
api_url = "你的API提取链接" # 在天启HTTP后台创建
resp = requests.get(api_url, timeout=10)
# 返回格式一般为 ip:端口,如需认证则为 用户名:密码@ip:端口
return [line.strip() for line in resp.text.splitlines() if line.strip()]
proxy_list = get_proxy_list()
def crawl(url, max_retry=3):
"""带轮换和重试的采集函数"""
for _ in range(max_retry):
proxy = random.choice(proxy_list)
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}"
}
try:
resp = requests.get(url, proxies=proxies, timeout=10)
if resp.status_code == 200:
return resp.text
except requests.RequestException:
time.sleep(1) # 当前IP失效,稍等后换一个重试
return None
html = crawl("https://httpbin.org/ip")
print(html)
几个实战要点:
1. 控制请求频率:就算有代理,也别一秒打几十个请求,加个time.sleep(random.uniform(1, 3))更稳妥;
2. 及时剔除失效IP:短效代理本身就有生命周期,重试几次仍失败的IP要从列表里移除,再重新提取一批;
3. 配合随机请求头:只换IP不换User-Agent,同样容易被识别,建议搭配随机的UA和Referer使用。
五、新手最容易踩的三个坑
坑一:协议头写错。proxies字典里"http"和"https"两个key都要写对,很多人只写了"http",结果https请求根本没走代理,还以为代理失效了。
坑二:代理过期还在用。短效动态代理存活时间有限,程序里一定要有重试和重新提取的逻辑,别指望一个IP用到天荒地老。
坑三:用免费代理做正经项目。免费代理来路不明,轻则数据采一半全失败,重则账号密码被中间人截获,得不偿失。
常见问题
Q: 怎么验证代理IP设置成功了?
最简单的办法是访问 httpbin.org/ip 这类回显IP的测试地址,如果返回的origin是代理服务器的IP而不是你本机的IP,就说明代理已经生效。
Q: 代理需要账号密码认证,格式怎么写?
写成 http://用户名:密码@地址:端口 即可。如果密码里含有@、:等特殊字符,需要先做URL编码(可以用urllib.parse.quote处理),否则会解析失败。
Q: 免费代理IP到底能不能用?
学习、跑通代码可以凑合用一下,正式项目强烈不建议:不稳定、速度慢、匿名性差,还有安全风险。预算有限的话,天启HTTP这类服务商的入门方案成本也不高,稳定性和安全性完全不是一个量级。
Q: 天启HTTP支持哪些协议?Python能直接用吗?
天启HTTP支持HTTP、HTTPS、SOCKS5等常见协议,Python的requests库原生支持HTTP/HTTPS代理,按本文第二节的方法配置即可;使用SOCKS5协议时需要先执行 pip install requests[socks] 安装依赖。
Q: 代理IP用一会儿就失效怎么办?
这是短效动态代理的正常特性。正确做法是三步配合:通过API定期提取新IP、程序里做好失败重试、及时剔除失效节点,这样采集任务就能持续稳定运行。





