跳转到内容
Guides 2 分钟阅读 1352 次浏览

在 Python 中使用 requests 库配置代理

了解如何在 Python 的 requests 库中使用代理进行安全的网页抓取,并学会接入 GProxy、绕过访问限制。

Python
在 Python 中使用 requests 库配置代理

HTTP 代理是位于您和互联网之间、充当网关的中间服务器。使用代理时,您的请求会先经过代理服务器,然后再到达目标服务器。这样可以隐藏您的 IP 地址,并可用于绕过地域限制、网页抓取、增强安全性等多种用途。Python 的 requests 库让在 HTTP 请求中使用代理变得非常简单。

为什么要在 requests 库中使用代理?

requests 库中使用代理,主要有以下几个原因:

  • 匿名性: 代理会隐藏您的 IP 地址,使您的线上活动更难被追踪。
  • 绕过地域限制: 通过位于目标地区的代理服务器,访问仅限特定区域的内容。
  • 网页抓取: 在不同代理服务器之间轮换,避免抓取网站时被封禁。许多网站会实施速率限制或 IP 封锁来防止数据被滥用。
  • 负载均衡: 将请求分散到多台服务器,以提升性能和可靠性。
  • 安全性: 代理作为您的电脑与互联网之间的缓冲,可增加一层额外的安全防护,还能过滤恶意内容。
  • 测试: 出于测试目的,模拟来自不同地区的用户访问。

requests 中配置代理

requests 库通过请求函数(getpostputdelete 等)的 proxies 参数提供了简单的代理配置方式。proxies 参数接收一个字典,键是协议(例如 'http'、'https'),值是代理 URL。

基本代理配置

下面是在 requests 库中使用代理的基本示例:

import requests

proxies = {
  'http': 'http://your_proxy_address:port',
  'https': 'https://your_proxy_address:port',
}

try:
    response = requests.get('https://www.example.com', proxies=proxies)
    response.raise_for_status() # 响应异常(4xx 或 5xx)时抛出 HTTPError
    print(response.status_code)
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

请把 your_proxy_addressport 替换为您代理服务器的实际地址和端口。raise_for_status() 方法对错误处理非常关键:当 HTTP 状态码表示错误(例如 404 Not Found、500 Internal Server Error)时,它会抛出异常。

为 HTTP 和 HTTPS 使用不同代理

您也可以为 HTTP 和 HTTPS 流量分别指定不同的代理:

import requests

proxies = {
  'http': 'http://http_proxy_address:port',
  'https': 'https://https_proxy_address:port',
}

try:
    response = requests.get('https://www.example.com', proxies=proxies)
    response.raise_for_status()
    print(response.status_code)
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

代理认证

许多代理服务器需要认证。您可以把用户名和密码写进代理 URL:

import requests

proxies = {
  'http': 'http://username:password@your_proxy_address:port',
  'https': 'https://username:password@your_proxy_address:port',
}

try:
    response = requests.get('https://www.example.com', proxies=proxies)
    response.raise_for_status()
    print(response.status_code)
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

对于更复杂的认证方式,也可以使用 requests.auth 模块。不过对于基本的用户名/密码认证,把凭据嵌入 URL 通常就足够了。

SOCKS 代理

requests 库支持 SOCKS 代理,但需要安装 requests[socks] 附加依赖。

pip install requests[socks]

安装完成后,可以这样使用 SOCKS 代理:

import requests

proxies = {
  'http': 'socks5://user:pass@host:port',
  'https': 'socks5://user:pass@host:port'
}

try:
    response = requests.get('https://www.example.com', proxies=proxies)
    response.raise_for_status()
    print(response.status_code)
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

您可以使用 socks4socks5 方案。如果 SOCKS 代理不需要用户名/密码,直接从 URL 中省略即可(例如 'socks5://host:port')。

代理类型对比

以下是不同代理类型的对比:

特性 HTTP 代理 HTTPS 代理 SOCKS 代理
协议 HTTP HTTPS SOCKS(4、5)
加密 不加密(除非目标服务器是 HTTPS) 加密到代理服务器的流量 支持加密(SOCKS5)
使用场景 网页浏览、访问 HTTP 站点 网页浏览、访问 HTTPS 站点 通用性强,支持多种协议(HTTP、HTTPS、FTP 等)
安全性 安全性较低 更安全 更安全(尤其是 SOCKS5)
复杂度 配置简单 配置简单 配置可能更复杂
应用层 理解 HTTP 协议 理解 HTTP 协议 工作在传输层

网页抓取中的代理轮换

做网页抓取时,在多个代理之间轮换对于避免 IP 被封至关重要。可以这样实现代理轮换:

import requests
import random

proxy_list = [
  'http://user1:[email protected]:8000',
  'http://user2:[email protected]:8001',
  'http://user3:[email protected]:8002',
]

def get_page(url):
    proxy = random.choice(proxy_list)
    proxies = {'http': proxy, 'https': proxy}
    try:
        response = requests.get(url, proxies=proxies, timeout=10)  # 添加超时
        response.raise_for_status()
        return response.text
    except requests.exceptions.RequestException as e:
        print(f"Error using proxy {proxy}: {e}")
        return None

url = 'https://www.example.com'
content = get_page(url)

if content:
    print("Successfully retrieved content.")
    # 在这里处理内容
else:
    print("Failed to retrieve content.")

在这个示例中:

  • 维护了一个代理服务器列表。
  • random.choice() 函数为每次请求从列表中随机选择一个代理。
  • requests.get() 中加入了 timeout,防止某个代理无响应时脚本无限期挂起。
  • 实现了错误处理,用于捕获异常并换用其他代理重试。

请记得妥善处理错误,并在请求失败时用不同代理实现重试逻辑。对于更大规模的抓取项目,可以考虑使用更健壮的代理管理库。

常见问题与排查

  • 代理认证错误: 仔细核对用户名和密码,确保它们在代理 URL 中正确编码。
  • 连接错误: 确认代理服务器正在运行且可从您的网络访问,并检查防火墙设置。
  • 超时: 增大 requests.get() 函数中的超时值。对某些代理服务器来说,默认超时可能过短。
  • 请求被拦截: 目标网站可能封禁了代理服务器的 IP 地址。请换用其他代理或轮换代理列表。
  • SOCKS 代理错误: 确认已安装 requests[socks] 附加依赖,并检查 SOCKS 代理服务器配置是否正确。

结论

在 Python 的 requests 库中使用代理,是完成网页抓取、访问地域受限内容和增强安全性等多种任务的有力手段。掌握代理配置、认证处理和代理轮换的实现方式后,您就能在 Python 应用中有效利用代理。请记得妥善处理错误,并根据具体需求选择合适的代理类型。

已更新: 26.01.2026
返回分类

试用我们的代理

遍布 100+ 国家的 20,000+ 代理

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.