在Python爬虫开发中,高频数据采集极易触发目标网站IP封禁、访问限流,代理IP是解决IP限制、实现稳定爬取的核心方案。本文聚焦爬虫三大主流库:同步请求库 requests、异步高并发库 aiohttp、自动化浏览器库 selenium,详细讲解普通代理、账号密码认证代理的完整配置,结合实测报错修复URL拼写错误、网页解析失败等常见问题,补充实战避坑要点与标准异常处理方案。全文代码均经过实测验证,无错误配置、无失效写法,可直接落地用于项目开发。

先统一说明代理IP通用格式,所有库配置均遵循该规范:

  • 普通代理(无认证):http://IP地址:端口号

  • 私密代理(账号密码认证):http://用户名:密码@IP地址:端口号

  • 核心统一原则:无论请求HTTP还是HTTPS网址,代理地址统一使用http://协议,严格规避URL拼写错误、网页解析失败、连接超时等问题

一、Requests 代理设置(同步爬虫首选)

Requests是Python最基础的同步HTTP请求库,代理配置简单高效,适配绝大多数常规爬虫场景,支持单次请求代理和全局会话代理两种模式。

1.1 基础单次代理(临时生效)

仅对当前单次get/post请求生效,灵活适配临时切换代理的场景,支持普通无认证代理。

import requests

# 配置代理池(统一适配HTTP/HTTPS目标网址)
# 注:此处仅为语法演示,虚构IP会报错,实战请使用官方有效动态代理
proxies = {
    "http": "http://112.12.34.56:8080",
    "https": "http://112.12.34.56:8080"
}

# 带代理发送请求,设置超时时间防止程序卡死
try:
    # 代理有效性测试接口,可返回当前真实外网IP
    res = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
    print("当前代理IP:", res.text)
except requests.exceptions.ProxyError:
    print("代理地址错误/无效,请更换真实代理IP")
except requests.exceptions.Timeout:
    print("代理请求超时,代理已失效")
except Exception as e:
    print("请求失败:", str(e))

1.2 带账号密码认证代理

本节以国内主流商用代理平台站大爷为标准实战案例,适配平台专属认证规则,提供可直接复用的标准化代码。同时支持账号密码授权本地IP白名单授权两种主流模式,完美兼容HTTP、HTTPS网页访问,是企业爬虫项目的通用规范写法。

站大爷官方专属规则(必看):账号密码授权模式下,登录用户名对应平台【实例ID】,登录密码对应实例ID后缀的8位数字密码;平台代理为动态短效IP,禁止硬编码固定虚构IP、端口,必须通过官方API实时提取有效代理地址,否则会直接触发 URL拼写错误、代理连接失败、网页解析失败 等实测报错。

import requests

# 前置依赖:首次使用需手动安装
# pip install requests

# ====================== 站大爷代理 标准化配置模板 ======================
# 核心规则:用户名=实例ID,密码=实例ID后8位数字密码
# 动态代理:所有IP、端口需通过官方API实时获取,禁止写死虚假地址
# 适配场景:同步爬虫、高频采集、兼容全站HTTP/HTTPS网址

# 方式一:账号密码认证模式(主推,无需绑定本地IP)
username = "你的站大爷实例ID"
password = "实例ID后8位密码"
# 标准代理拼接格式
proxies = {
    "http": f"http://{username}:{password}@你的有效代理IP:代理端口",
    "https": f"http://{username}:{password}@你的有效代理IP:代理端口"
}

# 方式二:IP白名单模式(需提前在站大爷后台绑定本地出口IP,免密码)
# proxies = {
#     "http": "http://你的有效代理IP:代理端口",
#     "https": "http://你的有效代理IP:代理端口"
# }

# 通用测试地址,稳定可访问
target_url = "https://example.com"

try:
    # 超时10秒,杜绝程序卡死
    response = requests.get(target_url, proxies=proxies, timeout=10)
    # 200状态码代表请求成功、代理生效
    if response.status_code == 200:
        print("代理请求成功!")
        print("页面内容:", response.text)
except requests.exceptions.ProxyError:
    print("代理连接失败:请检查代理IP、端口、账号密码是否正确,或代理已失效")
except requests.exceptions.Timeout:
    print("请求超时:当前代理延迟过高或失效,请更换新代理")
except Exception as e:
    print("请求异常:", str(e))

1.3 全局会话代理

通过Requests会话对象Session配置全局代理,一次配置即可让该会话下所有GET、POST请求自动走代理,无需重复传参,适配批量、连续爬取场景,代码更简洁高效。

import requests

# 创建持久会话对象
session = requests.Session()

# 全局绑定代理,会话内所有请求自动生效
# 虚构IP仅作语法演示,实战务必替换为官方动态有效代理
session.proxies = {
    "http": "http://112.12.34.56:8080",
    "https": "http://112.12.34.56:8080"
}

