当前位置: 首页 > news >正文

零成本自建搜索 API:用 SearXNG 搭建免费、无限制的元搜索引擎

你是否需要一个免费的、无请求次数限制的 Web 搜索 API?本文教你用开源项目 SearXNG 在自有服务器上部署一个支持 JSON 输出的搜索引擎“中转站”,完美替代 Google/Bing 付费 API,每日数千次请求稳定运行。


🧐 为什么需要自建搜索 API?

在做内容聚合、信息检索或 AI 应用时,经常需要调用搜索引擎获取网页结果。但商业 API(Google Custom Search、Bing Search)要么免费额度极低(每天 100 次),要么即将停止服务(Bing Search API 2025 年关闭),而直接爬虫又容易被封 IP。

SearXNG是完美的解决方案:

  • 完全免费:开源,无使用次数限制,成本只取决于你的服务器。

  • 元搜索引擎:同时聚合 Google、Bing、DuckDuckGo 等 70+ 引擎,自动去重。

  • 支持 JSON API:原生提供format=json,程序调用非常方便。

  • 隐私友好:不记录日志,不追踪用户。

  • 高度可控:可自由选择搜索引擎、限速、部署反向代理等。


🛠️ 环境要求

  • 操作系统:Ubuntu 24.04(其他 Linux 发行版同样适用)

  • 配置:1 核 CPU + 1 GB 内存即可(日均 1k~3k 次请求无压力)

  • 网络:服务器需能够正常访问 Google、Bing 等搜索引擎(海外 VPS 最佳)

  • 工具:DockerDocker Compose(脚本会自动安装)


🚀 一键部署

将以下脚本保存为install.sh,用root用户执行即可。一键完成 Docker 安装、配置文件生成和容器启动。

#!/bin/bash set -e # ---------- 配置变量(请修改为你的实际信息)---------- SEARXNG_DIR="/data/searxng" # 部署目录 SERVER_IP="your-server-ip" # 替换为你的服务器公网IP或域名 # ---------------------------------------------------- SECRET_KEY=$(openssl rand -hex 32) # 安装 Docker(如已安装则跳过) if ! command -v docker &> /dev/null; then echo "正在安装 Docker..." curl -fsSL https://get.docker.com | bash systemctl enable docker --now fi # 创建目录结构 mkdir -p "${SEARXNG_DIR}"/{searxng,data/redis,data/searxng} # 生成 docker-compose.yml cat > "${SEARXNG_DIR}/docker-compose.yml" <<EOF services: redis: image: valkey/valkey:8-alpine container_name: searxng-redis restart: unless-stopped command: valkey-server --save 30 1 --loglevel warning networks: - searxng-network volumes: - ./data/redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 searxng: image: searxng/searxng:latest container_name: searxng restart: unless-stopped depends_on: redis: condition: service_healthy networks: - searxng-network ports: - "8002:8080" # 宿主机端口:容器内端口(容器内固定为8080) volumes: - ./searxng/settings.yml:/etc/searxng/settings.yml:ro - ./data/searxng:/var/cache/searxng environment: - SEARXNG_BASE_URL=http://${SERVER_IP}:8002/ # 末尾斜杠不可省略 - INSTANCE_NAME=my-searxng-api networks: searxng-network: driver: bridge EOF # 生成 settings.yml(开启 JSON API,关闭内置限速) cat > "${SEARXNG_DIR}/searxng/settings.yml" <<EOF use_default_settings: true general: instance_name: "SearXNG API" search: safe_search: 0 formats: - html - json # 必须保留 json,否则 API 返回 403 results_per_page: 10 server: secret_key: "${SECRET_KEY}" limiter: false # 关闭自限速,由调用程序自行控制频率 image_proxy: false bind_address: "0.0.0.0" port: 8080 ui: default_theme: simple # 此处不限定搜索引擎,可在 API 请求时通过 engines 参数动态指定 outgoing: request_timeout: 10.0 max_request_timeout: 15.0 useragent_suffix: "" pool_connections: 20 pool_maxsize: 5 EOF # 启动服务 cd "${SEARXNG_DIR}" docker compose up -d sleep 5 echo "部署完成!" echo "Web 界面: http://${SERVER_IP}:8002" echo "API 端点: http://${SERVER_IP}:8002/search?q=关键词&format=json"

执行方式:

bash

复制

下载

# 赋予执行权限 chmod +x install.sh # 运行(必须 root 权限) sudo bash install.sh

📌 如果脚本执行时出现\r相关错误,说明文件包含 Windows 换行符。执行sed -i 's/\r$//' install.sh修复后再运行。


⚙️ 配置要点解读

  1. 端口映射docker-compose.ymlports: "8002:8080"表示将宿主机的8002端口映射到容器内的8080端口(SearXNG 内部固定监听 8080)。你可以根据需求修改宿主机端口。

  2. BASE_URL:环境变量SEARXNG_BASE_URL必须设置为外部可访问的地址,末尾斜杠/不能省略,否则返回的链接可能出错。

  3. JSON 输出settings.yml中的search.formats必须包含json,否则 API 请求会返回403 Forbidden

  4. 限速策略:我们已将server.limiter设为false,关闭 SearXNG 自身的限流器。每日数千次请求的安全由调用方控制频率(建议间隔 ≥ 1 秒)来保证,避免给上游引擎造成过大压力。

  5. 引擎选择:我们没有在配置中限定搜索引擎,而是推荐在 API 请求时通过engines=google,bing参数动态指定,灵活且不易因配置语法变化而报错。


🧪 测试验证

