又快又稳不封号:剖析 web-search-mcp 的并发提取、速率限制与 HTTP/2 容错恢复机制
人工智能MCP 服务【免费下载链接】web-search-mcpA simple, locally hosted Web Search MCP server for use with Local LLMs项目地址https://gitcode.com/gh_mirrors/we/web-search-mcp点击查看免费下载web-search-mcp是一个本地部署的网络搜索 MCP 服务器无需任何 API Key即可为本地 LLM如 LM Studio、LibreChat 搭配 Qwen3、Gemma 3提供多引擎网页搜索与完整页面内容提取能力。本文将剖析它的三大核心机制——并发提取、速率限制、HTTP/2 容错恢复看看这个开源项目如何让抓取网页这件事变得又快、又稳、还不被封号。一、什么是 web-search-mcp免 API Key 的本地搜索 MCP传统给 AI 接联网搜索往往要申请搜索引擎 API、付费、还要担心配额。而 web-search-mcp 的思路很直接用 Playwright 无头浏览器直接访问 Bing、Brave用 axios 直连 DuckDuckGo三级降级Bing Brave DuckDuckGo见 src/search-engine.ts对本地 LLM 完全透明。它通过 MCPModel Context Protocol对外暴露三个工具工具用途full-web-search综合搜索 抓取结果页全文get-web-search-summaries轻量搜索只返回摘要片段get-single-web-page-content提取单个指定 URL 的正文工具的完整参数说明可查阅 docs/API.md。二、为什么快多页面并发提取 超时保护full-web-search拿到 N 条搜索结果后不是逐个串行去抓正文而是一次性并发提取。核心逻辑在 src/enhanced-content-extractor.ts 的extractContentForResults方法中超额备胎目标只要 5 条就会最多处理targetCount × 2上限 10 条URL给失败留出冗余名额并发发起每个 URL 独立成一个 Promise最后用Promise.all汇总src/enhanced-content-extractor.ts#L449双重超时保险单页抓取超时设 6 秒外层再用Promise.race挂了一个 8 秒的看门狗即使某个 Promise 卡死也不会拖垮整批任务src/enhanced-content-extractor.ts#L410-L422失败隔离单页失败只会被标记为fetchStatus: error并附上具体错误原因如403 Forbidden - Access denied不会中断其他页面成功优先最终结果先放成功的再补失败的保证 LLM 拿到的是有效内容。也就是说最慢的那个页面只决定多等几秒而不是整批超时。双通道策略axios 先跑浏览器兜底抓取单页时优先用轻量的 axios 发 HTTP 请求随机挑选真实浏览器请求头见 src/enhanced-content-extractor.ts#L325-L361当出现 403/429/503、超时、Please enable JavaScript、captcha 等信号时自动判定这个页面需要浏览器切换到无头浏览器提取src/enhanced-content-extractor.ts#L278-L308。浏览器通道还会拦截并丢弃图片、字体、媒体资源只加载必要内容进一步提速。三、为什么稳双闸门速率限制速率限制器实现得非常克制全部代码就在 src/rate-limiter.ts 一个类里包含两层闸门并发闸门底层用pLimit(5)同一时刻最多 5 个请求真正执行其余排队等待配额闸门默认每分钟最多 10 个请求src/search-engine.ts#L13 处注入。一旦触顶直接抛出提示Rate limit exceeded. Please wait N seconds让调用方明确等待而不是疯狂重试。这套设计的效果是无论 LLM 一口气让 AI 搜多少东西对外发出的请求节奏都被削峰成平稳的细水长流——既避免自家机器被打爆也避免对目标网站形成瞬时压力。四、为什么不封号一整套拟人化反检测方案无头浏览器最大的风险是被反爬系统识别。web-search-mcp 从四个层面把自己伪装成一个普通访客1. 启动参数去除自动化特征浏览器池src/browser-pool.ts启动 Chromium 时携带--disable-blink-featuresAutomationControlled、--no-sandbox等参数直接抹掉最常见的自动化指纹。2. 随机化数字指纹每个页面请求都会随机抽取真实浏览器的 User-AgentChrome / Firefox 多版本5 种常见屏幕分辨率之一1920×1080、1366×768 等美东、美西、欧洲、东京等时区之一。同一个程序两次访问指纹完全不同。3. 隐身脚本Stealth Scripts在页面任何脚本执行前注入初始化脚本src/enhanced-content-extractor.ts#L119-L150把navigator.webdriver改为undefined、伪造 plugins 和 languages、修补 permissions API——这些都是自动化检测脚本最爱查的体检项。4. 模拟人类行为浏览器提取时还会随机移动鼠标、随机滚动页面、随机停顿 500~1500 毫秒src/enhanced-content-extractor.ts#L249-L276行为轨迹与真人浏览几乎无法区分。再叠加第三节提到的限速 并发控制温和且拟人的访问模式就是它长期可用的关键。五、HTTP/2 容错协议错误自动降级恢复现代网站普遍启用 HTTP/2但无头浏览器在代理/隧道环境下经常出现ERR_HTTP2_PROTOCOL_ERROR。web-search-mcp 的做法是检测 → 降级 → 重试三步走src/enhanced-content-extractor.ts#L174-L219捕获page.goto的异常检查错误信息是否包含ERR_HTTP2_PROTOCOL_ERROR或HTTP2关闭当前浏览器上下文新建一个带Connection: keep-alive请求头的上下文倾向走 HTTP/1.1 通道用更短的 6 秒超时重新导航成功后照常提取内容、关闭上下文。整个过程对上层完全透明——LLM 只看到内容拿到了或者拿到了一个明确的错误原因永远不会因为协议抖动而白等。六、一键调优关键环境变量清单所有机制都暴露为环境变量在mcp.json中配置即可参考 mcp.json 与 README.md变量默认值作用MAX_CONTENT_LENGTH500000单页最大内容字符数内容太长可设为 10000DEFAULT_TIMEOUT6000单请求默认超时毫秒追求更快可设 4000MAX_BROWSERS3浏览器池上限内存紧张可降到 1BROWSER_TYPESchromium,firefox轮转使用的浏览器类型BROWSER_FALLBACK_THRESHOLD3axios 失败几次后切浏览器RELEVANCE_THRESHOLD0.3搜索结果相关性质量门槛0.0-1.0FORCE_MULTI_ENGINE_SEARCHfalse强制尝试全部引擎并择优返回例如响应太慢时把DEFAULT_TIMEOUT调低 MAX_BROWSERS调小就是官方推荐的降速减压组合。七、总结web-search-mcp 给本地 LLM 上网冲浪的思路值得借鉴并发提速、限速保稳、拟人防封、协议容错四招各司其职又互相咬合。它的代码量不大但每一个模块——src/rate-limiter.ts、src/browser-pool.ts、src/search-engine.ts、src/enhanced-content-extractor.ts——都是可以直接抄作业的防坑经验。如果你也在给本地模型加联网能力不妨从这套架构开始。赞分享人工智能MCP 服务【免费下载链接】web-search-mcpA simple, locally hosted Web Search MCP server for use with Local LLMs项目地址https://gitcode.com/gh_mirrors/we/web-search-mcp点击查看免费下载相关推荐Earthly如何做到又快又稳深度剖析BuildKit、DAG并行执行与LLB转换原理Earthly如何做到又快又稳深度剖析BuildKit、DAG并行执行与LLB转换原理 Earthly 是一个超简单的构建框架build frameworkCI/CDDevOps构建工具Apache Pulsar PIP-327managedLedgerForceRecovery 强制恢复不可恢复错误的 Topic 机制设计与源码剖析Apache Pulsar PIP 327managedLedgerForceRecovery 强制恢复不可恢复错误的 Topic 机制设计与源码剖析 本文围消息队列流处理后端微服务消息路由jetson-ffmpeg常见问题排查从编译错误到运行时异常的解决方案jetson ffmpeg常见问题排查从编译错误到运行时异常的解决方案 jetson ffmpeg是针对Jetson Nano平台优化的FFmpeg扩展通过创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

