SearXNG API开发指南:构建基于隐私搜索的应用生态
概述
SearXNG是一个开源的元搜索引擎(Metasearch Engine),它聚合了来自多个搜索引擎的结果,同时保护用户隐私。通过其强大的API接口,开发者可以构建各种基于隐私搜索的应用程序,从简单的搜索集成到复杂的分析工具。
本文将深入探讨SearXNG API的核心功能、使用方法和最佳实践,帮助开发者充分利用这一强大的隐私搜索工具。
API基础
搜索端点
SearXNG提供两个主要的搜索端点:
GET /- 根端点搜索GET /search- 专用搜索端点
两个端点功能相同,支持GET和POST两种HTTP方法。
基本搜索请求
# 基本搜索请求
curl "https://your-searxng-instance/search?q=privacy+search&format=json"
# 使用POST方法
curl -X POST "https://your-searxng-instance/search" \
-d "q=privacy+search" \
-d "format=json"
核心参数详解
必需参数
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
q | string | 搜索查询字符串 | q=privacy+protection |
搜索控制参数
| 参数 | 类型 | 可选值 | 默认值 | 说明 |
|---|---|---|---|---|
categories | string | 逗号分隔的分类名 | 所有分类 | 指定搜索分类 |
engines | string | 逗号分隔的引擎名 | 所有引擎 | 指定搜索引擎 |
language | string | 语言代码 | all | 搜索结果语言 |
pageno | integer | 正整数 | 1 | 页码 |
time_range | string | day, month, year | - | 时间范围过滤 |
输出格式参数
| 参数 | 类型 | 可选值 | 说明 |
|---|---|---|---|
format | string | json, csv, rss | 输出格式 |
隐私和安全参数
| 参数 | 类型 | 可选值 | 默认值 | 说明 |
|---|---|---|---|---|
safesearch | integer | 0, 1, 2 | 实例设置 | 安全搜索级别 |
image_proxy | boolean | True, False | 实例设置 | 图片代理 |
JSON响应格式
SearXNG的JSON响应包含丰富的元数据和搜索结果信息:
{
"query": "搜索关键词",
"number_of_results": 42,
"results": [
{
"title": "搜索结果标题",
"url": "https://example.com",
"content": "搜索结果摘要",
"engine": "搜索引擎名称",
"score": 0.85,
"parsed_url": {
"scheme": "https",
"netloc": "example.com",
"path": "/path/to/page"
}
}
],
"answers": [
{
"answer": "直接答案内容",
"url": "https://source.com",
"infobox": "信息框类型"
}
],
"corrections": ["拼写建议1", "拼写建议2"],
"infoboxes": [
{
"id": "infobox_id",
"content": "信息框内容",
"urls": ["相关链接"]
}
],
"suggestions": ["搜索建议1", "搜索建议2"],
"unresponsive_engines": [
["引擎名称", "错误信息"]
]
}
高级功能
分类搜索
# 搜索特定分类
curl "https://instance/search?q=python&categories=it,general&format=json"
# 使用特定引擎
curl "https://instance/search?q=news&engines=bing_news,google_news&format=json"
多语言支持
# 指定语言搜索
curl "https://instance/search?q=privacy&language=zh&format=json"
# 自动检测语言
curl "https://instance/search?q=privacy&language=auto&format=json"
时间范围过滤
# 搜索最近一天的内容
curl "https://instance/search?q=breaking+news&time_range=day&format=json"
# 搜索最近一个月的内容
curl "https://instance/search?q=technology+trends&time_range=month&format=json"
插件系统集成
SearXNG支持丰富的插件系统,可以通过API参数控制:
# 启用特定插件
curl "https://instance/search?q=test&enabled_plugins=Hash_plugin,Self_Information&format=json"
# 禁用特定插件
curl "https://instance/search?q=test&disabled_plugins=URL_cleaner&format=json"
可用插件列表
| 插件名称 | 功能描述 | 默认状态 |
|---|---|---|
Hash_plugin | 哈希计算功能 | 启用 |
Self_Information | 自信息显示 | 启用 |
URL_cleaner | URL清理 | 启用 |
Ahmia_blacklist | 黑名单过滤 | 启用 |
Hostnames_plugin | 主机名处理 | 禁用 |
Open_Access_DOI_rewrite | DOI重写 | 禁用 |
错误处理
HTTP状态码
| 状态码 | 说明 | 处理建议 |
|---|---|---|
| 200 | 成功 | 正常处理响应 |
| 400 | 参数错误 | 检查请求参数 |
| 403 | 格式禁用 | 检查实例配置 |
| 500 | 服务器错误 | 重试或联系管理员 |
错误响应格式
{
"error": "错误描述信息"
}
性能优化
请求超时控制
# 设置超时时间(秒)
curl "https://instance/search?q=test&timeout_limit=5&format=json"
分页优化
# 控制每页结果数量
curl "https://instance/search?q=test&pageno=2&format=json"
实际应用场景
1. 构建隐私搜索应用
import requests
import json
class PrivacySearchClient:
def __init__(self, instance_url):
self.instance_url = instance_url
def search(self, query, **kwargs):
params = {'q': query, 'format': 'json'}
params.update(kwargs)
response = requests.get(f"{self.instance_url}/search", params=params)
response.raise_for_status()
return response.json()
def search_with_privacy(self, query, language='auto', safesearch=2):
return self.search(
query,
language=language,
safesearch=safesearch,
image_proxy=True
)
# 使用示例
client = PrivacySearchClient("https://search.example.com")
results = client.search_with_privacy("data privacy laws")
2. 搜索结果分析工具
def analyze_search_results(results):
"""分析搜索结果统计数据"""
analysis = {
'total_results': results['number_of_results'],
'successful_engines': len(results['results']),
'failed_engines': len(results['unresponsive_engines']),
'answer_count': len(results['answers']),
'suggestion_count': len(results['suggestions'])
}
# 引擎性能分析
engine_stats = {}
for result in results['results']:
engine = result['engine']
engine_stats[engine] = engine_stats.get(engine, 0) + 1
analysis['engine_distribution'] = engine_stats
return analysis
3. 实时监控仪表板
// 前端集成示例
class SearchDashboard {
constructor(instanceUrl) {
this.instanceUrl = instanceUrl;
}
async performSearch(query, options = {}) {
const params = new URLSearchParams({
q: query,
format: 'json',
...options
});
const response = await fetch(`${this.instanceUrl}/search?${params}`);
if (!response.ok) {
throw new Error(`Search failed: ${response.status}`);
}
return await response.json();
}
updateDashboard(results) {
// 更新UI显示搜索结果
this.displayResults(results.results);
this.showStatistics(results);
this.handleSuggestions(results.suggestions);
}
}
最佳实践
1. 请求频率控制
import time
from ratelimit import limits, sleep_and_retry
class RateLimitedSearXNGClient:
def __init__(self, instance_url):
self.instance_url = instance_url
@sleep_and_retry
@limits(calls=10, period=60) # 每分钟最多10次请求
def search(self, query, **kwargs):
# 实现搜索逻辑
pass
2. 错误重试机制
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_retry_session(retries=3, backoff_factor=0.3):
session = requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=[500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
3. 结果缓存策略
import redis
import json
import hashlib
class CachedSearchClient:
def __init__(self, instance_url, redis_client, ttl=300):
self.instance_url = instance_url
self.redis = redis_client
self.ttl = ttl # 缓存时间(秒)
def _get_cache_key(self, query, params):
param_str = json.dumps(params, sort_keys=True)
return f"search:{hashlib.md5((query + param_str).encode()).hexdigest()}"
def search(self, query, **params):
cache_key = self._get_cache_key(query, params)
# 尝试从缓存获取
cached = self.redis.get(cache_key)
if cached:
return json.loads(cached)
# 执行实际搜索
response = requests.get(f"{self.instance_url}/search",
params={'q': query, 'format': 'json', **params})
results = response.json()
# 缓存结果
self.redis.setex(cache_key, self.ttl, json.dumps(results))
return results
安全考虑
1. HTTPS强制使用
# 始终使用HTTPS连接
https://secure-instance.searxng.com/search?q=query
2. 敏感信息处理
def sanitize_query(query):
"""清理搜索查询中的敏感信息"""
# 移除个人信息
sensitive_patterns = [
r'\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b', # 信用卡号
r'\b\d{3}[- ]?\d{2}[- ]?\d{4}\b', # SSN
# 添加更多敏感模式...
]
for pattern in sensitive_patterns:
query = re.sub(pattern, '[REDACTED]', query)
return query
3. 输入验证
def validate_search_params(params):
"""验证搜索参数"""
allowed_params = {
'q', 'categories', 'engines', 'language', 'pageno',
'time_range', 'format', 'safesearch', 'image_proxy'
}
# 检查未知参数
unknown_params = set(params.keys()) - allowed_params
if unknown_params:
raise ValueError(f"Unknown parameters: {unknown_params}")
# 验证参数值
if 'pageno' in params:
try:
page = int(params['pageno'])
if page < 1:
raise ValueError("Page number must be positive")
except ValueError:
raise ValueError("Invalid page number")
部署考虑
1. 实例选择策略
class MultiInstanceClient:
def __init__(self, instances):
self.instances = instances
self.current_instance = 0
def get_next_instance(self):
instance = self.instances[self.current_instance]
self.current_instance = (self.current_instance + 1) % len(self.instances)
return instance
def search_with_fallback(self, query, **params):
for _ in range(len(self.instances)):
try:
instance = self.get_next_instance()
return self._search_single(instance, query, **params)
except requests.RequestException:
continue
raise Exception("All instances failed")
2. 健康检查
def check_instance_health(instance_url):
"""检查SearXNG实例健康状况"""
try:
response = requests.get(f"{instance_url}/healthz", timeout=5)
return response.status_code == 200
except requests.RequestException:
return False
def get_healthy_instances(instances):
"""获取健康的实例列表"""
healthy_instances = []
for instance in instances:
if check_instance_health(instance):
healthy_instances.append(instance)
return healthy_instances
结论
SearXNG API提供了一个强大而灵活的隐私搜索解决方案,适合构建各种类型的搜索应用。通过本文的指南,开发者可以:
- 快速集成:使用简单的HTTP请求即可集成搜索功能
- 保护隐私:利用SearXNG的隐私保护特性
- 灵活定制:通过丰富的参数控制搜索行为
- 构建生态:开发基于隐私搜索的完整应用生态系统
无论是构建个人搜索工具、企业搜索解决方案,还是开发隐私保护的搜索引擎,SearXNG API都能提供可靠的技术基础。随着隐私保护意识的增强,基于SearXNG的应用开发将成为越来越重要的技术方向。
记住,在使用任何搜索API时,都要尊重服务条款,合理控制请求频率,并始终优先考虑用户隐私保护。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



