---
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、查询词构造经验