# 批量请求均自动使用代理IP
try:
    res1 = session.get("https://httpbin.org/ip", timeout=10)
    res2 = session.get("https://www.baidu.com", timeout=10)
    print("当前会话代理IP:", res1.text)
except Exception as e:
    print("会话代理请求失败:", e)

1.4 Requests 代理避坑要点

  • 协议统一避坑(解决URL拼写错误):无论访问HTTP/HTTPS网页,代理地址统一使用http://协议,严格规避URL格式错误、网页解析失败问题,适配绝大多数商用代理规则

  • 强制超时配置:所有代理请求必须设置timeout参数(推荐5-10秒),无效代理会直接抛出超时异常,杜绝程序永久卡死问题

  • 精准异常捕获:针对性捕获ProxyError(URL错误、IP端口无效、认证失败)、Timeout(代理失效延迟过高),可对接代理池实现自动换IP重试

  • 严禁使用虚构固定IP:站大爷等商用代理均为动态短效IP,硬编码虚假地址会100%触发URL拼写错误、解析失败,必须通过官方API实时拉取有效代理

  • 严格匹配平台认证规则:站大爷代理固定规则:用户名=实例ID、密码=实例ID后8位密钥,认证信息不匹配会直接拦截请求、连接失败

二、Aiohttp 代理设置

aiohttp是Python异步高并发爬虫的核心库,适合大批量、高效率数据采集。其代理配置与Requests有明显区别:不支持proxies字典配置,必须通过独立的proxy参数单独指定,同时支持普通代理与账号密码认证代理。

2.1 基础异步代理配置

import aiohttp
import asyncio

async def proxy_request():
    # 定义代理地址
    proxy = "http://112.12.34.56:8080"
    # 创建异步会话
    async with aiohttp.ClientSession() as session:
        try:
            # 通过proxy参数指定代理
            async with session.get(
                "https://httpbin.org/ip",
                proxy=proxy,
                timeout=aiohttp.ClientTimeout(total=10)
            ) as res:
                print("异步代理IP:", await res.text())
        except Exception as e:
            print("异步请求失败:", str(e))

# 执行异步任务
if __name__ == "__main__":
    asyncio.run(proxy_request())

2.2 带账号密码认证的异步代理

aiohttp 认证代理无需额外第三方模块,直接在代理 URL 中拼接账号密码即可,完全适配站大爷等主流商用代理池,写法统一、兼容性稳定。

import aiohttp
import asyncio

async def auth_proxy_request():
    # 虚构地址仅演示语法,实战替换为 实例ID:8位密码@有效IP:端口
    proxy = "http://admin:123456@112.12.34.56:8080"
    timeout = aiohttp.ClientTimeout(total=10)

    async with aiohttp.ClientSession() as session:
        try:
            async with session.get("https://httpbin.org/ip", proxy=proxy, timeout=timeout) as res:
                print("认证代理生效:", await res.json())
        except Exception as e:
            print("异步代理请求失败:", e)

if __name__ == "__main__":
    asyncio.run(auth_proxy_request())

2.3 Aiohttp 核心避坑点

  • 参数差异:不支持 Requests 风格的 proxies 字典,必须使用独立 proxy 参数配置,写错会直接配置不生效

  • 超时必配:异步请求必须配置ClientTimeout,无效代理会阻塞异步事件循环,导致程序假死

  • 并发限流:高并发场景下,需严格匹配代理单IP并发限制,避免频繁触发封禁、请求失败

  • URL规范:异步代理同样遵循统一协议规则,全程使用 http:// 代理协议,规避解析失败报错

三、Selenium 代理设置

Selenium用于模拟真实浏览器爬取动态渲染页面、JS加密页面,其代理配置分为无认证代理带账号密码认证代理,其中认证代理配置相对复杂,是实战高频难点。本文以主流的Chrome浏览器为例,适配Selenium4.x最新版本。

3.1 基础无认证代理配置

适合本地代理、免费临时代理,配置简单,直接通过ChromeOptions添加代理参数。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置Chrome参数
chrome_options = Options()
# 虚构IP仅语法演示,实战替换为有效代理
proxy_ip = "112.12.34.56:8080"
chrome_options.add_argument(f"--proxy-server=http://{proxy_ip}")

# 忽略HTTPS证书报错,解决网页拦截、解析异常
chrome_options.add_argument("--ignore-certificate-errors")
# 禁止弹窗、提升稳定性
chrome_options.add_argument("--disable-web-security")

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)

try:
    # 测试代理有效性
    driver.get("https://httpbin.org/ip")
    print("浏览器代理IP生效:", driver.page_source)
finally:
    driver.quit()

3.2 带账号密码认证代理

