惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩...
一名程序媛呀 · 2026-06-11 · via 博客园_首页

摘要: 写爬虫或调用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 是关键!

💡 最后再唠几句

代理不是一个“加上就行”的开关,而是一整套容错策略。
把代理池健康检查、自动退场、随机轮换这三个原则刻进心里,你的爬虫或请求框架才能真正扛得住量。

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


如果今天的内容对你有帮助,不妨 点个赞,加个关注 再走,也欢迎把这篇发给同样和代理斗智斗勇的伙伴。
担心下次找不到的话,直接收藏起来,代码该抄就抄,咱不客气 😄