首页 > 基础资料 博客日记

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

2026-06-11 10:00:05基础资料围观1

极客资料网推荐写爬虫时用了代理还被封?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 是关键!

💡 最后再唠几句

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

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


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


文章来源:https://www.cnblogs.com/ymtianyu/p/20437916
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云