multi-search-engine · v3.0.0 · 2026-10-26 · sha256 b391a5121060163d
multi-search-engine v3.0.0A
Immutable. This exact content never changes and is served at /api/v1/blob/b391a5121060163d.
---
slug: multi-search-engine
name: multi-search-engine
version: "3.0.0"
displayName: 多引擎搜索
summary: "提供16个搜索引擎(7国内直连+9国际)跨引擎检索、自动去重与多源交叉验证,无需API Key,附零依赖脚本"
license: MIT
description: |-
通过公开搜索URL在16个搜索引擎(7个国内直连+9个国际)中做跨引擎检索、结果去重与多源交叉验证,无需API Key,内置零依赖Python脚本。Use when 用户要求“搜一下/查资料/多找几个来源/核实消息/找公众号文章/排查报错/找论文或开源项目”时。输入自然语言查询词,输出带来源链接与可信度标注的结构化结果。不适用于私有数据检索、批量抓取、需要登录后可见的内容。
tags:
- 信息检索
- 网络搜索
- 多源验证
- 资料调研
- search
- research
tools:
- read
- exec
category: Knowledge
pricing_tier: "L2-标准级"
---
# 多引擎搜索
通过公开搜索 URL 聚合 16 个搜索引擎,做跨源检索、去重与交叉验证。**不需要任何 API Key**。
本技能包包含:
- `SKILL.md`(本文件):选引擎、构造查询、抓取降级、结果综合的完整流程
- `scripts/multi_search.py`:零第三方依赖脚本(Python 3.7+ 标准库),链接生成 + 抓取聚合
- `references/engines.md`:16 引擎完整目录、可达性标注、10 个垂直站点、意图选型矩阵
- `references/operators.md`:搜索操作符、时间过滤、DuckDuckGo Bangs 速查
## 核心能力
- **16 引擎统一检索**:7 个国内直连(必应中国/必应国际入口/百度/360/搜狗/微信/神马)+ 9 个国际(Google/Google HK/DuckDuckGo/Ecosia/Yahoo/Startpage/Brave/Qwant/WolframAlpha),每个引擎标注网络要求、反爬强度与适用意图。
- **两种执行方式**:Agent 直接用网页抓取工具请求搜索 URL;或运行内置脚本(默认“链接模式”任何环境可用,`--fetch` 抓取模式自动提取标题和链接)。
- **精准查询构造**:`site:`、`filetype:`、`intitle:`、精确匹配、排除词、时间范围、中英双语改写、DuckDuckGo Bangs。
- **多源去重与加权**:URL 规范化去跟踪参数,还原必应/Google/DDG/360 的中转链接,被多个引擎同时命中的结果自动排前。
- **失败可降级**:遇到 403/429/验证码/超时自动换端点、换引擎;全部失败仍输出可点击的搜索链接,保证任务不空手而归。
## 适用场景
| 用户怎么说 | 本技能做什么 |
|---|---|
| “帮我搜一下最近的国产大模型发布消息,多找几个来源” | 国内引擎组 + 时间过滤,聚合去重后按来源数排序 |
| “这个报错是什么意思:`asyncio TimeoutError`” | 必应国际入口 + `site:stackoverflow.com/github.com` 检索排错资料 |
| “找几篇讲 RAG 评测的公众号文章” | 微信搜索(搜狗微信入口)+ 搜狗网页兜底 |
| “核实一下这条传言是不是真的” | 3 个以上独立引擎交叉验证,标注一致来源与冲突点 |
| “找 transformer 相关的开源项目 / 学术论文” | 追加 GitHub、Google/百度学术垂直站点 |
**不适用于**:
- 私有数据、企业内网、个人文件的检索(这些内容不在公开搜索索引中)
- 大规模批量抓取或监控(本技能内置频率约束,不做采集器)
- 需要登录后可见的内容(私域社群、付费数据库、邮箱等)
- 搜索引擎结果页内的信息仅作线索,关键事实必须打开原文核实后再采信
## 使用流程
### Step 1:判断网络环境与查询语言
- 查询以中文为主 → 优先国内引擎组(大陆直连,成功率高)。
- 查询以英文为主、或找官方英文文档 → 优先必应国际入口(`ensearch=1`,大陆可直出国际结果);在可访问国际互联网的环境下再用 Google/DDG。
- 中英混合的技术主题 → 双语各搜一轮,例如中文「向量数据库选型」与英文「vector database comparison 2026」。
### Step 2:按意图选 2–4 个引擎
不要默认查全部 16 个引擎。日常检索选 2–4 个最相关的即可;需要事实核实时再扩到 3–5 个独立索引。
| 场景 | 国内环境默认组 | 国际网络环境默认组 |
|---|---|---|
| 综合/找官网 | `bing-cn`、`baidu` | `google`、`duckduckgo` |
| 英文技术排错 | `bing-int`、`bing-cn` | `google`、`duckduckgo`、`stackoverflow` |
| 中文资讯/热点 | `baidu`、`so360`、`sogou` | `google`(加时间过滤) |
| 公众号文章 | `weixin`、`sogou` | — |
完整意图矩阵(学术、隐私、计算、视频等)见 `references/engines.md`。
### Step 3:构造查询词与搜索 URL
- URL 模板形如 `https://cn.bing.com/search?q={关键词}&ensearch=0`,关键词需百分号编码(手工拼接时空格用 `+` 或 `%20`,中文直接用脚本编码)。
- 需要收敛结果时加操作符:`site:域名`、`filetype:pdf`、`"精确短语"`、`-排除词`、`intitle:词`。
- 需要时效信息时加时间参数(Google `tbs=qdr:d/w/m`、搜狗 `tsn`、DDG `df`),脚本统一用 `--time`。
- 操作符兼容性与更多示例见 `references/operators.md`。
### Step 4:执行检索(二选一)
- **方式 A:Agent 网页抓取**(无需脚本,适合单次查询):直接抓取拼好的搜索 URL,见下文“执行方式”。
- **方式 B:内置脚本**(适合多引擎、要 JSON/报告文件、可复现):运行 `scripts/multi_search.py`。
### Step 5:失败降级(按顺序尝试,不要死磕一个引擎)
1. **会话重试**:首次请求遇 403/418/429/503 时,脚本会先 GET 一次该引擎首页、用内存中的会话 Cookie 等待 2 秒后重试 1 次(Cookie 不落盘、不模拟登录)。
2. **端点降级**:仍失败则换端点,如 DuckDuckGo 主端点失败换 `lite.duckduckgo.com/lite/`;Google 失败加 `&gbv=1` 基础版。
3. **引擎降级**:Google 不可达 → 必应国际入口 → Ecosia;百度/搜狗出现验证码 → 必应中国、360。
4. **垂直绕行**:知乎、Stack Overflow 等站点直连抓取常被拒,改用综合引擎加 `site:`,如在必应搜 `site:zhihu.com 大模型面试`。
5. **链接兜底**:抓取全部失败时,把各引擎搜索链接直接提供给用户点击,并说明哪些引擎不可用。
6. 出现验证码或人机校验页面时**立即停止该引擎请求**,不尝试规避、不做反复重试。
### Step 6:去重、交叉验证与输出
- 以规范化 URL 去重(自动忽略 utm/spm 等跟踪参数);保留每条结果的来源引擎。
- 多引擎同时命中的结果排前面;只有单一来源、尤其来自内容农场的结果要降级看待。
- 回答时先给结论,再用编号列出可点击来源;来源之间有冲突时明确写出分歧,不编造统一说法。
- 输出中不复制搜索结果页上的大段原文;需要细节时打开原文链接阅读后再概括。
## 执行方式
### 方式 A:用 Agent 的网页抓取工具
直接请求搜索 URL(以下示例均为完整可执行形式):
```text
web_fetch({"url": "https://cn.bing.com/search?q=asyncio+TimeoutError+site:stackoverflow.com&ensearch=1"})
web_fetch({"url": "https://www.baidu.com/s?wd=site:zhihu.com+%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%9D%A2%E8%AF%95"})
web_fetch({"url": "https://weixin.sogou.com/weixin?type=2&query=RAG%E8%AF%84%E6%B5%8B"})
web_fetch({"url": "https://html.duckduckgo.com/html/?q=vector+database+comparison+2026"})
web_fetch({"url": "https://www.google.com/search?q=ai+news&tbs=qdr:w&gbv=1"})
web_fetch({"url": "https://www.wolframalpha.com/input?i=100+USD+to+CNY"})
```
多个引擎之间留出 1–2 秒间隔,单批 3–4 个引擎顺序执行;请求头按普通浏览器标识自己。
### 方式 B:内置脚本 scripts/multi_search.py
零第三方依赖,Windows / macOS / Linux 均可运行(Windows 用 `python`,macOS/Linux 用 `python3`)。下述命令与参数均已在 Windows + Python 3 环境实测运行(2026-10),脚本通过 `py_compile` 编译检查,实测耗时与产出见下文“效率量化分析与差异化对比”。
```bash
# 查看全部引擎 id 与适用说明
python scripts/multi_search.py --list-engines
# 默认:国内 3 引擎链接模式,不发起网络请求,任何环境都能跑
python scripts/multi_search.py "FastAPI 教程"
# 指定引擎抓取聚合,输出 Markdown 报告
python scripts/multi_search.py "asyncio TimeoutError" -e bing-int,bing-cn,baidu --fetch
# 最近一周的新闻,输出 JSON 供后续程序处理
python scripts/multi_search.py "AI 发布" -e sogou --time w --fetch --json
# 国内 7 引擎 + GitHub 垂直站,报告存文件
python scripts/multi_search.py "transformer" --cn --vertical github --fetch --output report.md
```
| 参数 | 说明 |
|---|---|
| `-e, --engines` | 引擎 id 逗号分隔;缺省为国内默认组 `bing-cn,baidu,sogou` |
| `--cn` / `--global` / `--all` | 国内 7 个 / 国际 9 个 / 全部 16 个 |
| `--vertical` | 追加垂直站点:github、stackoverflow、zhihu、bilibili、juejin、scholar、baiduxs 等 |
| `--time h/d/w/m/y` | 时间范围(Google、搜狗、DuckDuckGo 生效) |
| `--fetch` | 实际抓取并提取结果;缺省只生成可点击链接 |
| `--limit` / `--delay` / `--timeout` | 每引擎条数(默认 8)/ 请求间隔秒(默认 1.5)/ 超时秒(默认 10) |
| `--json` / `--output 文件` | JSON 输出 / 报告保存到文件(默认仅打印,不写磁盘) |
可运行性验证:下列为 2026-10 真实运行 `python scripts/multi_search.py "FastAPI 教程" -e bing-cn,baidu,so360 --fetch --delay 1 --json` 的输出截取(退出码 0,全程约 7 秒):
```json
{
"query": "FastAPI 教程",
"mode": "fetch",
"engines_ok": ["bing-cn", "baidu", "so360"],
"engines_failed": [],
"result_count": 22,
"results": [
{"rank": 1, "title": "FastAPI 教程 | 菜鸟教程",
"url": "https://www.runoob.com/fastapi/fastapi-tutorial.html",
"engines": ["bing-cn", "so360"], "snippet": ""}
]
}
```
链接模式实测输出(`python scripts/multi_search.py "FastAPI 教程"`,约 0.3 秒,零网络请求)为一张 Markdown 表格,逐行列出 3 个引擎各自的可点击搜索链接。
## 输出规范
抓取模式输出结构(脚本与 Agent 综合时保持一致):
```json
{
"query": "asyncio TimeoutError",
"mode": "fetch",
"searched_at": "2026-10-11T17:00:00",
"engines_ok": ["bing-int", "bing-cn"],
"engines_failed": [{"engine": "google", "reason": "网络不可达/超时(该引擎可能需国际网络)"}],
"result_count": 14,
"results": [
{"rank": 1, "title": "…", "url": "https://…", "engines": ["bing-int", "bing-cn"], "snippet": "…"}
],
"search_links": {"bing-int": "https://cn.bing.com/search?q=…&ensearch=1"}
}
```
给用户的最终回答应包含:检索结论、编号来源清单(标题 + 可点击链接)、失败引擎与原因、检索日期。
## 创新特色
### 效率提升量化分析
脚本耗时为 2026-10 在大陆网络、Windows + Python 3 下实测(查询词「FastAPI 教程」);手动耗时为完成同等任务的人工估算(按保守值计算倍数)。
| 操作步骤 | 手动耗时(估算) | 自动化耗时(实测) | 时间节约 | 效率提升(估算) |
| --- | --- | --- | --- | --- |
| 打开 3 个引擎并各输入一遍查询 | 60–120 秒 | 0.3 秒(零网络请求) | 约 60–120 秒 | 约 200–400 倍 |
| 抓取 3 引擎结果页并提取标题链接 | 120–180 秒 | 7 秒(含 1 秒引擎间隔) | 约 113–173 秒 | 约 17–26 倍 |
| 对 24 条结果跨引擎比对去重 | 约 180 秒 | 随抓取即时完成 | 约 180 秒 | — |
| 生成 16 引擎的可点击链接清单 | 480–600 秒 | 0.3 秒(零网络请求) | 约 480–600 秒 | 1000 倍以上 |
| 输出 JSON 供其他程序消费 | 需手工整理,通常不可行 | 即时(`--json`) | — | — |
实测产出:3 引擎 24 条原始结果去重为 22 条,覆盖 14 个独立域名;首条结果为 bing-cn 与 so360 双源命中(`FastAPI 教程 | 菜鸟教程`)。数字随网络状况与引擎实时排序波动,重跑有差异属正常。
### 差异化对比
| 对比维度 | 本技能 | 手动操作 | 仅用单一引擎 | 付费搜索 API |
| --- | --- | --- | --- | --- |
| 来源覆盖 | 2–16 引擎 + 10 个垂直站点可选 | 通常 1–3 个,取决于人工 | 1 个索引 | 单家结果 |
| 跨源去重 | URL 规范化自动去重,多源命中加权 | 人工肉眼比对 | 无 | 需自行开发 |
| 中转/跟踪链接 | 360 真实地址还原,utm 等参数清理 | 需手工处理 | 无 | API 直出但按量计费 |
| 限流保护 | 1.5 秒间隔、验证码即停、端点降级 | 无 | 无 | 受调用配额限制 |
| 失败兜底 | 端点→引擎→链接模式三级降级 | 无 | 无 | 报错即中断 |
| 结构化产出 | Markdown / JSON + 退出码 | 人工笔记 | 页面浏览 | JSON(计费) |
| 成本与门槛 | 无需 API Key,仅 Python 标准库 | 免费但费时 | 免费 | 注册、密钥、按量计费 |
### 核心痛点解决
| 痛点 | 描述 | 影响范围 | 解决方案 | 量化效果 |
| --- | --- | --- | --- | --- |
| 多站查询费时 | 同一问题要在多个搜索引擎重复输入、逐个翻页 | 资料调研、事实核查 | 一条命令聚合多引擎,顺序请求避免封禁 | 3 引擎检索约 2–3 分钟 → 约 7 秒(实测) |
| 重复结果干扰 | 同一链接在多引擎重复出现,跟踪参数各异 | 结果阅读与来源引用 | URL 规范化 + 跨源去重,多源命中排前 | 实测 24 条 → 22 条,覆盖 14 个域名 |
| 跳转链接不透明 | 百度/搜狗/360 结果为中转地址 | 链接核验与分享 | 360 自动还原 data-mdurl;其余保留可跳转地址 | 自动完成,无需手工还原 |
| 环境受限中断 | 部分引擎在特定网络不可达或弹出验证码 | 大陆网络环境 | 端点降级、引擎替换、链接模式三级兜底 | 任何环境约 0.3 秒产出可点击链接 |
| 使用门槛高 | 同类工具常需注册、API Key、安装依赖 | 新手与离线环境 | 零第三方依赖、无 Key、默认不发网络请求 | pip 安装 0 次 |
## 示例
### 示例 1:中文热点多源调研
**输入**:“帮我搜一下最近一周国内大模型的发布消息,至少三个来源”
**执行**:`python scripts/multi_search.py "大模型 发布" -e baidu,so360,sogou --time w --fetch`
**输出(节选)**:成功 3 个引擎,去重后 20+ 条结果,多源命中的排前;Agent 据此给出 3 条有 2 个以上独立来源佐证的发布消息,编号附百度/360/搜狗原始链接,单源传闻标注“仅见一处,待核实”。
### 示例 2:英文报错排查(大陆网络)
**输入**:“Python 报错 `RuntimeError: Event loop is closed` 怎么解决?”
**执行**:先抓 `https://cn.bing.com/search?q=RuntimeError+%22Event+loop+is+closed%22+site:stackoverflow.com&ensearch=1`,再补一轮不加 `site:` 的必应中国结果。
**输出**:按相关度列出 Stack Overflow 高票答案与官方 issue 链接,概括“Python 3.10+ 在 Windows 上 ProactorEventLoop 的已知行为、两种修复写法”,并给出原文链接。
### 示例 3:全部抓取被拦截时的降级
**输入**:“搜一下 privacy tools”,但当前网络下国际引擎均不可达,国内引擎返回验证码页。
**输出**:明确告知用户哪些引擎不可用/被限流,改为输出必应中国、360、DuckDuckGo 的可点击搜索链接表格(脚本的链接模式必然可用),建议用户在浏览器中打开,而不是反复请求触发更严限流。
### 示例 4:文件类型定向检索
**输入**:“找几份关于 RAG 评测的 PDF 报告”
**执行**:`web_fetch({"url": "https://cn.bing.com/search?q=RAG+%E8%AF%84%E6%B5%8B+filetype%3Apdf&ensearch=0"})`,再用百度学术垂直站 `python scripts/multi_search.py "RAG evaluation" --vertical baiduxs --fetch` 交叉补充。
**输出**:列出 PDF 直链或下载页标题、来源站点、发布时间线索,并提示用户自行判断报告发布方的权威性。
## 边界条件与异常输入
以下边界条件均已在脚本中处理,Agent 手工走流程时也应同样对待:
| 特殊情况 | 行为与处理 |
|---|---|
| 查询词为空或纯空格(空值输入) | 报错退出,提示提供有效关键词,不发起任何请求 |
| 引擎 id 拼写错误等非法输入 | 列出全部未知 id 后退出,不静默忽略 |
| `--limit 0/负数`、`--timeout 0/负数`、负 `--delay` | 参数校验直接报错退出,不产生无意义请求 |
| 查询词含 `&`、`#`、`%`、引号、空格、中文 | 脚本自动百分号编码;手工拼 URL 必须同样编码 |
| 极端超长查询(编码后超过 1800 字符) | 给出拆分建议;搜索引擎自身也可能截断 URL |
| 冷门词零结果 | 正常返回 0 条结果但保留各引擎搜索链接,链接模式退出码为 0 |
| 抓取模式全部引擎失败且零结果 | 退出码为 1,仍打印可点击链接与失败原因 |
| 输出目录不存在或无写权限 | 明确提示路径/权限问题并退出,不抛堆栈 |
| 同一查询重跑结果不同 | 引擎实时排序与地区化结果所致,属正常现象,不是解析失败 |
## 错误处理
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| HTTP 403 / 418 / 503 | 引擎反爬拦截 | 脚本先访问首页建立内存会话、等 2 秒重试 1 次;仍失败再换端点(DDG lite、Google `gbv=1`)或换必应/Ecosia;最终转链接模式 |
| HTTP 429 | 请求过于频繁 | 停止该引擎 30 秒以上,本会话不再连发;把 `--delay` 调大到 3 |
| 连接超时 / 无法访问 | 网络环境不支持该引擎 | 国内环境改用 `bing-cn/baidu/so360`;不要反复重试同一引擎 |
| 验证码/人机校验页 | 触发风控 | 立即停止,不规避验证码;换引擎或请用户在浏览器打开链接 |
| HTTP 200 但无结果 | 空壳页、地区重定向、页面结构变化 | 脚本会如实报“未解析到结果”;换引擎重试,链接模式始终可用 |
| 结果是引擎中转链接 | 百度/搜狗等用 `/link?url=` 跳转 | 链接可正常点击,保留即可;360 脚本已自动还原 `data-mdurl` 真实地址 |
| 中文乱码 | 响应编码识别错误 | 脚本按响应头编码、UTF-8、GB18030 顺序解码;手工抓取时按 UTF-8 解析 |
| URL 含空格/中文/`&` | 未做编码 | 用脚本自动编码;手工拼接时用 `%20`、百分号编码中文,`&` 写成 `%26` |
| 部分结果标题与内容不符 | 内容农场/标题党 | 以多源命中数和域名可信度加权,打开原文核实,不采信单一来源 |
## 安全风险防范
合规底线:仅用于合法的公开信息检索,遵守各搜索引擎的服务条款与 robots 规则;不规避验证码、不模拟登录、不做账号操作。
| 风险项 | 等级 | 防护措施 |
|---|---|---|
| 高频请求触发引擎封禁 | 中 | 顺序请求、默认 1.5 秒间隔、单引擎最多重试 1 次、遇验证码立即停止 |
| 检索到错误或过时信息 | 中 | 多源交叉验证、多源命中加权排序、关键事实打开原文二次核实 |
| 个人数据外泄 | 低 | 无登录态、Cookie 仅单次检索内存暂存且不落盘、不收集个人数据、默认不写文件 |
| 依赖供应链风险 | 低 | 仅使用 Python 3.7+ 标准库,零 pip 安装,全部请求目标仅限公开搜索 URL |
## 依赖说明
| 依赖项 | 是否必需 | 说明 |
|---|---|---|
| 具备网页抓取能力的 Agent | 方式 A 必需 | 用于请求公开搜索 URL;无此能力时用方式 B |
| Python 3.7+ | 方式 B 必需 | 仅用标准库,无需 pip 安装任何第三方包 |
| 操作系统 | 不限 | Windows / macOS / Linux 均已兼容 |
| API Key | 不需要 | 全部使用公开搜索页,无鉴权、无密钥配置 |
| 网络 | 按引擎区分 | 国内引擎组大陆直连;国际引擎组需可访问国际互联网的环境 |
## 常见问题FAQ
### Q1: 为什么不默认一次查全部 16 个引擎?
A: 引擎有反爬与频率限制,无差别并发请求既慢又容易被封 IP。绝大多数问题 2–4 个引擎足够,需要交叉核实时再扩展;脚本提供 `--all` 但内置顺序请求与延时。
### Q2: Google / DuckDuckGo 打不开怎么办?
A: 大陆网络环境直接使用国内引擎组,英文资料用必应国际入口(`ensearch=1`,国内可直出国际结果)或 Ecosia;脚本会报告具体失败引擎并继续给出可点击链接。
### Q3: 脚本抓取和直接问模型有什么区别?
A: 模型自带知识有截止日期且可能出错;本技能拿到的是带真实 URL 的实时检索结果,可点击核实、可多源交叉验证,回答必须附来源。
### Q4: 微信文章为什么有时抓不到?
A: 微信搜索(搜狗入口)风控严格,频繁请求会出验证码。单次检索即可,失败后停止,改用搜狗网页或在链接模式下让用户手动打开。
### Q5: 百度和搜狗的链接为什么不是目标网站地址?
A: 这两家的结果链接是引擎中转跳转(形如 `baidu.com/link?url=…`),点击后正常跳到目标页,属正常现象;360 的真实地址脚本会从 `data-mdurl` 自动还原。
### Q6: 脚本能直接抓全文吗?
A: 不能,也不应该。脚本只提取搜索结果页上的标题与链接;需要正文时用 Agent 的抓取工具打开具体结果 URL,逐页阅读更可靠,也符合检索礼仪。
## 已知限制
- 搜索结果页 HTML 结构可能随引擎改版变化;脚本提取失败时会自动退回链接模式,不影响基本可用性。
- 无登录态:公众号历史文章、付费墙内容、私域社群等无法获取。
- 百度/360/搜狗的中转链接无法在不额外发请求的情况下还原真实 URL,报告中保留可点击的中转地址。
- Startpage、Brave、Qwant 反爬强度高,脚本抓取成功率低,主要适合在浏览器中通过链接模式使用。
- 时间过滤目前对 Google、搜狗、DuckDuckGo 有统一参数;必应、360 无稳定公开短参数,建议用“关键词 + 年份”收窄。
- 本技能只负责“找到线索”,搜索结果可能有误或过时,关键决策信息必须打开原文二次核实。
## 参考资料
- `references/engines.md` — 16 引擎 URL 模板、实测可达性、10 个垂直站点、意图选型矩阵
- `references/operators.md` — 高级操作符、各引擎时间过滤参数、DuckDuckGo Bangs、查询词构造经验