给 AI Agents 一双「眼睛」:CrawlEyes 开源了
做过 Agent 的人应该都有同感:模型再聪明,也有一个致命短板------它看不到网页。
不是"看不全",是根本看不到。你让它去查今天的新闻,它只能凭训练记忆给你一个可能过时的答案;你让它盯一个竞品页面,它连那个页面长什么样都不知道。为了让 Agent 真正"看见",你得自己给它拼一套眼睛:一个浏览器去抓页面,一个搜索接口去查资料,一堆清洗逻辑把网页垃圾去掉,再把这些东西塞进模型能懂的文本里。
这套链路我拼了好几天,踩了不少坑。现在它开源了,叫 CrawlEyes。
它到底解决了什么问题
一句话:让 Agent 能读网页、能搜全网、能自己把信息整理明白。
具体拆开是四件事:
抓页面。 基于 Crawl4AI 无头浏览器,大部分 JS 渲染、动态加载的网页都能处理,输出干净的 Markdown------不是一堆 HTML 标签,是模型直接能读的文字。
搜全网。 自托管 SearXNG 走主通道,挂了自动切 Tavily(零 key),不怕单点故障。
理信息。 本地 embedding 把搜索结果按相关性重排,让有用的浮上来、没用的沉下去。
接 Agent。 标准 MCP Server,Claude Desktop、Cursor 这些客户端开箱即用。
抓页面:从 URL 到干净的 Markdown
bash
python scripts/crawl4ai_cli.py https://example.com --text
这行命令背后是整套抓取管线的封装:启动无头浏览器、等 JS 渲染完、把网页正文抽出来、去广告去导航、输出 Markdown。
一个真实的效果:我拿一篇典型技术文章测过,原始页面 24.6k 字符,抓完只剩 2.8k------89% 都是导航、广告、侧栏这种垃圾。模型读 2.8k 和读 24.6k 的区别,就是"能看"和"看得懂"的区别。
输出有四种格式,按场景选:
markdown:默认,去噪后的完整内容fit:只要核心段,最省 tokenraw:原始内容,要全量信息时用markdown_with_citations:每段带来源引用,做深度调研时方便溯源
还有几个顺手的小功能:失败自动重试(1s/2s/4s 指数退避)、同进程会话复用(连续抓多个 URL 不用每次冷启动)、robots.txt 可选遵守(按 RFC 9309,默认关,要不要守合规你自己定)。
搜全网:SearXNG 优先,Tavily 兜底
python
from crawl_search_standalone import CrawlSearch
r = CrawlSearch(rerank=True).search('AI agent web scraping')
主搜索走自托管的 SearXNG------自建自管,不依赖任何厂商,数据不经过第三方。它要是挂了,自动切到 Tavily keyless,零配置、零 key,不中断服务。
可靠性这块我做得比较足:熔断器(连续 3 次失败进 60 秒冷却)、SQLite 缓存(带 TTL)、统一限流和指数退避。高并发不会把自己打挂。
理信息:让相关结果浮上来
关键词搜索有个老毛病:搜"Python 爬虫",出来一堆无关的框架广告,真正想要的技术文档沉在下面。
CrawlEyes 用本地 embedding 重排解决这个。模型是 BAAI/bge-small-zh-v1.5(512 维,约 50MB,加载 0.6s,无 torch 依赖),把搜索结果按语义相关性重新排序。
实测效果:相关结果稳稳浮到顶部(相关性 0.817/0.732),无关的直接沉底(0.302/0.139)。这差距对 Agent 来说就是"答对了"和"一本正经胡说"的区别。
接 Agent:MCP Server,标准协议
bash
pip install crawleyes # 或直接运行 scripts/mcp_crawl_server.py
项目提供标准 MCP Server(stdio 传输),四个工具开箱即用:
search:搜索extract:抓取,支持四种格式 + robots 开关sitemap:站点发现,顺着 sitemap.xml 摸清一个站有哪些页面deep_research:深度调研,给个主题出一份带引用的报告
不绑定任何 Agent 框架,Claude Desktop、Cursor 这些 MCP 客户端都能直接接。这也是我选择 MCP 的原因------标准协议,一次接入,处处可用。
深度调研:给一个 topic,出一份带引用的报告
python
from crawleyes.deep_research import deep_research_sync
r = deep_research_sync("MCP protocol 2026")
r['report'] # 带引用来源的完整报告
r['sources'] # 来源列表
这是我最喜欢的功能。给它一个主题,它会自动拆成子问题、逐路去搜、抓回来降噪、最后合成一份带引用来源的报告。报告里每个结论都能溯源到具体来源------对 Agent 应用来说,"有据可查"比"看似正确"重要得多。
LLM 合成是可选的,支持任意 OpenAI 兼容端点。不配 LLM 也能跑,降级成纯证据聚合,零依赖。
设计上的一些取舍
每一层都有兜底。 抓取用 Crawl4AI,搜索用 SearXNG + Tavily 双通道。每个环节都验证过 fallback 路径,单一故障不至于整体瘫痪。
面向国内环境优化。 Tavily 不用注册不用 key;安装走清华源,Playwright 走 npmmirror,模型走 hf-mirror,不依赖 Google 系服务。
合规边界明确。 项目不做代理池、指纹轮换、验证码对抗。遇到验证码墙,如实标「不可解」,不尝试绕过。尊重 robots.txt 和站点条款,这是长期可持续的前提。
最想分享的踩坑:搜索在国内跑通有多难
开发过程中耗时最多的不是写代码,是让搜索链路在国内真正跑通。这些坑值得记下来:
- SearXNG 默认配置启用的大多是境外引擎(Google、DuckDuckGo、Brave),境内网络一个都连不上,中文搜索必挂;
- 补上境内引擎后,百度高频查询会触发 CAPTCHA 风控,连续 10 次就被限制,得加 yandex 冗余;
- bing 在 JSON API 模式下静默返回空结果,连个报错都没有,没法当主力;
- 最后是 baidu + yandex 双主力,实测 10/10 连续查询稳定。
这些经验都写进 README 了。如果你也在做中文搜索相关的东西,也许能帮你少踩几个坑。
现状与展望
项目已经跑起来了:
- 源码:github.com/waiky-github/CrawlEyes(MIT)
- 安装 :
pip install crawleyes,当前 0.2.0(含 sitemap、robots、多格式 extract、统一限流) - MCP Registry :已收录
io.github.waiky-github/CrawlEyes - CI:GitHub Actions 全绿(Python 3.10/3.12 + ruff + 构建)
- 内部在用:我自己的 Hermes Agent 5 个环境每天都在跑
技术选型上,Credits 里标了所有灵感来源(Crawl4AI、Readability、Firecrawl 等 9 个项目),合规透明。
如果你也在做「让 Agent 看网页」这件事,或者踩过类似的坑,欢迎来 GitHub 参与进来,Star、Issue、PR 都欢迎~