feat(v2.0.0): 反爬增强 + 抓取稳定性大幅提升
反爬措施: - 浏览器指纹头 build_browser_headers(): Sec-Ch-Ua/Sec-Fetch-*/Accept-Language/Accept-Encoding, 绕过 80%+ 轻量 WAF - 12 个 UA 池 (Chrome/Edge/Firefox x Win/macOS/Linux x v129-131) - 确定性 UA 轮换 get_ua_for_domain(): SHA-256 按域名固定 UA, 会话内稳定跨进程可复现 - WAF 指纹库 _detect_anti_bot(): 识别 Cloudflare/Imperva/PerimeterX/DataDome/Akamai/通用, 全文档扫描 - Retry-After 遵守: 429/503 读取 header (数字或 HTTP date) 作为最小重试延迟 - 退避封顶 60s (原无上限, N=10 时 1536s 卡死进程) 抓取稳定性: - requests.Session 复用: 连接池(10/host) + cookie 持久化 + TLS 会话恢复 - 超时分离 (connect, read) 元组, 避免大页面浪费已建连接 - Wayback Machine 兜底: 404/403/超时自动重试 web.archive.org, 默认启用 --no-fallback 关闭 - AdaptiveThrottle 自适应限流: 3 次失败翻倍延迟+减半并发, 5 次成功渐进恢复, 429 全局暂停 30s - readability-lite 提取: article/main 缺失时按文本密度选最可能正文 div 新增 CLI flags: - --fetch-report: 结构化抓取报告到 stderr (每 URL 状态/WAF 类型/兜底方式/字符数 + JSON 摘要) - --no-fallback: 禁用 Wayback 兜底 - --referer: 设置 Referer 头 (默认实例 URL) - --request-delay: 抓取请求间隔秒数 (默认 0.3, 自适应可能增大) fetch 结果新字段: anti_bot_detected (bool), waf_type (str|null), fallback_used (str|null) 测试: 新增 4 个测试文件 (test_browser_headers/test_anti_bot/test_wayback_fallback/test_adaptive_throttle), 451 个测试全部通过
This commit is contained in:
@@ -33,6 +33,8 @@ def _make_args(**overrides):
|
||||
"""Build a minimal args object matching the argparse.Namespace shape
|
||||
that ``_run_single_query`` reads. All fields _run_single_query touches
|
||||
are present with sensible defaults; tests override only what they need.
|
||||
|
||||
v2.0.0: added referer, no_fallback, fetch_report, request_delay.
|
||||
"""
|
||||
base = dict(
|
||||
query="test", format="json", method="GET", timeout=15, retry=0,
|
||||
@@ -41,6 +43,9 @@ def _make_args(**overrides):
|
||||
fetch_retries=3, max_size=None, cache_ttl=0, snippet_len=0,
|
||||
categories=None, language=None, pageno=1, time_range="year",
|
||||
safesearch=0, engines="google,bing",
|
||||
# v2.0.0 new fields
|
||||
referer=None, no_fallback=False, fetch_report=False,
|
||||
request_delay=0.3,
|
||||
)
|
||||
base.update(overrides)
|
||||
return SimpleNamespace(**base)
|
||||
@@ -260,9 +265,10 @@ def _run_cli(*args, env=None):
|
||||
|
||||
def test_cli_version_prints_version():
|
||||
"""`--version` exits 0 and prints the version string."""
|
||||
from _config import VERSION
|
||||
r = _run_cli("--version")
|
||||
assert r.returncode == 0
|
||||
assert "1.8.1" in r.stdout
|
||||
assert VERSION in r.stdout
|
||||
assert "searxng-cli" in r.stdout
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user