C++模板元编程实现编译期循环展开:原理、写法与性能优化实战

C++模板元编程实现编译期循环展开:原理、写法与性能优化实战

1. 项目概述:当循环次数被“焊死”在源码里做高性能计算和底层的兄弟,一定遇到过这种场景:算法里有一段固定次数的热点循环,比如 8 阶滤波器、64 点相关运算、16 维点积。你心里清楚这段代码的每一次迭代都在烧 CPU 周期&#xff…

2026/10/14 20:54:23 阅读更多 →
26. AI-Agent-交付

26. AI-Agent-交付

文章目录 前言 一、先说一个最简单的结论 二、Agent 可以独立存在吗? 三、第一种交付方式:直接交付一个“Agent 应用” 四、第二种交付方式:嵌入客户原来的系统 六、第四种交付方式:Agent API 七、第五种交付方式:部署一套 Agent 八、还有一种更容易被忽略的交付:一个“数…

2026/10/14 20:54:23 阅读更多 →
TEKLA图纸二次开发实战:对象模型、源码入口与避坑指南

TEKLA图纸二次开发实战:对象模型、源码入口与避坑指南

简介:TEKLA二次开发图纸入门源代码,面向钢结构详图设计领域希望扩展TEKLA功能的工程师与开发者。资料聚焦图纸管理与数据提取,围绕载入模型图纸列表、选择模型图纸、打开模型图纸、取图纸数值四个核心功能,提供基于C#的完整源代码…

