Python请求认证设置:使用代理与会话维持的完整代码示例

代理IP 2025-12-29 代理知识 3 0
A⁺AA⁻
国外IP代理推荐:
IPIPGO|全球住宅代理IP(>>>点击注册免费测试<<<)
国内IP代理推荐:
天启|全国240+城市代理IP(>>>点击注册免费测试<<<)

Python中代理IP的基本使用

在Python的世界里,使用代理ip就像给网络请求穿上了一件“隐身衣”。最直接的方式就是在发送请求时,通过proxies参数指定代理服务器地址。这里以大家常用的requests库为例。

Python请求认证设置:使用代理与会话维持的完整代码示例

假设你已经从ipipgo获取了一个HTTP代理IP,格式通常是IP:端口。ipipgo提供的代理IP全协议支持,使用起来非常方便。下面是一个最简单的例子:

import requests

 从ipipgo获取的代理IP信息(示例)
proxy_ip = "123.45.67.89"
proxy_port = "8080"

 组合成proxies参数字典
proxies = {
    "HTTP": f"http://{proxy_ip}:{proxy_port}",
    "https": f"http://{proxy_ip}:{proxy_port}"   注意:很多HTTP代理也用于HTTPS流量
}

try:
    response = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=10)
    print(response.json())   这里会显示代理IP的地址,而不是你本机的IP
except requests.exceptions.RequestException as e:
    print(f"请求出错: {e}")

这段代码的核心就是proxies字典。它告诉requests库,所有的HTTP和HTTPS请求都要通过我们指定的代理服务器来发送。成功的话,返回的IP地址就是你从ipipgo获取的那个IP,这证明代理生效了。

如何处理需要用户名密码认证的代理

很多时候,为了安全和管理,代理服务会设置用户名和密码认证。ipipgo的部分代理产品也支持这种认证方式,确保只有授权用户才能使用。这种情况下,你需要将认证信息包含在代理地址中。

格式是这样的:http://用户名:密码@IP:端口。我们来修改一下上面的代码:

import requests

 从ipipgo获取的带认证的代理信息(示例)
username = "your_username"
password = "your_password"
proxy_ip = "123.45.67.89"
proxy_port = "8080"

 将认证信息嵌入代理地址
proxy_url = f"http://{username}:{password}@{proxy_ip}:{proxy_port}"

proxies = {
    "http": proxy_url,
    "https": proxy_url
}

try:
    response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"请求出错: {e}")

这种方法简单直接,但要注意密码是明文的。在一些对安全性要求极高的场景下,可能需要考虑其他更安全的认证方式。

使用Session对象维持会话并设置代理

在实际项目中,我们通常需要与同一个网站进行多次交互(比如登录后访问多个页面)。这时候,使用Session会话对象就非常有必要了。Session可以自动处理Cookies,保持登录状态,避免每次请求都重复输入认证信息。

好消息是,给Session设置代理和给单次请求设置代理一样简单。你只需要在创建Session对象后,一次性将proxies配置好即可。

import requests

 代理配置(以ipipgo代理为例)
proxies = {
    "http": "http://user:pass@123.45.67.89:8080",
    "https": "http://user:pass@123.45.67.89:8080"
}

 创建一个Session对象
with requests.Session() as session:
     为整个会话设置代理
    session.proxies.update(proxies)
    
     现在,通过这个session发出的所有请求都会自动使用代理
     示例1: 登录(假设需要登录的网站)
    login_data = {'username': 'my_user', 'password': 'my_pass'}
    session.post('https://example.com/login', data=login_data)
    
     示例2: 登录后访问个人页面,Session会自动携带登录后的cookies
    profile_page = session.get('https://example.com/dashboard')
    print(profile_page.status_code)

使用Session的好处是显而易见的:代码更简洁,效率更高,并且能很好地维持会话状态。对于需要连续访问的任务,这是首选方案。ipipgo的代理IP稳定性高,非常适合在这种长会话场景下使用。

实战:封装一个带代理功能的请求类

为了提升代码的复用性和可维护性,我们可以将代理设置和请求操作封装成一个类。这样,在项目的任何地方,我们都可以方便地调用这个类来发送请求,而无需重复编写代理配置代码。

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

