写爬虫时用了代理还被封?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 是关键!

💡 最后再唠几句

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

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

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


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

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

相关推荐
SelectDB2 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
牛奶5 小时前
HTTPS你不知道的事
前端·https·浏览器
荣码9 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵20 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li1 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸1 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学1 天前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
喵个咪1 天前
Go-Wind HTTP 服务器从入门到精通
后端·http·go
花酒锄作田2 天前
Pydantic校验配置文件
python
hboot2 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络