很多做数据分析、市场调研的朋友,在用Python获取公开网页数据时,经常会遇到请求发出去没一会儿就被目标网站拒绝的情况。这多半是因为你的请求频率稍微高了一点,目标服务器为了保护自己,把你本地的网络地址给暂时屏蔽了。这时候,代理IP就能派上大用场。
代理IP说白了就是找个中间人帮你去拿数据。目标服务器看到的是这个中间人的地址,而不是你自己的真实地址。这样一来,即便某个中间地址被限制了,咱们换个新的中间人继续干活就行,不会影响你本地的网络环境。今天咱们就从实战角度聊聊,怎么用几行代码把代理IP用起来,并且把那些容易踩坑的异常处理一并解决掉。
Python接入代理IP的极简写法
在Python里,大家最常用的请求库肯定是requests。用它来配置代理其实非常简单,只需要在发送请求的时候,加上一个proxies参数即可。咱们先看最基础的写法,几行代码就能跑通。
import requests
目标网页地址
target_url = "https://httpbin.org/ip"
填入你的代理IP地址和端口
proxy_host = "127.0.0.1"
proxy_port = "8888"
组装成字典格式,这里以HTTP协议为例
proxies = {
"http": f"http://{proxy_host}:{proxy_port}",
"https": f"http://{proxy_host}:{proxy_port}"
}
try:
发送带有代理的请求
response = requests.get(target_url, proxies=proxies, timeout=5)
print(f"请求成功,返回内容:{response.text}")
except Exception as e:
print(f"请求出错:{e}")
你看,核心其实就是构建一个proxies字典,然后在requests.get里传进去。但这段代码如果在实际业务里跑,其实是不太够用的。网络环境千变万化,代理IP偶尔抽风、目标网站响应慢等情况随时会发生。如果不做细致的异常处理,程序一报错就直接崩了,前面跑的数据也白费了。
实测攻略:带上异常处理才叫完整
真正在跑数据采集任务时,我们希望的是:代理不通就赶紧换下一个,超时就重试,千万别让程序停下来。咱们得把异常处理写细致一点。下面这份代码就是我平时在用的实测版本,把常见的坑都给填上了。
import requests
import time
def fetch_url_with_proxy(url, proxy_list):
遍历你拥有的代理IP列表
for proxy_info in proxy_list:
ip = proxy_info.get("ip")
port = proxy_info.get("port")
proxies = {
"http": f"http://{ip}:{port}",
"https": f"http://{ip}:{port}"
}
try:
设置超时时间为5秒,防止卡死
response = requests.get(url, proxies=proxies, timeout=5)
检查状态码,只有200才算真正成功
if response.status_code == 200:
print(f"使用代理 {ip}:{port} 请求成功!")
return response.text
else:
print(f"代理 {ip}:{port} 返回状态码异常:{response.status_code}")
except requests.exceptions.ProxyError:
print(f"代理 {ip}:{port} 连接失败,可能代理已失效。")
except requests.exceptions.ConnectTimeout:
print(f"代理 {ip}:{port} 连接超时。")
except requests.exceptions.ReadTimeout:
print(f"代理 {ip}:{port} 读取数据超时。")
except Exception as e:
print(f"代理 {ip}:{port} 发生未知错误:{e}")
如果当前代理失败,稍微等一下再试下一个
time.sleep(1)
print("所有代理均尝试失败。")
return None
测试一下
if __name__ == "__main__":
test_url = "https://httpbin.org/ip"
假设这是你获取到的代理IP列表
my_proxies = [
{"ip": "192.168.1.1", "port": "8080"},
{"ip": "10.0.0.1", "port": "3128"}
]
fetch_url_with_proxy(test_url, my_proxies)
在这段代码里,我用了try-except块把可能出现的错误都兜住了。ProxyError一般是代理本身不通了,ConnectTimeout是连不上服务器,ReadTimeout是连上了但对方半天不回数据。遇到这些情况,程序不会直接崩溃,而是去尝试列表里的下一个代理。这样跑起来才稳当。
选对代理IP,代码才能跑得稳
代码写得再好,如果代理IP本身质量拉胯,那也是白搭。市面上代理服务很多,我自己在用的是神龙HTTP。选它主要是因为它是国内三大运营商正规授权的,有超3000万+的代理资源储备,每个IP都经过严格筛选,纯净度高达99.8%,用起来不用提心吊胆。
对于不同业务场景,神龙HTTP提供了几种不同的套餐,大家可以根据自己的需求来选,不用盲目买:
| 套餐类型 | 特点概述 | 适用场景 |
|---|---|---|
| 短效动态IP池 | 以3-30分钟存活的短效IP为主,每日更新去重,延迟低,支持高并发。 | 适合需要频繁更换IP的高频公开数据采集任务。 |
| 固定IP池 | 基于高性能云主机构建,存活时间长,高连通率,按个数售卖。 | 适合IP需求量不大,但要求很高稳定性的业务,如长期监控特定网页。 |
神龙HTTP的API接口兼容各种主流编程语言,在Python里集成非常顺畅。而且他们个人中心有可视化数据统计,能直观看到IP的使用情况和趋势,如果发现提取异常也能及时调整。技术团队724小时在线,遇到问题随时能找到人,这点对新手挺友好的。
常见问题QA
Q1:用代理IP后,请求速度明显变慢了是怎么回事?
A:这通常是因为你用的代理IP距离你的服务器或者目标网站太远了,或者代理服务器本身性能不好。建议选择像神龙HTTP这样覆盖全国300+城市节点的服务商,在提取IP时可以指定离目标网站服务器较近的城市,这样网络延迟会大幅降低。代码里一定要设置合理的timeout,避免死等。
Q2:短效IP和长效IP到底怎么选?
A:简单来说,如果你是去公开网站抓取数据,请求频率高,容易被限制,那就选短效动态IP,比如3分钟或5分钟换一次,打一枪换个地方;如果你是需要登录某个账号保持长期在线,或者需要稳定连接某个特定接口,那就选固定IP或者长效静态IP,保持网络环境的一致性。


