写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了

摘要: 写爬虫或调用API时,IP被封 是家常便饭。很多人以为加上代理就万事大吉,结果反而更慢、报错更多

这篇文章从实战出发,一次性讲透http、https、socks代理的区别和用法,教你如何高效遍历代理列表,并扒开那些官方文档不会告诉你的常见坑。

读完你会知道,代理用不好,比不用还危险。

😫 你是不是也遇到过这种糟心事儿?

辛辛苦苦写了个爬虫,本地跑得飞起,一上量就"咔咔"报超时。赶紧找免费代理换上,结果请求要么慢得像蜗牛,要么直接返回一堆 ProxyError,心态原地爆炸。

其实,代理的配置远不止往 proxies 参数里塞个字典那么简单。今天咱们就把这事儿彻底聊透。
👩‍💻我是爱折腾的一名程序媛 ,喜欢研究全栈开发 的各种实践,热爱分享踩坑后的收获与思考 ,也享受用代码写出各种实用小工具解决问题的快乐。

如果你也在技术这条路上向前走,关注我,愿我们能彼此陪伴,一起成为更好的自己 🌱

🎯 这篇文章能帮你解决什么?

带你分清楚 httphttpssocks 代理分别该填在哪儿,什么时候用。

更重要的是,给你一套能直接用的遍历代理列表防封策略,并避开那些一踩一个准的坑。

🗺️ 主要内容脉络

🔹 代理的"双通道"到底怎么回事

🔹 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代理分为两种版本:SOCKS4SOCKS5

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_PROXYHTTPS_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 是关键!

💡 最后再唠几句

代理不是一个"加上就行"的开关,而是一整套容错策略。

把代理池健康检查、自动退场、随机轮换这三个原则刻进心里,你的爬虫或请求框架才能真正扛得住量。

写得再好的代码,也得靠真实流量打磨。希望这篇文章能让你少走几个月弯路。


如果今天的内容对你有帮助,不妨 点个赞,加个关注 再走,也欢迎把这篇发给同样和代理斗智斗勇的伙伴。

担心下次找不到的话,直接收藏起来,代码该抄就抄,咱不客气 😄

相关推荐
装不满的克莱因瓶1 小时前
掌握多头自注意力机制(Multi-Head Self-Attention)——Transformer 强大表达能力的核心来源
人工智能·python·深度学习·数学·ai·transformer
下班走回家1 小时前
RAG 技术的进化:从朴素检索到 Agentic RAG
开发语言·人工智能·python
用什么都重名1 小时前
Python文本匹配利器:FlashText与RapidFuzz深度对比
python·flash text·rapidfuzz
@Ma1 小时前
Python 实现企业微信外部群主动消息发送及成功接入后如何避坑,避免风控封号
开发语言·python·企业微信
DXM05211 小时前
第10期| 卷积神经网络CNN通俗详解:AI遥感的底层核心
人工智能·python·神经网络·机器学习·arcgis·cnn·文心一言
Hello:CodeWorld1 小时前
AI Agent:从核心原理、架构框架到工程实战,大模型时代的自主智能革命
大数据·人工智能·python·架构
DA02211 小时前
01-Python-数据类型和语法
开发语言·python
装不满的克莱因瓶1 小时前
掌握空间注意力 STN 模型结构——让神经网络学会自动“看准位置”
人工智能·python·深度学习·神经网络·机器学习·ai
AI玫瑰助手1 小时前
Python函数:函数的文档字符串(docstring)编写
android·java·python