1. 检查容器状态

bash

复制

下载

docker ps | grep searxng

两个容器(searxng 和 searxng-redis)状态均应为Up

2. 命令行测试 API

bash

# 基本查询(注意关键词中的空格需 URL 编码,此处用 --data-urlencode 自动处理) curl -G "http://localhost:8002/search" \ --data-urlencode "q=hello world" \ --data-urlencode "format=json" \ --data-urlencode "engines=google,bing"

返回 JSON 数据表示成功。若返回空或错误,请检查docker compose logs searxng查看日志。

3. 浏览器验证

访问http://your-server-ip:8002,能看到 SearXNG 的搜索页面,说明前端正常。


🐍 编程调用示例 (Python)

import requests import time def search(query, engines="google,bing", language="zh-CN"): params = { "q": query, "format": "json", "engines": engines, "language": language } resp = requests.get("http://your-server-ip:8002/search", params=params) resp.raise_for_status() return resp.json() # 示例:查询 ISBN data = search("9789575037109") for item in data.get("results", []): print(item["title"], item["url"]) time.sleep(1) # 控制请求间隔,避免被上游限制

请求间隔建议:每日 1k~3k 次请求,保持至少 1 秒间隔即可安全运行。若服务器 IP 信誉良好,甚至可适当加快,但强烈不建议低于 0.5 秒。


🔧 常见问题与排错

问题现象可能原因解决方法
容器状态Restartingsettings.yml格式错误检查 YAML 缩进,或使用默认配置先启动再逐步调整
端口监听不到ss -tlnp无输出端口映射错误,如写成8002:8002修改为8002:8080,重启容器
API 返回 403formats中缺少jsonsettings.ymlsearch.formats列表中添加- json
curl报错Malformed inputURL 中包含未编码的空格或特殊字符使用--data-urlencode或对空格编码为%20
Bing 返回大量不相关结果Bing 对某些查询的语义理解偏差尝试只使用engines=google,或加上language=zh-CN参数
容器日志TypeError: string indices...engines配置使用了不兼容的keep_only语法移除配置中的引擎限制,改用 API 参数动态指定

🚀 进阶优化

  • 反向代理与 HTTPS:可以使用 Caddy 或 Nginx 反代localhost:8002,添加 SSL 证书,对外仅暴露 443 端口。

  • 防火墙:建议限制8002端口仅允许本地或特定 IP 访问,避免被外部扫描滥用。

  • 备用引擎:除了 Google/Bing,建议在请求中加入duckduckgo作为备用(engines=google,bing,duckduckgo),当一个引擎失效时依然能获取结果。

  • 监控与日志docker compose logs -f searxng可实时查看请求日志。


🎉 总结

至此,你已经拥有了一个完全免费、无调用次数限制、输出 JSON 的搜索 API。无论是做个人项目还是小型商业应用,这套方案都能长期稳定运行。如果你觉得有用,欢迎分享给更多需要的人!

http://www.jsqmd.com/news/828209/

相关文章:

  • OmenSuperHub深度解析:3个关键技术突破彻底改变惠普游戏本性能管理体验
  • SDEP协议与SPI-BLE数据传输:从理论到实战的深度解析
  • 手把手教你用MPU6050和nRF52832做手环计步:避开数据读取卡死的坑
  • 5分钟快速上手:用Tinke免费工具轻松解包修改NDS游戏资源
  • AI代码助手Cursor高效配置指南:从工具使用到工作流集成
  • C++中的 const 与 volatile:比C强大十倍
  • Code-Act框架:让AI通过代码生成与执行实现智能体“动手”能力
  • Cursor Free VIP:突破AI编程助手使用限制的完整解决方案
  • 麒麟服务器版(ARM架构)离线安装 telnet
  • Py-GPT:本地化多模型AI助手与自动化工作流实战指南
  • 终极指南:如何快速解决iPhone在Windows上的USB网络共享问题
  • ArcGIS实战:手把手教你拼接与裁剪全国10米建筑高度栅格数据(以武汉为例)
  • SuperMap iServer实战:5分钟搞定ArcGIS在线服务的代理与二次开发(REST API调用详解)
  • 杰理之开混合录音插设备播放不了【篇】
  • 对比按量计费与Token Plan套餐在长期项目中的成本感受
  • 告别硬编码!用LVGL Keyboard控件5分钟搞定嵌入式设备的输入法界面
  • ITK-SNAP医学图像分割:免费开源工具终极指南,快速掌握3D影像分析
  • 手把手教你用C28x DSP实现高效中断嵌套:以电机控制FOC算法中的ADC与PWM同步为例
  • 为ESP32智能灯光项目3D打印定制保护外壳:从设计到实战
  • Open-Meteo:构建免费开源天气API的完整技术解决方案
  • 北京靠谱小程序开发公司推荐 实用选择攻略 - 软件测评师
  • 不用写代码 !OpenClaw Win10 自动化配置实战
  • Windows驱动签名实战:从证书获取到安装包封装的完整指南
  • 从智能垃圾桶到桌面风扇:L293D和L298N在5V/12V小项目里的实战避坑指南
  • 基于CircuitPython的红外遥控发射器:从原理到实现的万能控制方案
  • 黑白胶片质感生成全链路拆解,深度解析--style raw、--contrast 85与--no color的黄金三角参数关系
  • BEAGLE库终极指南:如何快速实现高性能系统发育分析
  • 3个高效技巧解决Gopeed下载403难题
  • 网安面试封神题库|2026 最全最实用面试题
  • 芯片老化座还有哪些应用场景?-研发测试