2026/10/14 20:54:23 阅读更多 →

最新新闻

Altium数据库连接报错排查:ODBC配置与字段映射详解

Altium数据库连接报错排查:ODBC配置与字段映射详解

Database连接报错这个问题,确实很折腾人。很多工程师在从普通原理图库切换到数据库驱动模式时,第一步往往不是画封装,而是先被各种配置问题拦住。最常见的就是明明数据源已经建好了,软件却提示连接失败;或者在放置器件…

2026/10/14 21:46:50 阅读更多 →
Linux网络编程:Socket核心函数与TCP通信实战解析

Linux网络编程:Socket核心函数与TCP通信实战解析

很多刚接触 Linux 网络编程的人,第一步就是捧着 man 手册啃 socket 相关的几个函数。socket、bind、listen、accept、connect,名字都认识,拼在一起就不知道怎么用,更不知道为什么要这样设计。这本书上写的“socket 是网络通信的桥…

2026/10/14 21:46:50 阅读更多 →
日期天数计算全攻略:时区、夏令时与闰年的陷阱

日期天数计算全攻略:时区、夏令时与闰年的陷阱

上周接了个需求,一个开发者朋友说他用两个日期直接相减,结果在某个项目里差了整整一天,怎么查都查不出来。我帮他看代码,发现他用的是时间戳相减再除以一天的毫秒数。问题就出在这里——日期天数计算看似是简单减法,实…

2026/10/14 21:46:50 阅读更多 →
蒙特卡洛与Copula结合的场景生成及配电网随机优化调度方法

蒙特卡洛与Copula结合的场景生成及配电网随机优化调度方法

最近在做一个园区级配电网的调度方案,碰上了个挺头疼的问题:光伏、风电出力飘忽不定,再加上五花八门的电动汽车充电需求,整个系统的“不确定性”像叠buff一样堆在一起。最开始我就用简单的场景抽样去跑优化,结果算出来…

2026/10/14 21:46:50 阅读更多 →
力扣入门第4阶段:哈希表、双指针、滑动窗口与链表核心攻略

力扣入门第4阶段:哈希表、双指针、滑动窗口与链表核心攻略

1. 先聊清楚:这第4阶段到底在讲什么很多人看到“编程入门4”这个标题,第一反应是:行,又是一个刷题合集,按顺序做就完事了。但真刷到第4阶段你会发现,事情没那么简单。力扣的官方入门计划是按“知识点难度梯…

2026/10/14 21:46:50 阅读更多 →
北京五道口油烟机维修|万和油烟机报修|按键失灵触摸屏无反应上门检修|欧米到家客服电话

北京五道口油烟机维修|万和油烟机报修|按键失灵触摸屏无反应上门检修|欧米到家客服电话

快速导航:本文系统梳理北京地区油烟机九大高发故障的成因、表现与自查方法,帮助您快速判断问题、避开维修陷阱、选择正规靠谱的上门服务。 24小时服务热线:400-996-9791 | 官网:www.oumidj.com 🗺️ 一、欧米到家北…

2026/10/14 21:45:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →