pin_drop当前位置:知识文库 ❯ 图文

requests代理设置教程 - HTTP/SOCKS代理配置详解

一、代理概述

代理(Proxy)是网络请求中的中间服务器,客户端通过代理转发请求到目标服务器。requests库通过proxies参数支持HTTP/HTTPS/SOCKS代理,常用于隐藏真实IP、突破访问限制、负载均衡和缓存加速等场景。

在爬虫开发、API调试和企业网络环境中,代理是一个不可或缺的工具。通过代理服务器,你可以实现IP轮换、跨地域访问、流量监控等功能。

二、代理语法与参数

requests使用proxies参数来配置代理,该参数接受一个字典类型。

代码示例

proxies = {
    'http': 'http://proxy_host:port',
    'https': 'http://proxy_host:port',
}
requests.get(url, proxies=proxies)

代理字典格式

格式 说明
http http://host:port HTTP请求使用的代理
https http://host:port HTTPS请求使用的代理
http/https socks5://host:port SOCKS5代理(需安装PySocks)

代理认证格式

格式 示例 说明
无认证 http://proxy.com:8080 无需用户名密码
用户名密码 http://user:pass@proxy.com:8080 代理需要认证

三、HTTP/HTTPS代理配置

最基本的代理使用方式是通过proxies参数为单次请求设置代理。

代码示例

import requests

# 配置代理
proxies = {
    'http': 'http://proxy.example.com:8080',
    'https': 'http://proxy.example.com:8080',
}

# 使用代理发送请求
try:
    response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=10)
    print(f"通过代理的IP: {response.json()['origin']}")
except requests.exceptions.ProxyError:
    print("代理连接失败")
except requests.exceptions.ConnectTimeout:
    print("代理连接超时")

输出结果:

代码示例

代理连接失败

提示:以上代理地址为示例,实际使用需替换为可用的代理服务器地址。

四、环境变量设置代理

requests会自动读取环境变量中的代理设置(HTTP_PROXYHTTPS_PROXY),这在需要全局设置代理时非常方便。

代码示例

import os
import requests

# 方式1:设置环境变量
os.environ['HTTP_PROXY'] = 'http://proxy.example.com:8080'
os.environ['HTTPS_PROXY'] = 'http://proxy.example.com:8080'

# requests会自动读取环境变量中的代理设置
response = requests.get('https://httpbin.org/ip')
print(f"环境变量代理IP: {response.json()['origin']}")

# 方式2:临时覆盖环境变量代理(设为None表示不使用代理)
response2 = requests.get('https://httpbin.org/ip', proxies={'http': None, 'https': None})
print(f"直连IP: {response2.json()['origin']}")

# 清除环境变量
os.environ.pop('HTTP_PROXY', None)
os.environ.pop('HTTPS_PROXY', None)

输出结果:

代码示例

环境变量代理IP: 203.0.113.50
直连IP: 192.168.1.100

五、Session级别代理与SOCKS5

当多个请求需要使用相同的代理时,可以在Session级别设置代理,避免重复配置。此外,requests还支持SOCKS5代理。

代码示例

import requests

# Session级别设置代理(所有请求共享)
session = requests.Session()
session.proxies.update({
    'http': 'http://proxy.example.com:8080',
    'https': 'http://proxy.example.com:8080',
})

# 该Session的所有请求都通过代理
# response = session.get('https://httpbin.org/ip')

# SOCKS5代理(需要安装PySocks: pip install PySocks)
# socks_proxies = {
#     'http': 'socks5://user:pass@host:1080',
#     'https': 'socks5://user:pass@host:1080',
# }
# response = requests.get('https://httpbin.org/ip', proxies=socks_proxies)

# 不使用代理直连
response = session.get('https://httpbin.org/ip', proxies={'http': None, 'https': None})
print(f"直连IP: {response.json()['origin']}")

session.close()

输出结果:

代码示例

直连IP: 192.168.1.100

六、代理应用场景

  • 爬虫开发:使用代理池轮换IP,避免被目标网站封禁

  • 企业内网:通过公司代理服务器访问外部网络资源

  • 测试环境:通过代理模拟不同地区的用户访问


小贴士

使用SOCKS代理需要额外安装PySocks库(pip install PySocks)。代理服务器可能不稳定,建议设置timeout参数并实现重试机制。

七、代理设置方式对比

方式 作用范围 优先级 适用场景
proxies参数 单次请求 最高 临时使用代理
Session.proxies Session内所有请求 同一会话统一代理
环境变量 全局所有请求 最低 系统级代理配置

八、常见问题

如何临时禁用代理直连某个请求?

在proxies参数中传入{'http': None, 'https': None}即可临时绕过环境变量和Session的代理设置,进行直连请求。

代理连接失败时如何处理?

使用try-except捕获requests.exceptions.ProxyErrorConnectTimeout异常,结合重试机制或切换到备用代理。

proxies=None和proxies={}有什么区别?

proxies=None表示临时禁用代理直连,而proxies={}(空字典)不会覆盖环境变量中的代理设置。

如何实现代理池自动轮换?

维护一个代理列表,每次请求时从中选取下一个代理。可以使用collections.deque的rotate方法实现循环轮换,结合异常处理自动剔除失效代理。

标签: requests 代理设置 HTTP代理 SOCKS代理 proxies Python网络

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: requests超时设置详解 - 连接超时、读取超时与重试机制 下一篇: requests认证Auth教程 - Basic/Digest/自定义认证详解

poll相关推荐