别让大模型选链接:Jevcrawl 把 8 万 token 砍到 1873

抓了一堆页面,答案还躺在导航栏后面
你给 Agent 一个爬虫工具,让它去查 walrus 运算符是哪个 Python 版本加进来的。它很听话,抓了十几页回来。
然后呢?导航栏两百 token,页脚三百 token,面包屑、编辑此页、本页有帮助吗,各来一份。真正写着答案的那一段,排在第 7 页的中下部。
上下文窗口是有限的。塞不满就截断,截断就丢答案。你付的是整份页面的钱,拿到的是一堆装饰件。
更难受的是另一种做法:让大模型自己挑链接。抓一页,把页面里所有链接交给它,问下一个点哪个。逻辑上没毛病,可每一条链接本质上都是一道是/否判断题。用能写万字长文的模型去答几百道判断题,慢,贵,还不一定比瞎逛准。
所以真正该换掉的不是爬虫。是那个做判断的角色。
把选链接这件事,从大模型手里拿走
Jevcrawl 的做法很直接:链接和段落的筛选交给一个叫 Jev 的小决策模型,大模型只负责读筛选之后的那部分。
Jev 只回答是/否,并且只返回概率,不生成任何文本。这个设计有个很妙的副作用。因为模型不写字,返回给你的每一段都是从网页原文里逐字复制的,没有改写,也就没有编造的空间。
我们之前聊过这个只做选择题的模型,它干的就是把开放题拆成一堆判断题再逐个给概率。Jevcrawl 把它搬进了爬虫。
流程是这样:一次并发抓 4 页,每页发一次 Jev 打分请求,用你的 goal 去问这段能不能回答这个问题。分数高的段落留下,分数低的链接不是丢掉,是留作备用,所以爬到预算用完之前不会提前停下。
安全上也有一处巧思。网页文本永远只作为数据出现在问题的字段里,不作为指令,问句还是 jevcrawl 写死的固定字符串。有人在页面里埋一句”忽略之前的指令”,最坏也就是影响一个分数,改不了你的 Agent 下一步要做什么。

40% 对 8%:WebWalkerQA 上的三组数
先看官方给的基准。WebWalkerQA 出自阿里通义实验室,50 个任务,回答模型和裁判对所有系统都是同一套,唯一变量就是爬虫。
方案 答对 命中答案页 每题成本 jevcrawl 40% 54% $0.025 Claude 挑链接 30% 33% $0.194 广度优先 8% 11% $0.228
摊到每答对一题上:jevcrawl 是 $0.06,让 Claude 挑链接是 $0.65,广度优先是 $2.85。
对 Crawl4AI 那组是 20 个任务。命中答案页 10 比 5,全部答案页 5 比 2,中位抓取耗时 29 秒对 43 秒,站点加载失败 0 比 3。
官方自己也把话说在前面:50 和 20 都是小样本,成本差距大而且稳定,准确率差距没那么稳。这个态度值得认,比把三个数字吹成碾压要实在。
工具接得越多 Agent 越蠢那篇讲的是同一件事:上下文不是免费的,往里塞东西得有成本意识。这里省的是同一笔钱。
如果你正在选爬虫,注意它和站内写过的 Firecrawl不是一回事。Firecrawl 给的是一套抓取 API,Jevcrawl 是一个自带决策层的 MCP server,两者不是替代关系。
三步跑通:装、接 MCP、下第一条命令
前提是两样东西:一个 Jev API key,去 console.typesafe.ai 拿;还有 uv。
第一步,装。README 给的就一行:
uv tool install jevcrawl
不想装进环境,也可以每次用 uvx 直接跑,pip install jevcrawl 也行。
第二步,接进客户端。命令行最省事:
claude mcp add jevcrawl -e TYPESAFE_API_KEY=<your key> -- uvx jevcrawl
Claude Desktop 和 Cursor 走配置文件:
{
"mcpServers": {
"jevcrawl": {
"command": "uvx",
"args": ["jevcrawl"],
"env": { "TYPESAFE_API_KEY": "<your key>" }
}
}
}第三步,下第一条命令。带 goal 才有意义:
jevcrawl crawl https://docs.python.org/3/ --goal "What does the walrus operator do?" --json
官方那个真实示例:问 walrus 运算符是什么、哪个版本加的,抓了 6 页,80,034 tokens 压到 1,873 tokens,Jev 调了 11 次,8.3 秒,花 $0.0069。
八万到一千八。这就是标题里那个数字的来处。
另外两个入口后面单独说。装完可以先跑一次 uvx jevcrawl doctor 自检环境。
三个工具别用错:crawl、scrape、map
这三个不是三种抓法,是三种提问姿势。
- crawl 用在答案可能在好几层页面之后的时候。默认 max_pages=30、max_seconds=120、return_tokens=4000、max_decision_usd=0.05,返回相关段落。
- scrape 用在你已经知道是哪个页面。带 goal 就只返回相关段落,不带 goal 就返回全部内容,而且一次 Jev 都不调。
- map 不返回正文,只给排好序的 URL,用来决定下一步 scrape 哪些。默认 limit=50、max_pages=10。
怎么选?给你一组判断:if 你连答案在哪一页都不知道,用 crawl;if 你已经站在那一页上,用 scrape;if 你想先看清有哪些页面值得进,用 map。别拿 crawl 去抓一个已知页面,那是把判断题的费用白付一遍。
还有个细节挺省心:Jev 结果会缓存在 ~/.jevcrawl/cache,同一个目标同一批页面重复跑,第二次不花钱。

