#配置
hs-net 提供灵活的配置方式,支持全局配置、构造函数参数和请求级参数三级覆盖。
#NetConfig
NetConfig 是全局配置类,所有选项都有合理的默认值:
config.py
from hs_net import NetConfig, EngineEnum
config = NetConfig(
engine=EngineEnum.HTTPX, # HTTP 引擎
base_url="", # 基础 URL
timeout=20.0, # 超时时间(秒)
retries=3, # 重试次数
retry_delay=0.0, # 重试间隔(秒)
user_agent="random", # User-Agent
proxy=None, # 代理地址(支持字符串或 ProxyService)
verify=False, # SSL 证书验证(默认关闭)
raise_status=True, # 非 2xx 是否抛异常
allow_redirects=True, # 是否跟随重定向
rate_limit=None, # 速率限制(int/float 或 RateLimitConfig)
concurrency=None, # 最大并发数
headers={}, # 全局请求头
cookies={}, # 全局 cookies
engine_options={}, # 引擎特定配置
)#配置选项详解
#engine
指定 HTTP 引擎,支持字符串或枚举:
# 字符串
net = SyncNet(engine="curl_cffi")
# 枚举
net = SyncNet(engine=EngineEnum.CURL_CFFI)
# 自定义引擎类
net = SyncNet(engine=MyCustomEngine)#base_url
设置基础 URL,请求时自动拼接路径:
base_url.py
net = SyncNet(base_url="https://api.example.com/v1")
# 以下两种写法等价:
net.get("/users") # => https://api.example.com/v1/users
net.get("users") # => https://api.example.com/v1/users
# 绝对 URL 不受 base_url 影响
net.get("https://other.com/path") # => https://other.com/path#user_agent
支持快捷方式和自定义字符串:
net = SyncNet(user_agent="random") # 每次请求随机 UA
net = SyncNet(user_agent="chrome") # Chrome UA
net = SyncNet(user_agent="firefox") # Firefox UA
net = SyncNet(user_agent="safari") # Safari UA
net = SyncNet(user_agent="edge") # Edge UA
net = SyncNet(user_agent="MyBot/1.0") # 自定义 UA#verify
是否验证 SSL 证书(默认关闭):
net = SyncNet(verify=True) # 开启 SSL 验证(生产环境推荐)
net = SyncNet(verify=False) # 跳过 SSL 验证(默认)#rate_limit
速率限制,控制请求频率:
from hs_net import RateLimitConfig
# 简单全局限速:每秒最多 5 个请求
net = SyncNet(rate_limit=5)
# 精细配置
net = SyncNet(rate_limit=RateLimitConfig(
rate=10, # 全局每秒 10 个
per_domain={
"api.example.com": 2, # 特定域名每秒 2 个
"slow.example.com": RateLimitConfig(rate=1),
},
))可选依赖
速率限制功能需要额外安装:
pip install hs-net[sp]#concurrency
限制最大并发数(异步场景下特别有用):
concurrency.py
# 最多同时 10 个请求
async with Net(concurrency=10) as net:
tasks = [net.get(url) for url in urls]
results = await asyncio.gather(*tasks)#engine_options
透传给底层引擎的配置:
engine_options.py
# httpx: 关闭 HTTP/2
net = SyncNet(engine="httpx", engine_options={"http2": False})
# curl_cffi: 自定义浏览器指纹
net = SyncNet(engine="curl_cffi", engine_options={
"impersonate": "chrome120",
})#三级配置覆盖
override.py
from hs_net import NetConfig, SyncNet
# 第 1 级:NetConfig 全局默认
config = NetConfig(timeout=30, retries=5, user_agent="chrome")
# 第 2 级:构造函数覆盖
with SyncNet(config=config, timeout=15) as net:
# timeout=15(构造函数覆盖了 config 的 30)
# retries=5(继承 config)
# user_agent="chrome"(继承 config)
# 第 3 级:请求级覆盖
resp = net.get("https://example.com", timeout=5)
# timeout=5(请求级覆盖了构造函数的 15)#headers 和 cookies 合并
headers 和 cookies 采用合并而非覆盖策略:
merge.py
config = NetConfig(headers={"X-Global": "1"})
with SyncNet(config=config, headers={"X-Instance": "2"}) as net:
resp = net.get("https://example.com", headers={"X-Request": "3"})
# 实际 headers 包含:
# X-Global: 1(来自 config)
# X-Instance: 2(来自构造函数)
# X-Request: 3(来自请求参数)同名 key 以更高优先级的值为准。
#自定义配置
NetConfig 使用 frozen=True(不可变),不支持继承覆盖。如需团队统一配置,直接实例化即可:
team_config.py
from hs_net import NetConfig, EngineEnum, Net, SyncNet
# 团队统一配置
my_config = NetConfig(
engine=EngineEnum.CURL_CFFI,
retries=5,
user_agent="chrome",
verify=False,
)
# 异步
async with Net(config=my_config) as net:
resp = await net.get("https://example.com")
# 同步
with SyncNet(config=my_config) as net:
resp = net.get("https://example.com")
