urllib和requests设置HTTP代理的对比

0 阅读2分钟

微信图片_20230808094553.png在Python网络请求中,urllib和requests是两个常用的HTTP客户端库,它们都支持通过HTTP代理发送请求,但在实现方式、易用性和功能特性上存在显著差异。本文将从多个维度对比这两个库的代理设置方法。

1. 基本代理设置方式****

urllib需要显式创建ProxyHandler并构建opener:

python

 from urllib.request import ProxyHandler, build_opener
  
 proxy = ProxyHandler({
 'http': 'http://proxy_ip:port',
 'https': 'http://proxy_ip:port'
 })
 opener = build_opener(proxy)
 response = opener.open('example.com')

requests则提供更简洁的字典式配置:

python

 import requests
  
 proxies = {
 'http': 'http://proxy_ip:port',
 'https': 'http://proxy_ip:port'
 }
 response = requests.get('example.com', proxies=proxies)

2. 代理认证实现****

urllib的认证需要手动拼接URL:

python

 proxy = ProxyHandler({
 'http': 'http://username:password@proxy_ip:port'
 })

requests提供更安全的HTTPProxyAuth:

python

 from requests.auth import HTTPProxyAuth
  
 auth = HTTPProxyAuth('username', 'password')
 requests.get('example.com',
 proxies={'http': 'http://proxy_ip:port'},
 auth=auth)

3. 功能特性对比****

特性urllibrequests
代理类型支持仅HTTP/HTTPS支持HTTP/HTTPS/SOCKS(需扩展)
会话保持需手动管理内置Session对象
超时设置需通过urllib.request额外配置直接参数timeout
连接池不支持内置连接池
重试机制需自行实现可通过HTTPAdapter配置

4. 异常处理差异****

urllib的异常处理较为底层:

python

 from urllib.error import URLError
 try:
 response = opener.open(request)
 except URLError as e:
 print(f"代理请求失败: {e}")

requests提供更丰富的异常类:

python

 try:
 requests.get(url, proxies=proxies, timeout=5)
 except requests.exceptions.ProxyError:
 print("代理连接失败")
 except requests.exceptions.Timeout:
 print("请求超时")

5. 适用场景建议****

· 选择urllib

· 需要极轻量级的解决方案

· 在受限环境中只能使用标准库

· 需要完全控制请求的每个细节

· 选择requests

· 大多数常规网络请求场景

· 需要快速开发且注重可读性

· 要求完善的错误处理和重试机制

· 需要SOCKS代理支持

6. 性能对比****

在简单请求场景下,requests比urllib约慢10-15%(主要因功能更丰富),但在复杂场景(如需要连接池、重试等)中,requests的实际效率更高。对于代理请求,requests的连接复用机制能显著减少重复认证的开销。

总结来看,虽然urllib作为标准库无需额外安装,但requests在代理设置方面提供了更友好、更强大的接口。对于现代Python开发,除非有特殊限制,否则推荐优先使用requests库处理HTTP代理请求。