python使用ip代理爬虫再也不怕被拦,保姆级教程请收好

说句大实话,写爬虫写到一半突然返回403或者一片空白,那种感觉真的挺搞心态的。你代码逻辑明明没问题,本地跑得好好的,一上量就开始被目标站点”请”出去。折腾了大半天,最后发现根本不是你代码写得烂,而是你的真实IP暴露了,对方风控系统直接把你标记了。
今天这篇就专门聊一件事:怎么用Python配合代理IP,让你的爬虫稳定跑起来,不再动不动就被拦。不整那些虚的,直接上思路、上代码、上选型建议,看完就能用。
先搞清楚,你的爬虫到底为啥被拦
很多人一上来就怪requests库不行,怪headers没设对,其实大部分情况不是这些。目标站点的反爬机制,核心就盯几个东西:
第一,IP访问频率。你同一个IP一分钟内请求了200次,人家后台一看,这肯定不是正常用户行为,直接给你封了。第二,IP的”干净程度”。如果你的IP之前被别的爬虫用过,在对方黑名单里挂着,你第一次请求就会被拒。第三,请求模式太规律。固定间隔、固定路径、固定UA,跟机器人没区别。
所以你看,问题根源基本都指向同一个东西——你用的那个IP。要么它太”脏”了,要么你把它用得太狠了。解决思路也很直接:别用你自己的IP去干这事,换一批干净的、用完就扔的IP。
代理IP是啥?为啥能救你的爬虫
简单讲,代理IP就是你在目标网站和你自己的电脑之间加了一层”中间人”。你的请求先发到代理服务器,代理服务器用自己的IP去访问目标网站,拿到数据再传回给你。目标网站看到的永远是代理IP,根本不知道背后是谁在请求。
这里有个关键区别要搞清楚:动态代理和静态代理。动态代理就是IP池子里的IP会定期更换,你每次请求可能走的是不同的出口IP,天然就规避了”同一IP高频访问”的问题。静态代理则是一个IP长期固定,适合那种需要”看起来像同一个人持续在线”的场景。
对于大多数数据采集、价格监控、内容聚合这类需求,短效动态代理是最对路的。IP存活几分钟就自动更换,你根本来不及被风控盯上,它已经”消失”了。
上代码,Python + 代理IP 实战
下面这段代码是最基础的用法,用requests库配合代理IP发请求。我直接写一个能跑的版本,你改改目标URL就能用:
import requests
import random
import time
# 代理IP配置(以网帆代理短效动态代理为例)
格式:http://用户名:密码@代理地址:端口
proxy = "http://user_abc123:[email protected]:8080"
proxies = {
"http": proxy,
"https": proxy
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
def fetch_page(url, retry=3):
"""带代理的页面抓取,失败自动重试"""
for i in range(retry):
try:
resp = requests.get(
url,
proxies=proxies,
headers=headers,
timeout=10
)
if resp.status_code == 200:
return resp.text
else:
print(f"第{i+1}次请求返回 {resp.status_code},准备重试...")
except requests.exceptions.ProxyError:
print(f"第{i+1}次代理连接失败,准备重试...")
except requests.exceptions.Timeout:
print(f"第{i+1}次请求超时,准备重试...")
time.sleep(random.uniform(1, 3))
return None
# 实际调用
html = fetch_page("https://example.com/page1")
if html:
print(f"成功获取页面,长度:{len(html)} 字符")
else:
print("多次重试后仍失败,检查代理配置")
几个细节说一下:
timeout一定要设。代理链路多了一跳,网络波动比直连大,不设超时的话一个卡住的请求能把你整个线程堵死。10秒是个比较稳妥的值。
重试间隔加随机数。别写死sleep(2),用random.uniform(1,3)让间隔有波动,更像真人操作节奏。
代理地址的格式别搞错。HTTP代理是http://user:pass@host:port,如果你用的是SOCKS5协议,格式变成socks5://user:pass@host:port,而且需要额外装一个库:pip install requests[socks]。
代理IP怎么选不踩坑
市面上代理IP服务商不少,但质量参差不齐。我见过有人用了某家的代理,跑了两百个请求就开始大面积超时,一问客服说”IP池在维护”,维护了三天。这种体验真的很影响开发进度。
选代理IP,我一般看这几个硬指标:
| 关注点 | 为什么重要 | 怎么判断 |
|---|---|---|
| IP纯净度 | 决定你第一次请求会不会直接被拒 | 问清楚IP来源,运营商直供的最稳 |
| 存活时长 | 太短不够用,太长容易被风控标记 | 看是否支持自定义,3-15分钟最灵活 |
| 延迟 | 直接影响你的采集效率 | 平均延迟在0.05秒以内算优秀 |
| 并发能力 | 多线程跑的时候会不会卡 | 问清楚有没有并发上限 |
| 计费透明度 | 避免用着用着发现多扣了钱 | 看是否明码标价,有没有隐形费用 |
我自己现在用的是网帆代理的短效动态代理,说下实际体验。它家IP是三大运营商合规线路直供的,纯净度标称99.8%,我实际跑下来确实很少遇到”第一次请求就被拒”的情况。IP池子有3000万+的储备量,覆盖全国300多个省市,地域筛选很细,能精确到市级。
比较让我省心的一点是存活时长可以自定义,3分钟、5分钟、10分钟、15分钟、30分钟都有标准档位,也支持1到30分钟之间自由设定。我一般做价格监控用5分钟的,做内容采集用10分钟的,按业务节奏调就行,不用迁就固定档位。
另外它家没有并发上限,单秒请求量不设卡,平均延迟在0.03秒左右。我跑过单线程每秒发50个请求的测试,基本没有明显卡顿。计费方面是包量和包月两种模式,包量最低到0.0023元一个IP,大额还有赠送;包月长期用最低4.5折。没有那种”看着便宜用着用着加钱”的套路。
如果你是刚开始接触代理IP,他们注册就送最高2000个免费测试IP,够你跑通整个流程、验证代码逻辑了,不用一上来就花钱。
几个我踩过的坑,你直接跳过
坑一:一个代理IP用到底。 很多人拿到一个代理地址就写死在代码里,跑一整天。短效动态代理的IP是有存活周期的,到期就失效了,你还在那儿傻等超时。正确做法是写一个IP获取函数,每次请求前(或者每隔N次请求后)重新拉一个新IP。网帆代理的API支持毫秒级获取新IP,没有提取冷却间隔,这个操作成本很低。
坑二:所有请求共用一个headers。 你UA写死一个,Accept-Language写死一个,跑一万次请求全是同一个”指纹”,风控系统一比对就知道是机器。建议准备5-10组headers随机轮换,至少把User-Agent和Accept-Language做随机化。
坑三:忽略HTTPS的代理配置。 如果你的目标站点是HTTPS的,proxies字典里必须同时写”http”和”https”两个key,只写http的话HTTPS请求根本不走代理,等于白配。
坑四:不监控代理状态。 代理IP不是永动机,偶尔会有个别IP质量下降或者临时不可用。生产环境里建议加一个简单的健康检查,连续3次请求同一个IP失败就标记为不可用,下次跳过。
常见问题
Q1:我代码里用多线程,代理IP怎么分配比较合理?
每个线程独立维护自己的代理IP就行,不用全局共享一个。线程A用IP-1,线程B用IP-2,互不干扰。如果线程数比较多(比如20个以上),建议用队列的方式管理IP池,线程用完一个IP就归还,再取新的。网帆代理没有并发上限,所以线程数不用刻意压着,但建议根据目标站点的承受能力来定,别一上来就开100个线程怼人家。
Q2:代理IP的存活时间设多长比较合适?
没有标准答案,取决于你的业务节奏。如果你的任务是”打开一个页面、抓完就走”,3-5分钟完全够用,IP还没被标记就换下一个了。如果是那种需要连续访问同一个站点多个页面的场景(比如翻页采集),建议设10-15分钟,保证一个IP能撑完一组页面的抓取。我个人的经验是:宁短勿长,IP存活时间越短,被风控系统”记住”的概率越低。
Q3:用了代理IP还是被拦了,怎么排查?
按这个顺序查:先确认代理IP本身能不能正常访问目标站点(用curl直接测一下);再检查你的请求频率是不是太高了,哪怕换了IP,如果同一秒内从不同IP同时打过来,有些高级风控也能识别出关联;最后看看你的请求头、Cookie、TLS指纹这些有没有异常。如果以上都排除了,大概率是目标站点的风控策略比较严格,这时候可以考虑降低请求频率,或者换用存活时间更长的代理IP,让访问模式更”像人”一些。
Q4:短效动态代理和长效动态代理,我到底该选哪个?
看你的业务需不需要”同一个IP持续在线”。如果你的场景是:每次请求都是独立的、不需要保持会话状态、追求IP新鲜度——选短效动态代理,几分钟换一个,最安全。如果你的场景是:需要模拟一个用户持续在线一段时间(比如一个采集任务要跑两小时,期间不能断)、或者目标站点会校验IP一致性——那选长效动态代理更合适,IP可以存活1到24小时,链路稳定不掉线。两者不冲突,实际项目中也可以混着用。
