如何用Python实现仅访问指定网站时才使用某代理IP?

null
如何用Python实现仅访问指定网站时才使用某代理IP?

2 回复
import requests
import re
from urllib.parse import urlparse

class SelectiveProxy:
    def __init__(self, proxy_url, target_domains):
        """
        proxy_url: 代理服务器地址,如 'http://127.0.0.1:8080'
        target_domains: 需要走代理的域名列表,如 ['example.com', 'api.target.com']
        """
        self.proxies = {'http': proxy_url, 'https': proxy_url}
        self.target_domains = [self.normalize_domain(d) for d in target_domains]
        self.session = requests.Session()
    
    def normalize_domain(self, domain):
        """标准化域名(移除协议和路径)"""
        if '://' in domain:
            domain = urlparse(domain).netloc
        return domain.lower()
    
    def should_use_proxy(self, url):
        """判断URL是否需要使用代理"""
        parsed = urlparse(url)
        request_domain = parsed.netloc.lower()
        
        # 检查是否匹配目标域名
        for target in self.target_domains:
            if request_domain == target or request_domain.endswith('.' + target):
                return True
        return False
    
    def request(self, method, url, **kwargs):
        """发起请求,自动选择是否使用代理"""
        if self.should_use_proxy(url):
            kwargs['proxies'] = self.proxies
            print(f"使用代理访问: {url}")
        else:
            print(f"直接访问: {url}")
        
        return self.session.request(method, url, **kwargs)
    
    # 便捷方法
    def get(self, url, **kwargs):
        return self.request('GET', url, **kwargs)
    
    def post(self, url, **kwargs):
        return self.request('POST', url, **kwargs)

# 使用示例
if __name__ == "__main__":
    # 配置:仅访问 example.com 时使用代理
    proxy_handler = SelectiveProxy(
        proxy_url='http://127.0.0.1:7890',  # 你的代理地址
        target_domains=['example.com', 'api.example.com']
    )
    
    # 测试请求
    try:
        # 这个会走代理
        resp1 = proxy_handler.get('https://example.com/api/data')
        print(f"代理访问状态码: {resp1.status_code}")
        
        # 这个不会走代理
        resp2 = proxy_handler.get('https://google.com')
        print(f"直连访问状态码: {resp2.status_code}")
        
    except Exception as e:
        print(f"请求失败: {e}")

核心原理就是通过should_use_proxy()方法检查URL的域名是否在目标列表里,然后在发起请求时动态设置proxies参数。用requests.Session()可以保持连接复用。

要扩展的话可以加域名通配符匹配或者正则匹配,不过现在这个版本已经能解决大部分场景了。


chrome 的 SwitchyOmega 插件可以实现你所描述的功能

回到顶部