四个坑:预算、隐私、协议、降级
工具好用的前提是知道它哪儿不灵。下面这些官方 README 都写了,只是位置不显眼。
坑1:预算突然见底
现象是爬着爬着突然停了,或者压根没开始。根因是 max_decision_usd 是硬上限,会超预算的请求根本不会发出去,爬取以 stopped_because: budget 结束。解法不是把 0.05 调大,是先小规模跑一次看单次均价,README 里写 benchmark 平均一次 $0.011。
坑2:网页内容其实被发出去了
现象是你以为只是本地抓页面。根因是段落、链接文字、URL 都要送给 TypeSafe 打分。解法是内部站和带用户数据的页面别往里扔,这个取舍得你自己拍板。补一句成本口径:Jev 只收 input token,jev-1.13.0 是 $0.042/百万。
坑3:被站点当成不友好的访客
现象是抓着抓着被限流,严重的直接被封。根因是 jevcrawl 不读 robots.txt,除了一次抓 4 页之外不做任何限速,合规责任完全在使用者身上。解法是自己加延时、压住 max_pages,涉及站点条款的先问一句。
坑4:结果突然变笨
现象是返回里冒出一堆 uncertain,答案质量明显下滑。根因是连续三次 Jev 请求失败后,它会退化成广度优先,所有段落不打分直接丢进 uncertain,同时把 stats.degraded 置上。解法是盯着这个字段,看到就别信这一轮的结果。
再补一条能力边界:它不跑 JavaScript。需要 JS 才能渲染的页面会被列进 stats.needs_js_urls,而不是硬抓。Crawl4AI 那边是驱动真实浏览器的,所以那组对比里 Crawl4AI 有 3 次站点加载失败,jevcrawl 是 0。
它也不登录,不绕付费墙和验证码。这几件事别指望。
环境变量一共四个。TYPESAFE_API_KEY 必填,JEVCRAWL_BASE_URL 默认 https://api.typesafe.ai,JEVCRAWL_MODEL 默认 jev-1.13.0(官方锁版本,因为阈值是按版本校准的,别自己改),JEVCRAWL_CACHE_DIR 指向缓存目录。
不是所有判断题都值得请一个大模型来做
回到开头那个场景。十几页抓回来,答案在导航栏后面躺着,钱烧完了题还没答对。
我们下意识的反应是要一个更强的爬虫。可真正堵住的地方是,你让一个能写万字长文的模型,去做几百道这条链接点不点的是非题。
Jevcrawl 换掉的正是这个角色。判断交给只输出概率的小模型,大模型只负责读筛选后的那部分。八万 token 变一千八,命中答案页的概率反而从 33% 到了 54%。
有句话得说在前面:这个项目在 GitHub 上是 RayenMlayeh/jevcrawl,15 颗星,建库时间 2026 年 10 月 11 日,最近一次 push 是 10 月 13 日。PyPI 上版本 0.1.0,Apache-2.0,要求 Python 3.11+。非常新,接口说变就变,要上生产请先小范围试。
不是所有判断题都值得请一个大模型来做。这句话放在爬虫上成立,放在 Agent 的很多环节上一样成立。
关注圈圈,持续带你玩转 AI 工具。
暂无评论内容