如何用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 插件可以实现你所描述的功能

