Python 爬虫代理设置指南(2024 最新版)

爬虫最头疼的事莫过于 IP 被秒封、目标站限制地区访问。别急,这篇攻略带你一次性搞懂 urllib、requests、httpx、Playwright 的代理配置方法,涵盖 HTTP/HTTPS(含认证)和 SOCKS5,代码拿来就能用。


1. 准备工作:开始前必知的 5 件事

配置代理前先花一分钟看完这 5 点,能省下大量排查时间。

  1. 弄清单 IP 格式
    代理的通用写法是 IP:端口,比如本地工具 Clash 的默认 HTTP 代理通常为 127.0.0.1:7890,SOCKS5 为 127.0.0.1:7891。别搞混。

  2. 找可用的代理

    • 练手测试:可以去 快代理免费区,但速度慢、存活短。
    • 生产环境:考虑阿布云、站大爷、Oxylabs 等付费服务,按流量或时长购买,稳定性和成功率远高于免费。
  3. 搞清楚协议类型
    不是所有 HTTP 代理都能转发 HTTPS 流量。如果目标站是 HTTPS,一定要选支持 HTTPS 的代理,或者直接用全协议代理(HTTP/HTTPS/SOCKS5)。

  4. 认证信息要处理特殊字符
    用户名或密码里如果包含 @# 等符号,必须进行 URL 编码(例如 @ 写成 %40),否则代理地址会解析错。

  5. 配完立刻验证
    所有代码示例最后都用 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。

pip install PySocks
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 的扩展库:

pip install httpx-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