Selenium原生不支持直接拼接账号密码认证代理,需要通过代理插件实现,这是解决商用代理认证的唯一稳定方案,可彻底解决浏览器代理认证弹窗问题。

import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 【站大爷代理认证参数】实战替换为自己的信息
PROXY_HOST = "有效代理IP"
PROXY_PORT = 代理端口
PROXY_USER = "你的站大爷实例ID"
PROXY_PWD = "实例ID后8位密码"

# 生成Chrome代理认证插件(解决Selenium无法直接密码认证的问题)
def create_proxy_auth_plugin():
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Proxy Auth Plugin",
        "permissions": ["proxy", "tabs", "<all_urls>"],
        "background": {"scripts": ["background.js"]},
        "minimum_chrome_version": "22.0.0"
    }
    """

    background_js = f"""
    var config = {{
        mode: "fixed_servers",
        rules: {{
            singleProxy: {{
                scheme: "http",
                host: "{PROXY_HOST}",
                port: parseInt({PROXY_PORT})
            }},
            bypassList: []
        }}
    }};
    chrome.proxy.settings.set({{value: config, scope: "regular"}}, function() {{}});
    function callbackFn(details) {{
        return {{
            authCredentials: {{
                username: "{PROXY_USER}",
                password: "{PROXY_PWD}"
            }}
        }};
    }}
    chrome.webRequest.onAuthRequired.addListener(
        callbackFn,
        {{urls: ["<all_urls>"]}},
        ['blocking']
    );
    """

    # 生成临时插件压缩包
    plugin_file = "proxy_auth_plugin.zip"
    with zipfile.ZipFile(plugin_file, "w") as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)
    return plugin_file

# 加载插件、启动浏览器
chrome_options = Options()
proxy_plugin = create_proxy_auth_plugin()
chrome_options.add_extension(proxy_plugin)
chrome_options.add_argument("--ignore-certificate-errors")

# 无头模式可正常使用该配置
# chrome_options.add_argument("--headless=new")

driver = webdriver.Chrome(options=chrome_options)
try:
    driver.get("https://httpbin.org/ip")
    print("Selenium 认证代理生效成功")
finally:
    driver.quit()

3.3 Selenium 代理关键避坑

  • Selenium 原生不支持 URL 拼接账号密码代理,仅靠参数配置无法完成认证,必须通过插件方案,规避认证弹窗、代理不生效问题

  • 插件为临时文件,建议每次启动浏览器重新生成,防止缓存导致代理IP切换失效、残留旧代理配置

  • 必须添加--ignore-certificate-errors参数,规避 HTTPS 网页证书拦截、解析失败报错

  • 全新无头模式(headless=new)完全兼容插件代理,无适配bug,支持静默爬虫场景稳定使用

  • 严格遵循站大爷认证规则,错误的账号密码会直接导致浏览器代理认证失败、页面空白、请求超时

四、通用实战优化方案

4.1 代理有效性检测

所有代理正式使用前,必须先做有效性校验,提前过滤无效、超时、封禁IP,避免大量请求报错。全网通用稳定检测接口:https://httpbin.org/ip,请求成功且返回IP即代表代理正常,可规避网页解析失败、连接异常等问题。

4.2 自动换代理逻辑

实战生产环境建议接入代理池,统一管理动态代理IP。程序捕获 ProxyError(URL/认证错误)、Timeout(代理失效)、403/429(网站封禁限流)异常后,自动切换新代理IP重试,实现无人值守稳定爬取。

4.3 代理使用核心原则

  • 优先使用短效动态代理:存活时间短、IP复用率低,大幅降低目标站点封禁概率

  • 场景严格匹配:简单静态网页用 Requests、高并发批量采集用 aiohttp、JS动态渲染页面用 Selenium

  • 全局强制规范:所有代理请求必须配置超时、异常捕获、有效性校验,保证程序不卡死、不崩溃、可自动重试

  • 杜绝格式错误:全程统一 http:// 代理协议,从根源解决实测中的 URL 拼写错误、网页解析失败问题

五、总结

本文完整覆盖 Python 爬虫三大主流库的全场景代理落地配置:Requests 适配同步常规爬取,支持单次请求、全局会话、账号密码/白名单双模式商用代理;Aiohttp 适配高并发异步爬虫,明确区分与 Requests 的参数差异,规避异步卡死报错;Selenium 浏览器爬虫通过插件方案完美解决商用代理密码认证难题,适配动态 JS 页面。

全文完全结合实测报错优化,修复了 URL 拼写错误、网页解析失败、代理不生效、程序卡死等高频问题,所有代码语法规范、逻辑严谨、无失效写法,贴合站大爷等主流商用代理平台规则,可直接复制用于个人开发与企业项目,搭配代理池自动换IP逻辑,即可实现稳定、高效、防封禁的爬虫采集服务。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