class ProxyRequest:
    """
    一个支持代理和自动重试的请求类
    """
    
    def __init__(self, proxy_url=None, max_retries=3):
        self.session = requests.Session()
        
         设置代理
        if proxy_url:
            self.session.proxies = {
                "http": proxy_url,
                "https": proxy_url
            }
        
         设置重试策略,提升请求成功率,这对于使用代理IP尤为重要
        retry_strategy = Retry(
            total=max_retries,
            status_forcelist=[429, 500, 502, 503, 504],   在遇到这些状态码时重试
            method_whitelist=["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"]   允许重试的HTTP方法
        )
        adapter = HTTPAdapter(max_retries=retry_strategy)
        self.session.mount("http://", adapter)
        self.session.mount("https://", adapter)
    
    def get(self, url, kwargs):
        return self.session.get(url, kwargs)
    
    def post(self, url, data=None, json=None, kwargs):
        return self.session.post(url, data=data, json=json, kwargs)
    
     可以继续封装其他方法,如put, delete等
    
    def close(self):
        self.session.close()

 使用示例
if __name__ == "__main__":
     初始化时传入从ipipgo获取的代理地址
    proxy_helper = ProxyRequest(proxy_url="http://user:pass@123.45.67.89:8080")
    
    try:
        response = proxy_helper.get("http://httpbin.org/ip")
        print("请求成功:", response.json())
    finally:
        proxy_helper.close()   记得关闭会话,释放资源

这个类做了两件重要的事:一是集中管理代理配置,二是增加了请求重试机制。网络请求本身就不稳定,加上代理层,偶尔失败是正常的。重试机制能有效提高最终的成功率。ipipgo整合了全球大量的住宅IP资源,IP池巨大,结合重试策略,可以更好地应对各种复杂的网络环境。

常见问题与解决方案(QA)

Q1: 代码报错,提示代理连接失败或超时,可能是什么原因?

A1: 这通常是以下几个原因造成的: - 代理IP失效:代理IP是有生命周期的,可能已经过期。请确保你使用的ipipgo代理IP在有效期内。 - 网络防火墙或端口限制:你本地网络环境可能阻止了与代理服务器端口的连接。 - 代理服务器压力大:当前使用的代理服务器节点负载较高,可以尝试更换另一个ipipgo的IP节点。 - 认证信息错误:仔细检查用户名和密码是否填写正确。

Q2: 使用代理后,请求速度变慢了很多,正常吗?

A2: 这是正常现象。你的请求需要先经过代理服务器中转,自然会比直接访问目标网站要慢一些。速度取决于多个因素: - 代理服务器的地理位置和性能:选择离你或目标网站更近的ipipgo节点可以提升速度。 - 网络带宽:代理服务器自身的带宽限制。 - 目标网站的响应速度。 如果慢到无法接受,可以尝试切换不同的代理IP或协议类型。ipipgo提供动态和静态多种IP选择,可以根据业务需求灵活选用。

Q3: 如何处理HTTPS网站的代理?上面的例子中为什么HTTPS也用`http://`开头的代理地址?

A3: 这是一个常见但重要的细节。对于许多http代理服务器来说,它们可以同时处理HTTP和HTTPS请求。当你的客户端(比如Python程序)通过HTTP代理连接HTTPS网站时,会先通过HTTP协议与代理服务器建立一个隧道(CONNECT方法),之后再进行加密的HTTPS通信。在proxies字典中指定HTTPS流量也使用`http://`开头的代理地址是标准做法。ipipgo也全协议支持,如果你有专门的socks5HTTPS代理地址,直接使用对应的协议前缀即可(如`Socks5://`, `https://`)。

Q4: 如何知道代理是否真的起作用了?

A4: 最直观的方法就是让代码返回当前请求使用的ip地址。可以使用一些返回请求者IP的公共服务进行测试,比如上面例子中用到的 http://httpbin.org/iphttps://API.ipify.org?format=json。如果返回的IP地址与你设置的代理IP一致,那么就证明代理成功生效了。

国外IP代理推荐:
IPIPGO|全球住宅代理IP(>>>点击注册免费测试<<<)
国内ip代理推荐:
天启|全国240+城市代理IP(>>>点击注册免费测试<<<)

发表评论

发表评论:

扫一扫,添加您的专属销售

扫一扫,添加您的专属销售