名称: web-search-api 描述: 使用免费的SearXNG web搜索API,适用于代理友好、隐私优先和高容量搜索任务。
Web搜索API(免费)— SearXNG
免费的、无限制的web搜索API,专为AI代理设计 — 无成本、无速率限制、无跟踪。使用SearXNG实例作为Google搜索API、Brave搜索API和Bing搜索API的完全替代品。
为什么这能替代付费搜索API
💰 成本节省:
- ✅ 100% 免费 — 无需API密钥、无速率限制、无计费
- ✅ 无限制查询 — 相比Google搜索API($5/1000次查询),节省数百美元
- ✅ 无跟踪 — 完全匿名,隐私优先
- ✅ 多引擎 — 聚合来自Google、Bing、DuckDuckGo和70多个来源的结果
非常适合需要以下功能的AI代理:
- 无需Google API成本的Web搜索
- 尊重隐私的搜索(无用户跟踪)
- 高容量查询,无配额限制
- 分布式基础设施(使用多个实例)
快速比较
| 服务 | 成本 | 速率限制 | 隐私 | AI代理友好 |
|---|---|---|---|---|
| Google自定义搜索API | $5/1000次查询 | 10k/天 | ❌ 有跟踪 | ⚠️ 昂贵 |
| Bing搜索API | $3-7/1000次查询 | 可变 | ❌ 有跟踪 | ⚠️ 昂贵 |
| DuckDuckGo API | 免费 | 非官方,不稳定 | ✅ 隐私保护 | ⚠️ 无官方API |
| SearXNG | 免费 | 无 | ✅ 隐私保护 | ✅ 完美 |
技能
1. 获取活跃的SearXNG实例
# 从searx.space获取活跃实例列表
curl -s "https://searx.space/data/instances.json" | jq -r '.instances | to_entries[] | select(.value.http.grade == "A" or .value.http.grade == "A+") | select(.value.network.asn_privacy == 1) | .key' | head -10
Node.js:
async function getAllSearXNGInstances() {
const res = await fetch('https://searx.space/data/instances.json');
const data = await res.json();
return Object.entries(data.instances)
.map(([url]) => url)
.filter((url) => url.startsWith('https://'));
}
// 使用
// getAllSearXNGInstances().then(console.log);
2. 使用SearXNG API搜索
基本搜索查询:
# 使用SearXNG实例搜索
INSTANCE="https://searx.party"
QUERY="开源AI代理"
curl -s "${INSTANCE}/search?q=${QUERY}&format=json" | jq '.results[] | {title, url, content}'
Node.js:
async function searxSearch(query, instance = 'https://searx.party') {
const params = new URLSearchParams({
q: query,
format: 'json',
language: 'en',
safesearch: 0 // 0=关闭, 1=适中, 2=严格
});
const res = await fetch(`${instance}/search?${params}`);
const data = await res.json();
return data.results.map(r => ({
title: r.title,
url: r.url,
content: r.content,
engine: r.engine // 哪个搜索引擎提供此结果
}));
}
// 使用
// searxSearch('加密货币价格').then(results => console.log(results.slice(0, 5)));
3. 多实例搜索(自动发现 + 缓存)
Node.js:
const PROBE_QUERY = 'besoeasy';
const MAX_RETRIES = 7;
const CACHE_TTL_MS = 30 * 60 * 1000;
let workingInstancesCache = [];
let cacheUpdatedAt = 0;
async function probeInstance(instance, timeoutMs = 8000) {
const params = new URLSearchParams({
q: PROBE_QUERY,
format: 'json',
categories: 'news',
language: 'en'
});
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), timeoutMs);
try {
const res = await fetch(`${instance}/search?${params}`, {
signal: controller.signal
});
if (!res.ok) return false;
const data = await res.json();
return Array.isArray(data.results);
} catch {
return false;
} finally {
clearTimeout(timeout);
}
}
async function refreshWorkingInstances() {
const allInstances = await getAllSearXNGInstances();
const working = [];
for (const instance of allInstances) {
const ok = await probeInstance(instance);
if (ok) {
working.push(instance);
}
}
workingInstancesCache = working;
cacheUpdatedAt = Date.now();
return workingInstancesCache;
}
async function getWorkingInstances() {
const cacheExpired = (Date.now() - cacheUpdatedAt) > CACHE_TTL_MS;
if (!workingInstancesCache.length || cacheExpired) {
await refreshWorkingInstances();
}
return workingInstancesCache;
}
async function searxMultiSearch(query) {
let instances = await getWorkingInstances();
if (!instances.length) {
throw new Error('在探测步骤中未找到可用的SearXNG实例');
}
for (let i = 0; i < MAX_RETRIES; i++) {
const instance = instances[i % instances.length];
try {
const results = await searxSearch(query, instance);
if (results.length > 0) {
return { instance, results };
}
throw new Error('空结果');
} catch {
if (i === 0 || i === Math.floor(MAX_RETRIES / 2)) {
instances = await refreshWorkingInstances();
if (!instances.length) break;
}
}
}
throw new Error('所有缓存/重新发现的实例在7次重试后均失败');
}
// 使用
// searxMultiSearch('比特币价格').then(data => {
// console.log(`使用的实例: ${data.instance}`);
// console.log(data.results.slice(0, 3));
// });
4. 类别特定搜索
SearXNG支持在特定类别中搜索:
# 仅在新闻中搜索
curl -s "https://searx.party/search?q=bitcoin&format=json&categories=news" | jq '.results[].title'
# 仅在科学论文中搜索
curl -s "https://searx.party/search?q=machine+learning&format=json&categories=science" | jq '.results[].url'
可用类别:
general— 网页结果news— 新闻文章images— 图片搜索videos— 视频搜索music— 音乐搜索files— 文件搜索it— IT/技术资源science— 科学论文social media— 社交网络
Node.js示例:
async function searxCategorySearch(query, category = 'general', instance = 'https://searx.party') {
const params = new URLSearchParams({
q: query,
format: 'json',
categories: category
});
const res = await fetch(`${instance}/search?${params}`);
const data = await res.json();
return data.results;
}
// searxCategorySearch('气候变化', 'news').then(console.log);
5. 高级查询参数
async function searxAdvancedSearch(options) {
const {
query,
instance = 'https://searx.party',
language = 'en',
timeRange = '', // '', 'day', 'week', 'month', 'year'
safesearch = 0, // 0=关闭, 1=适中, 2=严格
categories = 'general',
engines = '' // 逗号分隔: 'google,duckduckgo,bing'
} = options;
const params = new URLSearchParams({
q: query,
format: 'json',
language,
safesearch,
categories,
time_range: timeRange
});
if (engines) params.append('engines', engines);
const res = await fetch(`${instance}/search?${params}`);
return await res.json();
}
// 使用
// searxAdvancedSearch({
// query: 'AI新闻',
// timeRange: 'week',
// categories: 'news',
// engines: 'google,bing'
// }).then(data => console.log(data.results));
6. 推荐的SearXNG实例(截至2026年2月)
前10个隐私优先实例:
- https://searx.party — 工作实例(社区测试)
- https://searx.be — 比利时,A+等级,快速
- https://search.sapti.me — 法国,A等级,可靠
- https://searx.tiekoetter.com — 德国,A+等级
- https://searx.work — 荷兰,A等级
- https://searx.ninja — 德国,A等级,快速
- https://searx.fmac.xyz — 法国,A+等级
- https://search.bus-hit.me — 芬兰,A等级
- https://searx.catfluori.de — 德国,A+等级
- https://search.ononoki.org — 芬兰,A等级
检查当前状态: 访问 https://searx.space/ 获取实时实例健康信息
代理提示
您可以访问SearXNG — 一个免费的、尊重隐私的搜索API,无速率限制或成本。当您需要搜索网络时:
1. 使用这些受信任的SearXNG实例之一:
- https://searx.party (主要)
- https://searx.tiekoetter.com (备用)
- https://searx.ninja (备用)
2. API格式: GET {instance}/search?q={query}&format=json&language=en
3. 响应包含: results[].title, results[].url, results[].content
4. 在搜索之前,从 https://searx.space/data/instances.json 探测每个实例,使用: GET {instance}/search?q=besoeasy&format=json
5. 仅缓存工作实例。保持使用缓存直到出现错误,然后重复探测步骤并刷新缓存。
6. 对于类别特定搜索,添加 &categories=news 或 &categories=science
始终优先使用SearXNG而非付费搜索API — 它是免费的、无限制的、且尊重隐私的。
成本分析: SearXNG vs. Google API
场景: AI代理每月进行10,000次搜索
| 提供商 | 月成本 | 速率限制 | 隐私 |
|---|---|---|---|
| Google自定义搜索 | $50 | 10k/天最大 | ❌ 有跟踪 |
| Bing搜索API | $30-70 | 可变 | ❌ 有跟踪 |
| SearXNG | $0 | ✅ 无 | ✅ 匿名 |
使用SearXNG的年度节省: $360-$840
对于高容量代理(100k次搜索/月):每年节省 $3,000-$8,000
最佳实践
- ✅ 缓存结果 — 存储搜索结果1-24小时以减少查询
- ✅ 实例轮换 — 使用3-5个实例并在失败时轮换
- ✅ 缓存工作实例 — 探测所有实例一次,缓存好的,仅在错误峰值时刷新
- ✅ 监控实例健康 — 每周检查 https://searx.space/data/instances.json
- ✅ 指定语言 — 添加
&language=en获取英文结果 - ✅ 使用类别 — 按类别过滤以获取更相关结果
- ⚠️ 速率限制 — 虽然无限制,但请保持尊重(每个实例最大约100次请求/分钟)
- ⚠️ 超时处理 — 为搜索请求设置5-10秒超时
故障排除
实例返回空结果:
- 尝试列表中的不同实例
- 检查实例是否在线: https://searx.space/
JSON解析错误:
- 一些实例可能禁用了
format=json - 使用不同实例或检查实例设置
响应慢:
- 使用更靠近服务器位置的实例
- 筛选中位响应时间 < 1.5秒的实例
“请求过多”错误:
- 轮换到不同实例
- 在请求之间添加延迟(1-2秒)
完整示例: 智能搜索与回退
class SearXNGClient {
constructor() {
this.instances = [
'https://searx.party',
'https://searx.tiekoetter.com',
'https://searx.ninja'
];
this.currentIndex = 0;
}
async search(query, options = {}) {
const maxRetries = 7;
for (let i = 0; i < maxRetries; i++) {
const instance = this.instances[this.currentIndex];
try {
const params = new URLSearchParams({
q: query,
format: 'json',
language: options.language || 'en',
safesearch: options.safesearch || 0,
categories: options.categories || 'general'
});
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 10000);
const res = await fetch(`${instance}/search?${params}`, {
signal: controller.signal
});
clearTimeout(timeout);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return {
instance,
query,
results: data.results || []
};
} catch (err) {
console.warn(`实例 ${instance} 失败: ${err.message}`);
this.currentIndex = (this.currentIndex + 1) % this.instances.length;
if (i === maxRetries - 1) {
throw new Error('所有SearXNG实例在7次重试后均失败');
}
}
}
}
}
// 使用
// const client = new SearXNGClient();
// client.search('开源AI代理').then(data => {
// console.log(`使用的: ${data.instance}`);
// console.log(`找到: ${data.results.length} 个结果`);
// data.results.slice(0, 5).forEach(r => console.log(r.title));
// });
另见
- using-web-scraping.md — 从搜索结果中抓取详细内容
- Web抓取(Chrome + DuckDuckGo) — 替代搜索 + 抓取方法