Python 代理用法

Proxypy 网页代理:如何在 Python 中使用代理

Proxypy 是 Python 开发者常搜索的关键词,他们想找本地网页代理、Python 代理处理器,或把应用流量转发到外部代理服务器的方法。本页介绍 Python 中主要的代理实现模式:从简单的 requests 配置,到 urllib ProxyHandler、环境变量、SOCKS5 设置,再到生产环境的诊断。

Python 配置代理主要有三种方式:(1) requests 库:用 proxies 字典为 HTTP 和 HTTPS 指定代理 URL;(2) urllib.request.ProxyHandler:标准库中较老的方式,无需外部依赖;(3) HTTP_PROXY 和 HTTPS_PROXY 环境变量:requests 和 urllib 会自动读取,无需修改代码。requests 要使用 SOCKS5,需安装扩展 requests[socks] 或 PySocks。正式运行生产环境抓取之前,务必先验证出口 IP。

审核:

Python 代理模式:requests 库

requests 的 HTTP/HTTPS 代理

import requests; proxies = {'http': 'http://user:pass@host:port', 'https': 'http://user:pass@host:port'}; response = requests.get(url, proxies=proxies)。如果不需要认证,去掉 user:pass@ 即可。用 requests.Session() 可以为整个会话一次性设置代理。

requests 的 SOCKS5 代理

安装:pip install requests[socks]。使用:proxies = {'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port'}。要让 DNS 也经由 SOCKS5(防止 DNS 泄漏),请用 socks5h:// 代替 socks5://。其中的“h”表示主机名解析由代理服务器完成。

环境变量

export HTTP_PROXY=http://user:pass@host:port; export HTTPS_PROXY=http://user:pass@host:port。requests 和 urllib 都会自动读取。适合 CI/CD 或 .env 文件,不想修改应用代码时很有用。

Python 代理模式:urllib ProxyHandler

基础 ProxyHandler

import urllib.request; proxy_handler = urllib.request.ProxyHandler({'http': 'http://user:pass@host:port', 'https': 'http://user:pass@host:port'}); opener = urllib.request.build_opener(proxy_handler); urllib.request.install_opener(opener)。执行 install_opener 之后,所有 urllib.request.urlopen 调用都会使用该代理。

ProxyBasicAuthHandler

对于需要通过 Proxy-Authorization 头进行 Basic 认证的代理(较少见):proxy_auth = urllib.request.ProxyBasicAuthHandler(); proxy_auth.add_password(realm=None, uri='host:port', user='user', passwd='pass');然后用两个处理器一起构建 opener。

何时用 urllib,何时用 requests

urllib 无需任何外部依赖,适合简单的代理路由。requests 更简单,SOCKS5 支持更好,会话处理也更清晰。只有在不允许安装外部包时才使用 urllib。

搜索 Proxypy 网页代理到底想找什么

本地网页代理模式

Proxypy 式的网页代理是运行在 localhost 的本地 HTTP 代理服务器,它拦截浏览器或脚本的流量,再通过上游代理转发。适用于调试请求头、动态修改请求,或为多个脚本集中管理代理配置。

大多数 Python 抓取不需要本地代理

对于使用 requests 或 Scrapy 的 Python 抓取和自动化,通常不需要本地代理,这两个库本身就能原生处理上游 HTTP 和 SOCKS5 代理。多加一层本地转发会增加延迟和复杂度,在大多数生产场景下并没有实际好处。

上游代理轮换器模式

对于需要 IP 轮换的多 worker 抓取,建议在应用中维护代理列表,而不是使用本地网页代理。每个 worker 按轮询或随机方式从池中选取。也可以使用在服务器端轮换的 backconnect 代理服务。

Python 中的验证与诊断

在代码中验证出口 IP

import requests; r = requests.get('https://api.ipify.org?format=json', proxies=proxies); print(r.json()['ip'])。确认显示的是代理地址,而不是你自己的 IP。请在任何生产爬取之前执行。

处理代理错误

requests.exceptions.ProxyError:连接代理服务器出现问题。requests.exceptions.ConnectTimeout:代理未在规定时间内响应。ConnectionRefusedError:端口错误或 IP 不在白名单中。对于临时性错误,请添加带指数退避的重试逻辑。

测试 IP 轮换

在每次请求之间启用轮换,通过代理向 IP 检测 API 发送多个请求,并比较响应中的 IP。如果所有请求都返回同一个 IP,说明轮换没有生效,请检查是否在请求之间调用了轮换接口。

扩展到生产环境之前,先测试你的 Python 代理配置

Python 集成文档

关于 Python 代理的常见问题

01Proxypy 是 Proxy Poland 的产品吗?

不是。proxypy 是 Python 开发者寻找代理方案时常用的通用搜索词。本页讲解如何在 Python 中使用代理,以及如何把手机代理配置为脚本的上游代理。

02如何在 Python requests 中使用 SOCKS5 代理?

安装:pip install requests[socks]。然后:proxies = {'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port'}。要让 DNS 也经由 SOCKS5(防止 DNS 泄漏),请使用 socks5h://,其中的“h”表示主机名解析在代理服务器端完成。

03为什么上游要用手机代理,而不是数据中心代理?

数据中心 IP 很容易被识别:它们的 ASN 段是公开的,被 Cloudflare、DataDome 和大多数大型平台封锁。移动运营商 IP 来自数百万普通智能手机用户使用的同一批网段,要封锁它们而不误伤真实用户要困难得多。

04如何处理 Python requests 中的 ProxyError?

ProxyError 表示连接代理服务器失败。请检查:(1) 主机和端口是否正确;(2) 是否有 IP 白名单要求;(3) 凭据是否仍然有效;(4) 代理端口是否开放(telnet host port)。对于临时性错误,请添加重试逻辑:from requests.adapters import HTTPAdapter, Retry。

05代理 URL 中的 socks5 和 socks5h 有什么区别?

socks5://:DNS 解析在客户端(你的脚本)完成,然后再通过代理发送。socks5h://:DNS 解析在服务器端完成(由代理解析主机名)。使用 socks5h:// 可以防止 DNS 泄漏,并向本地网络隐藏主机名。