Python 爬虫代理设置指南(2024 最新版)
爬虫人最懂的「高频痛」:IP 被反爬机制秒封、目标站点仅支持特定地区访问?别慌!这篇 2024 最新整理的主流 Python 爬虫/自动化库全代理配置指南,覆盖 HTTP/HTTPS、带认证、SOCKS5 三种核心场景,搭配可直接运行的高亮代码,3000 字内快速上手!
1. 前置准备:少走弯路的5件事
在复制代码前,先确认这几点能省很多 debug 时间:
- 明确基础概念:代理的标准格式是
<ip>:<port>,本地软件如 Clash、V2Ray 的默认端口通常记一下
- HTTP/HTTPS 代理默认:
127.0.0.1:7890
- SOCKS5 代理默认:
127.0.0.1:7891
- 获取可用代理:
- 协议类型别选错:HTTP 代理不一定能跑 HTTPS 流量,必须明确标注或选全协议代理
- 认证信息要准确:带用户名密码的代理,特殊字符(如
@ #)记得 URL 编码
- 必带验证环节:所有配置后都建议用
http://httpbin.org/get 测试,看返回 JSON 的 origin 字段是否是代理 IP
2. urllib:Python 原生库的基础配置
urllib 是 Python 自带的 HTTP 请求库,虽然日常用得少,但在一些极简/兼容性要求高的场景还是有用的。
基础 HTTP/HTTPS 代理
urllib 需要先构建 ProxyHandler,再用 build_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}"
}
# 生成带代理的请求器
proxy_opener = build_opener(ProxyHandler(proxy_config))
# 发送请求并验证
with proxy_opener.open("http://httpbin.org/get") as resp:
print(resp.read().decode("utf-8"))
带用户名密码的认证代理
认证代理的格式是 username:password@ip:port,直接替换 proxy_config 里的地址即可:
username = "your_test_user"
password = "your_test_pwd"
# 特殊字符需要URL编码,比如password是'abc@123',要改成'abc%40123'
proxy_addr = f"{username}:{password}@127.0.0.1:7890"
SOCKS5 代理
urllib 原生不支持 SOCKS,需要先安装 PySocks 库修改底层 socket:
import socks
import socket
from urllib.request import urlopen
# 设置全局默认SOCKS5代理
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 7891)
# 替换系统socket
socket.socket = socks.socksocket
# 此时可以直接用原生urlopen
with urlopen("http://httpbin.org/get") as resp:
print(resp.read().decode("utf-8"))
3. requests:最常用的第三方库配置
requests 以简洁著称,代理配置也比 urllib 简单得多!
基础 HTTP/HTTPS 代理
直接传 proxies 参数到请求方法就行:
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"
SOCKS5 代理
requests 原生也不支持 SOCKS,但可以通过安装 requests[socks] 扩展一键搞定:
pip install requests[socks]
import requests
# 注意协议前缀要写成'socks5://'
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 和异步的请求库,在高并发爬虫中越来越火,代理配置有自己的小特点。
基础 HTTP/HTTPS 代理
httpx 的 proxies 参数字典的key 是 URL 前缀(带 ://),不是简单的 http/https,这样可以针对不同域名用不同代理:
import httpx
proxy = "http://127.0.0.1:7890"
# 配置所有http/https请求都走这个代理
proxies = {
"http://": proxy,
"https://": proxy
}
# 推荐用上下文管理器管理Client
with httpx.Client(proxies=proxies) as client:
resp = client.get("http://httpbin.org/get")
print(resp.text)
SOCKS5 代理
httpx 需要单独安装 httpx-socks 库,同步和异步要分别用对应的 Transport:
同步模式
import httpx
from httpx_socks import SyncProxyTransport
# 用from_url快速生成同步Transport
transport = SyncProxyTransport.from_url("socks5://127.0.0.1:7891")
# Client中传入transport而不是proxies
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_proxy():
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_proxy())
5. 自动化工具补充(Selenium/Playwright)
爬虫中常遇到动态加载内容的页面,这时候就需要自动化浏览器,这里补充两个主流工具的配置。
Playwright:2024 首选自动化工具
Playwright 比 Selenium 更轻、更稳定、对动态内容支持更好,代理配置直接写在 launch() 方法的 proxy 参数里,还支持单独配置 username/password:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动Chromium时加代理
browser = p.chromium.launch(
proxy={
"server": "socks5://127.0.0.1:7891", # HTTP/HTTPS/SOCKS5都支持
# "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. 避坑&最佳实践
- 免费代理慎用生产:免费代理的存活时间通常只有几分钟到几小时,还容易被目标站点加入黑名单
- 协议匹配优先全兼容:选代理时优先标注「HTTP/HTTPS/SOCKS5 全协议」的,减少配置错误
- 高并发用代理池:如果要爬取大量数据,不要单 IP 硬怼,建议用
proxy_pool 等开源工具管理代理 IP
- 敏感场景加认证:付费代理通常带认证,不要把认证信息直接写在代码里,推荐用环境变量或配置文件读取
- 定期轮换验证:生产环境建议每隔一段时间(比如1分钟)批量验证代理池里的 IP,剔除失效的
7. 完整示例代码
更详细的代理池、环境变量读取、不同库的批量验证代码,见 GitHub 仓库:
Python3WebSpider/ProxyTest