Python 爬虫代理设置指南(2024 最新版)
爬虫最头疼的事莫过于 IP 被秒封、目标站限制地区访问。别急,这篇攻略带你一次性搞懂 urllib、requests、httpx、Playwright 的代理配置方法,涵盖 HTTP/HTTPS(含认证)和 SOCKS5,代码拿来就能用。
1. 准备工作:开始前必知的 5 件事
配置代理前先花一分钟看完这 5 点,能省下大量排查时间。
-
弄清单 IP 格式
代理的通用写法是 IP:端口,比如本地工具 Clash 的默认 HTTP 代理通常为 127.0.0.1:7890,SOCKS5 为 127.0.0.1:7891。别搞混。
-
找可用的代理
- 练手测试:可以去 快代理免费区,但速度慢、存活短。
- 生产环境:考虑阿布云、站大爷、Oxylabs 等付费服务,按流量或时长购买,稳定性和成功率远高于免费。
-
搞清楚协议类型
不是所有 HTTP 代理都能转发 HTTPS 流量。如果目标站是 HTTPS,一定要选支持 HTTPS 的代理,或者直接用全协议代理(HTTP/HTTPS/SOCKS5)。
-
认证信息要处理特殊字符
用户名或密码里如果包含 @、# 等符号,必须进行 URL 编码(例如 @ 写成 %40),否则代理地址会解析错。
-
配完立刻验证
所有代码示例最后都用 http://httpbin.org/get 测试,查看返回 JSON 里的 "origin" 字段是不是代理 IP。这一步千万别省。
2. urllib:Python 原生库也能玩代理
urllib 是 Python 自带的请求库,虽然平时用得少,但在追求零依赖或老旧项目里仍有出场机会。
基本 HTTP/HTTPS 代理
用 ProxyHandler 创建代理处理器,再通过 build_opener 拿到一个自定义的 opener,后续就用它替代默认的 urlopen。
from urllib.request import ProxyHandler, build_opener
proxy_addr = "127.0.0.1:7890"
# 注意:字典的 key 必须写 "http" 和 "https"
proxy_config = {
"http": f"http://{proxy_addr}",
"https": f"http://{proxy_addr}"
}
opener = build_opener(ProxyHandler(proxy_config))
with opener.open("http://httpbin.org/get") as resp:
print(resp.read().decode("utf-8"))
带认证的代理
直接把用户名密码拼进地址里:username:password@ip:port。特殊字符记得编码。
username = "your_user"
password = "your_pwd"
proxy_addr = f"{username}:{password}@127.0.0.1:7890"
# 后续代码同上
SOCKS5 代理
urllib 本身不支持 SOCKS,需借助第三方库 PySocks 修改底层 socket。
import socks
import socket
from urllib.request import urlopen
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 7891)
socket.socket = socks.socksocket
with urlopen("http://httpbin.org/get") as resp:
print(resp.read().decode("utf-8"))
3. requests:最流行的库,配置超简单
requests 的代理设置比 urllib 简洁得多,所有请求方法都通过 proxies 参数传递。
基本 HTTP/HTTPS 代理
import requests
proxy_addr = "127.0.0.1:7890"
proxies = {
"http": f"http://{proxy_addr}",
"https": f"http://{proxy_addr}"
}
resp = requests.get("http://httpbin.org/get", proxies=proxies)
print(resp.text)
带认证的代理
同样,在地址里加上用户名密码即可。
proxy_addr = "your_user:your_pwd@127.0.0.1:7890"
# proxies 配置不变
SOCKS5 代理
安装 requests 的 socks 扩展就能直接支持。
pip install requests[socks]
import requests
proxies = {
"http": "socks5://127.0.0.1:7891",
"https": "socks5://127.0.0.1:7891"
}
resp = requests.get("http://httpbin.org/get", proxies=proxies)
print(resp.text)
4. httpx:新时代的异步利器
httpx 支持 HTTP/2 和原生异步,在高并发爬虫中越来越受欢迎。代理配置的 key 要用完整前缀(http://、https://),方便为不同域名分配不同代理。
基本 HTTP/HTTPS 代理(同步)
import httpx
proxy = "http://127.0.0.1:7890"
proxies = {
"http://": proxy,
"https://": proxy
}
with httpx.Client(proxies=proxies) as client:
resp = client.get("http://httpbin.org/get")
print(resp.text)
SOCKS5 代理(同步 & 异步)
先安装专注 SOCKS 的扩展库:
同步用法
import httpx
from httpx_socks import SyncProxyTransport
transport = SyncProxyTransport.from_url("socks5://127.0.0.1:7891")
with httpx.Client(transport=transport) as client:
resp = client.get("http://httpbin.org/get")
print(resp.text)
异步用法
import httpx
import asyncio
from httpx_socks import AsyncProxyTransport
async def check():
transport = AsyncProxyTransport.from_url("socks5://127.0.0.1:7891")
async with httpx.AsyncClient(transport=transport) as client:
resp = await client.get("http://httpbin.org/get")
print(resp.text)
asyncio.run(check())
5. 自动化工具(Selenium / Playwright)
遇到动态渲染的页面,就需要模拟浏览器。Playwright 是目前的首选,配置直观,对动态内容支持极好。Selenium 的配置思路类似,可参考对应 Driver 的 add_argument 加上 --proxy-server。
Playwright 代理配置
代理信息直接写在 launch() 的 proxy 参数中,支持 HTTP/HTTPS/SOCKS5,认证也自带字段。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "socks5://127.0.0.1:7891", # 也支持 http:// 或 https://
# "username": "your_user", # 如需认证,取消注释
# "password": "your_pwd"
},
headless=False # 调试时可设为 False 查看浏览器界面
)
page = browser.new_page()
page.goto("http://httpbin.org/get")
print(page.content())
browser.close()
6. 避坑 & 最佳实践
-
免费代理不要用于生产
免费 IP 存活短、速度慢,极易被目标站识别并封禁,只适合临时测试。
-
优先选择全协议代理
明确标注支持 HTTP/HTTPS/SOCKS5 的代理,能减少配置出错,也方便代码复用。
-
高并发场景使用代理池
别用单一 IP 硬怼,推荐 proxy_pool 等开源项目搭建自动 IP 调度。
-
敏感信息别硬编码
认证用户名密码不要直接写在代码里,改用环境变量或配置文件读取,保护账号安全。
-
定期轮换并验证
生产脚本应定时(如每 5 分钟)检查代理池中的 IP 可用性,剔除已失效的节点。
7. 完整示例代码
以上所有库的完整运行示例,包括代理池管理、环境变量读取与批量验证,已整理在 GitHub 仓库中,欢迎取用:
👉 Python3WebSpider/ProxyTest