首页 > 基础资料 博客日记
写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了
2026-06-11 10:00:05基础资料围观1次
摘要: 写爬虫或调用API时,IP被封是家常便饭。很多人以为加上代理就万事大吉,结果反而更慢、报错更多。
这篇文章从实战出发,一次性讲透http、https、socks代理的区别和用法,教你如何高效遍历代理列表,并扒开那些官方文档不会告诉你的常见坑。
读完你会知道,代理用不好,比不用还危险。
😫 你是不是也遇到过这种糟心事儿?
辛辛苦苦写了个爬虫,本地跑得飞起,一上量就“咔咔”报超时。赶紧找免费代理换上,结果请求要么慢得像蜗牛,要么直接返回一堆 ProxyError,心态原地爆炸。
其实,代理的配置远不止往 proxies 参数里塞个字典那么简单。今天咱们就把这事儿彻底聊透。
👩💻我是爱折腾的一名程序媛,喜欢研究全栈开发的各种实践,热爱分享踩坑后的收获与思考,也享受用代码写出各种实用小工具解决问题的快乐。
如果你也在技术这条路上向前走,关注我,愿我们能彼此陪伴,一起成为更好的自己 🌱
🎯 这篇文章能帮你解决什么?
带你分清楚 http、https 和 socks 代理分别该填在哪儿,什么时候用。
更重要的是,给你一套能直接用的遍历代理列表防封策略,并避开那些一踩一个准的坑。
🗺️ 主要内容脉络
🔹 代理的“双通道”到底怎么回事
🔹 http、https、socks 代理实战案例
🔹 如何遍历代理列表才真正有效
🔹 血泪换来的常见问题与解决方案
🔍 代理的双通道,九成人一开始都搞混
你向 http://example.com 发请求时,可以走 HTTP 代理;
向 https://example.com 发请求时,可以走 HTTPS 代理。
但 requests 库里的写法容易让人恍惚。
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080',
}
看到没,https 这个键对应的值依然以 http:// 开头。
要注意,这里填的是代理服务本身的协议,不是你要请求的目标网站协议。
你的代理服务器是 HTTP 服务,无论转发的是 HTTP 还是 HTTPS 流量,都要写 http://。
不过,如果你用的是支持 HTTPS 的加密代理,就可以填 https://,这样你和代理之间的连接也会被加密,多一层保护。
⚙️ 三种代理,怎么用才对?
🔹 HTTP 代理
最基础,只转发 HTTP 请求。适合爬取纯 HTTP 站点,或者内网穿透。
import requests
proxies = {
'http': 'http://user:pass@proxy_ip:port',
}
resp = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
print(resp.text)
🔹 HTTPS 代理
你可能会问,刚才不是说 https 键值可以填 http:// 吗?
是的,但这里如果填 https://,意味着你与代理之间是 TLS 加密隧道,别人抓包也看不到你在请求什么。对安全要求高的场景才用。
proxies = {
'https': 'https://secure_proxy:port',
}
resp = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=10)
🔹 SOCKS 代理
这玩意儿更底层,SOCKS 工作在传输层,它就是个“管道工”,才不管你管道里流的是水(HTTP)还是天然气(FTP)。
SOCKS代理分为两种版本:SOCKS4和SOCKS5。
SOCKS4仅支持TCP协议,而SOCKS5不仅支持TCP,还支持UDP协议,并提供身份验证机制和服务器端域名解析等功能。
Python 想用它,得先装 pip install 'requests[socks]'
proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080',
}
resp = requests.get('https://api.github.com', proxies=proxies, timeout=10)
💡 这里有个我亲自撞过的墙:requests 的 socks 支持不是内置的,忘了装 PySocks 就会抛出 Missing dependencies for SOCKS support,别问我怎么知道的。
🔄 代理列表怎么遍历才高效?
是不是以为直接写个 for 循环,拿一个用,报错就换下一个就完事了?没那么简单。
🔹 先校验可用性
免费代理的死亡率极高,拿来就用只会浪费时间。
用之前先拿一个稳定的网站(比如百度)做一次超短超时的探测,超时 >3 秒直接跳过。
🔹 标记失败次数
每个代理连续失败 3 次就打入“冷宫”,不要无限重试,否则整个程序会被拖死。
🔹 随机轮换,而不是顺序取
顺序取会让目标服务器看到规律,反而容易触发封禁。
用 random.shuffle() 打乱顺序,每次请求前从池子里随机摸一个。
给你看一个我一直在用的骨架:
import random, requests
proxy_pool = [
'http://1.1.1.1:8080',
'socks5://2.2.2.2:1080',
'http://user:pass@3.3.3.3:3128',
]
def get_random_proxy():
return random.choice(proxy_pool)
for url in urls:
for _ in range(3): # 最多换3次代理
proxy = get_random_proxy()
try:
resp = requests.get(
url,
proxies={'http': proxy, 'https': proxy},
timeout=5
)
if resp.status_code == 200:
# 正常处理返回信息
break
except:
continue
else:
print(f'{url} 请求失败,已穷尽代理')
这里有一个很容易翻车的点:千万不要在遍历中把失效代理从列表里 remove,多线程下会引发索引错误。
改成把坏代理丢进一个 set 做黑名单过滤就好。
# 全局黑名单,线程安全起见可以用 set 配合锁,或者直接用 queue
bad_proxies = set()
def get_random_proxy():
# 过滤掉黑名单里的代理
good = [p for p in proxy_pool if p not in bad_proxies]
if not good:
raise Exception("所有代理都已失效")
return random.choice(good)
def mark_bad_proxy(proxy):
bad_proxies.add(proxy) # 只往 set 里加,永远不删原列表
使用时,一旦请求失败就把代理丢进黑名单:
proxy = get_random_proxy()
try:
resp = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=5)
if resp.status_code != 200:
mark_bad_proxy(proxy)
except:
mark_bad_proxy(proxy)
⚠️ 常见踩坑与急救包
🔹 代理配了但感觉没走
检查环境变量 HTTP_PROXY、HTTPS_PROXY 是否被预先设置。
requests 会自动读它们,而且优先级可能比你传入的 proxies 还高。
我的习惯是:直接用 proxies 参数显式传入,并在脚本开头强制 os.environ.pop('HTTP_PROXY', None),干净利落。
🔹 用了代理后 SSL 证书报错
有些中间代理会篡改证书做 HTTPS 检查,客户端就报 SSLError。
开发调试时可以临时设 verify=False,但生产环境一定要找到正确的证书链或换掉流氓代理,千万别把这条带到线上。
🔹 Session 对象要记得挂代理
如果你用 requests.Session() 保持会话,代理也得挂在 session 上:session.proxies.update(proxies),否则后续的请求又会直连,完全白搭。
🔹 SOCKS 代理的 DNS 泄露
用 SOCKS5 时默认可能在本地解析域名,代理那边只看 IP。
如果希望连 DNS 也走代理隧道,需要用 socks5h:// 协议。
细节见 PySocks 文档,这里只敲黑板:h 是关键!
💡 最后再唠几句
代理不是一个“加上就行”的开关,而是一整套容错策略。
把代理池健康检查、自动退场、随机轮换这三个原则刻进心里,你的爬虫或请求框架才能真正扛得住量。
写得再好的代码,也得靠真实流量打磨。希望这篇文章能让你少走几个月弯路。
如果今天的内容对你有帮助,不妨 点个赞,加个关注 再走,也欢迎把这篇发给同样和代理斗智斗勇的伙伴。
担心下次找不到的话,直接收藏起来,代码该抄就抄,咱不客气 😄
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- SAP中FI和MM的核心集成—物料移动自动生成凭证
- 用匿名内部类优雅地计算方法执行时间
- 【征稿】第七届金融科技国际会议(ICFT 2026)
- OpenVINO™ C# API 3.3 全新发布!正式接入 OpenVINO GenAI,C# 本地大模型开发全面启航!
- 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了
- AI-提效模板之--SKILL.md
- Apache Doris全链路性能优化实战指南:从架构设计到生产落地
- AI Native 竞争力:真正稀缺的不是会用 AI,而是把事往前推的人
- [MAF预定义ChatClient中间件-07]PerServiceCallChatHistoryPersistingChatClient——基于ReAct循环的一步一存档
- 做 AI 工具出海一个月,我赚到了 0 美元,但学到了这些

