Python Requests 使用 DF-IP 代理:HTTP 认证、超时与安全日志

使用已有 DF-IP HTTP 连接运行 Python Requests,掌握凭证编码、超时、跳转处理及出口验证。

本文演示把已有的 DF-IP HTTP 代理连接用于 Python 发出的网页请求。获取代理连接的 API 与通过代理访问目标网站是两个步骤;这里的代码只完成后者,不购买代理,也不自动提取新会话。

配置与检查示意图

查看大图

准备 DF-IP 连接信息

静态住宅从已购列表复制 IP、所选协议的端口及 proxy_username、proxy_password,并确认记录仍有效。动态住宅选择住宅类型、地区、协议和会话后提取;默认结果为 用户名:密码@主机:端口,请完整保留生成的用户名与密码。这里使用的是代理认证信息,不是网站登录密码或 API Key。

填写项应填内容
主机静态 IP 或动态网关,不带协议前缀
端口HTTP 对应 http_port,SOCKS5 对应 s5_port;动态使用所选协议的提取端口
用户名、密码同一条连接的完整代理认证信息,不要混用两次提取结果

需要程序化获取信息时,参考静态记录查询与动态代理提取。

环境与连接参数

把以下变量交给你自己的运行环境或密钥管理工具注入。示例主机只支持 IPv4 或域名,不支持 IPv6 字面地址。

变量内容
DFIP_PROXY_HOSTHTTP 代理主机,不含协议前缀
DFIP_PROXY_PORTHTTP 端口,1–65535
DFIP_PROXY_USERNAME、DFIP_PROXY_PASSWORD完整代理用户名与密码
DFIP_TEST_URL自己有权访问的 HTTPS 测试地址;缺省使用 example.com

不要把真实凭证写进代码仓库、URL 截图或共享日志。示例不输出代理 URL、认证字段或完整异常对象。

安装与示例

在自己的 Python 虚拟环境中安装 requests,把下面保存为 check_proxy.py,注入环境变量后运行 python check_proxy.py。这是一份连接示例,不是已经替你完成真实代理验证的报告。

import os
import sys
from urllib.parse import quote

import requests


def required(name):
    value = os.environ.get(name, "")
    if not value:
        raise ValueError("Missing setting: " + name)
    return value


def main():
    try:
        host = required("DFIP_PROXY_HOST").strip()
        port = int(required("DFIP_PROXY_PORT"))
        if not host or any(c in host for c in "/:@?#[]\\") or any(c.isspace() for c in host):
            raise ValueError("Use an IPv4 address or DNS host without a URL scheme")
        if not 1 <= port <= 65535:
            raise ValueError("Invalid proxy port")
        username = quote(required("DFIP_PROXY_USERNAME"), safe="")
        password = quote(required("DFIP_PROXY_PASSWORD"), safe="")
        proxy_url = f"http://{username}:{password}@{host}:{port}"
        target = os.environ.get("DFIP_TEST_URL", "https://example.com/")
        if not target.startswith("https://"):
            raise ValueError("Use an HTTPS test URL")
    except ValueError:
        print("Invalid or missing connection settings", file=sys.stderr)
        return 1

    try:
        with requests.Session() as session:
            session.trust_env = False
            response = session.get(
                target,
                proxies={"http": proxy_url, "https": proxy_url},
                timeout=(10, 30),
                allow_redirects=False,
            )
            response.raise_for_status()
            print("HTTP status:", response.status_code)
            print("Response bytes:", len(response.content))
    except requests.RequestException as exc:
        print("Request failed:", type(exc).__name__, file=sys.stderr)
        return 1
    return 0


if __name__ == "__main__":
    sys.exit(main())

为什么这样填写

Requests 的 proxies 键表示目标 URL 的协议;HTTPS 目标仍可使用 http:// 代理 URL。用户名和密码分别进行 URL 编码,避免 @、冒号等字符破坏连接字符串。Requests 官方代理说明提供了配置与可选 SOCKS 扩展说明。

本例显式指定代理,并关闭环境自动读取,减少其他代理环境变量干扰。trust_env=False 也会影响环境证书配置等行为;需要企业 CA 时,显式提供受信任的 CA 文件,不要关闭证书校验。连接与读取超时分别为 10 秒、30 秒,它们不是整个任务的统一总时限。

怎样确认结果

先看返回状态,再把 DFIP_TEST_URL 换成你信任的 HTTPS 出口检测地址;示例只打印状态与响应长度,如需查看出口,应在受控本地调试中查看该检测服务定义的响应字段。普通页面返回 200 本身不能证明出口地区正确。

示例不自动跟随跳转:返回 3xx 时,人工核对目标后再决定是否允许跳转。Requests 的 raise_for_status() 不会把 3xx 当作错误,所以仍要检查打印的状态。对写入请求不要盲目自动重试。

若改用 SOCKS5,先安装可选扩展:

python -m pip install "requests[socks]"

然后相应改用 SOCKS URL;socks5h 表示通过代理解析域名。本例主流程仍是 HTTP。失败时可查 407 排查或超时排查,连接参数从 DF-IP 控制台 获取。

English version

最近修改: 2026-09-13