咱们在用Python的requests库做数据采集的时候,经常会遇到请求发着发着就卡壳了,返回个403或者干脆超时。这通常是因为目标网站的风控系统察觉到了咱们的请求频率,把当前的出口IP给限制了。要解决这个问题,最直接的办法就是搭建一个代理IP池,让每次请求都通过不同的IP发出去。今天就来手把手教大家怎么用requests配搭代理IP池,代码可以直接拿去跑。
代理IP池的核心逻辑是什么
说白了,代理IP池就像是一个装满IP地址的“蓄水池”。咱们每次发起请求前,从池子里捞一个IP出来用。如果这个IP好用,请求成功了,那皆大欢喜;如果请求失败了,说明这个IP可能已经被目标网站拉黑了,或者本身网络不通,这时候咱们就把它从池子里踢出去,换下一个继续试。
整个流程其实就是一个“提取-使用-检验-淘汰”的闭环。把这个逻辑写进代码里,你的采集程序就能长时间稳定运行了。
requests设置代理的基础写法
在requests里用代理其实特别简单,只需要在请求参数里加上一个proxies字典就行。不管是HTTP还是HTTPS,都可以按照下面的格式来写:
import requests
代理IP的格式一般是 ip:端口
proxy_ip = "123.123.123.123:8888"
proxies = {
"http": f"http://{proxy_ip}",
"https": f"http://{proxy_ip}"
}
发起请求
try:
resp = requests.get("https://www.example.com", proxies=proxies, timeout=5)
print(resp.status_code)
except Exception as e:
print(f"请求出错了:{e}")
这只是一个最基础的示例,实际跑业务的时候,咱们肯定不能手动一个个去填IP,得让程序自动去取IP、自动重试。
构建完整的代理IP池调用代码
下面这套代码是一个比较完整的代理IP池使用套路。咱们通过一个类来管理IP列表,包含获取IP、发起请求、异常处理和剔除失效IP的功能。大家可以直接拿去改改就能用。
import requests
import random
import time
class ProxyPool:
def __init__(self, proxy_list):
初始化IP池,传入一个IP列表
self.proxy_list = proxy_list
def get_random_proxy(self):
随机从池子里取一个IP
if not self.proxy_list:
return None
return random.choice(self.proxy_list)
def remove_proxy(self, proxy):
请求失败时,把有问题的IP踢出池子
if proxy in self.proxy_list:
self.proxy_list.remove(proxy)
print(f"已剔除失效IP: {proxy},当前剩余IP数: {len(self.proxy_list)}")
def request_with_proxy(self, url, retry_times=3):
带重试机制的请求方法
for i in range(retry_times):
proxy = self.get_random_proxy()
if not proxy:
print("IP池已空,请补充新的代理IP!")
return None
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}"
}
try:
print(f"正在使用IP {proxy} 发起第 {i+1} 次请求...")
resp = requests.get(url, proxies=proxies, timeout=8)
if resp.status_code == 200:
print("请求成功!")
return resp
else:
print(f"状态码异常: {resp.status_code},换一个IP重试")
self.remove_proxy(proxy)
except Exception as e:
print(f"请求报错: {e},这个IP可能不通")
self.remove_proxy(proxy)
time.sleep(1) 休息一下再试
print(f"重试 {retry_times} 次后仍然失败,放弃该URL请求")
return None
====== 使用示例 ======
if __name__ == "__main__":
假设这是你从服务商API提取到的IP列表
my_proxies = [
"111.111.111.111:8080",
"222.222.222.222:8080",
"333.333.333.333:8080"
]
pool = ProxyPool(my_proxies)
target_url = "https://www.example.com"
result = pool.request_with_proxy(target_url)
if result:
print(result.text[:100])
这套代码的核心在于异常捕获和自动剔除机制。遇到超时或者状态码不对,立刻把这个IP干掉,换池子里的下一个。这样就能保证咱们的业务一直有新鲜的IP可用。
如何获取高质量的代理IP资源
代码写得再好,如果池子里装的都是些一用就废的劣质IP,那也是白搭。找一个靠谱的代理IP服务商是重中之重。这里给大家推荐一下咱们自家的神龙HTTP。
神龙HTTP是国内三大运营商正规授权的服务商,手里握着超3000万+的代理资源储备,每个IP都经过严格筛选,可用率能达到99.9%。不管你是做数据抓取、市场研究还是AI大模型训练,它都能提供稳定可靠的代理服务。
为了满足不同场景的需求,神龙HTTP提供了几种不同的套餐,大家可以按需选择:
| 套餐类型 | 特点 | 适用场景 |
|---|---|---|
| 短效动态IP池 | 存活时间短(3-30分钟可定制),每日更新去重,低延迟、高并发 | 适合需要高频次请求、大规模数据采集的个人或企业 |
| 长效静态IP池 | 存活时间较长(1-24小时可定制),每日去重10万+,IP纯净度高,支持指定省市 | 适合需要保持会话、对IP稳定性有一定要求的业务 |
| 固定IP池 | 基于高性能云主机构建,源自ISP正式分配,按个数售卖,很高稳定性 | 适合IP需求量不大,但追求很高稳定性和数据安全传输的场景 |
神龙HTTP的API接口兼容各种主流编程语言,集成起来非常方便。而且个人中心有可视化的数据统计,能直观看到IP的使用情况和趋势,遇到问题随时有724小时的技术团队帮忙解答,用起来很省心。
常见问题QA
Q1:为什么我用代理IP请求,有时候还是会报错超时?
A:这种情况大概率是遇到了网络波动或者目标网站的临时限流。代理IP本身没问题,但网络链路有时候会抽风。解决办法就是在代码里加上重试机制,就像上面代码里写的那样,超时了就换一个IP再试一次,一般重试两三次就能通。
Q2:短效IP和长效IP在requests里用起来有区别吗?
A:在requests代码写法上没有任何区别,都是填到proxies字典里。区别在于业务逻辑:短效IP适合配合IP池不断轮换使用,适合高频采集;长效IP存活时间长,适合需要登录保持状态的场景。神龙HTTP支持灵活的计费方式,大家可以根据自己的业务特点来选择合适的套餐。


