Crawl4AI v0.7.0 自适应智能更新深度解析:AdaptiveCrawler、虚拟滚动、链接智能评分与异步 URL 种子发现
本篇基于 Crawl4AI 官方 v0.7.0 发布说明(仓库路径 release-v0.7.0.md)展开,逐条覆盖该版本的四大核心能力:自适应爬取(Adaptive Crawling)、虚拟滚动支持(Virtual Scroll)、链接预览与智能评分(Link Preview)、异步 URL 种子发现(Async URL Seeder),并结合当前仓库中的真实源码(AdaptiveCrawler 实现、配置定义、虚拟滚动处理、链接预览器、URL 种子引擎)给出参数默认值、调用链与底层原理,帮助读者完整掌握"让爬虫学会观察、评分与自我停止"这一套技术方案。
一、v0.7.0 发布概览
v0.7.0 是 Crawl4AI 被称为 "The Adaptive Intelligence Update" 的一次重要版本,官方发布说明将其定位为"通过自适应学习、智能内容发现与高级提取能力,从根本上改进爬虫处理现代 Web 复杂性的方式"。发布说明中的功能清单如下:
- Adaptive Crawling(自适应爬取):爬虫会学习并适应网站模式,根据置信度自动决定爬多少页
- Virtual Scroll Support(虚拟滚动支持):从无限滚动页面完整提取内容
- Link Preview with Intelligent Scoring(链接预览与智能评分):对链接进行智能分析与优先级排序
- Async URL Seeder(异步 URL 种子发现):结合智能过滤,秒级发现成百上千个 URL
- Performance Optimizations(性能优化):速度与内存方面的显著改进
需要注意:当前仓库 版本文件 显示项目已演进至 0.9.0,下文以 v0.7.0 发布说明为骨架,源码引用则以当前仓库实际实现为准,两者在核心 API 上保持一致。
二、AdaptiveCrawler:通过模式学习实现自适应信息发现
2.1 要解决的问题
发布说明描述的经典痛点是:网站会变化,类名会漂移、ID 会消失,精心编写的选择器在凌晨三点失效,你醒来面对的是空数据。v0.7.0 的解决方案是一套自适应学习系统——它会观察模式、构建置信度分数,并随时调整提取策略。
2.2 完整用法示例
以下示例继承自发布说明原文,展示 AdaptiveCrawler 的核心调用方式(digest 方法接收起始 URL 与查询,返回一个 CrawlState 状态对象):
from crawl4ai import AsyncWebCrawler, AdaptiveCrawler, AdaptiveConfig
import asyncio
async def main():
# Configure adaptive crawler
config = AdaptiveConfig(
strategy="statistical", # or "embedding" for semantic understanding
max_pages=10,
confidence_threshold=0.7, # Stop at 70% confidence
top_k_links=3, # Follow top 3 links per page
min_gain_threshold=0.05 # Need 5% information gain to continue
)
async with AsyncWebCrawler(verbose=False) as crawler:
adaptive = AdaptiveCrawler(crawler, config)
print("Starting adaptive crawl about Python decorators...")
result = await adaptive.digest(
start_url="https://docs.python.org/3/glossary.html",
query="python decorators functions wrapping"
)
print(f"\n✅ Crawling Complete!")
print(f"• Confidence Level: {adaptive.confidence:.0%}")
print(f"• Pages Crawled: {len(result.crawled_urls)}")
print(f"• Knowledge Base: {len(adaptive.state.knowledge_base)} documents")
# Get most relevant content
relevant = adaptive.get_relevant_content(top_k=3)
print(f"\nMost Relevant Pages:")
for i, page in enumerate(relevant, 1):
print(f"{i}. {page['url']} (relevance: {page['score']:.2%})")
asyncio.run(main())
AdaptiveCrawler、AdaptiveConfig、CrawlState、StatisticalStrategy 均可从包顶层直接导入,见 包导出定义。
2.3 AdaptiveConfig 完整参数表
发布说明只展示了 5 个常用参数,而 AdaptiveConfig 源码定义 揭示了完整的配置面。所有参数均可用默认值运行:
| 参数 | 默认值 | 说明 |
|---|---|---|
strategy |
"statistical" |
爬取策略,可选 "statistical"(纯统计、无 LLM、无 embedding)或 "embedding"(语义空间覆盖) |
confidence_threshold |
0.7 |
置信度达到该值即停止(取值 0~1) |
max_depth |
5 |
自适应扩展的最大深度 |
max_pages |
20 |
最大爬取页数 |
top_k_links |
3 |
每轮选取得分最高的 K 个链接 |
min_gain_threshold |
0.1 |
链接最高分低于该值则停止(信息增益门槛) |
saturation_threshold |
0.8 |
信息饱和度阈值,达到即停 |
consistency_threshold |
0.7 |
一致性阈值 |
coverage_weight / consistency_weight / saturation_weight |
0.4 / 0.3 / 0.3 |
三项指标加权组合,validate() 强制要求三者之和为 1 |
relevance_weight / novelty_weight / authority_weight |
0.5 / 0.3 / 0.2 |
链接评分权重,同样强制和为 1 |
save_state / state_path |
False / None |
是否持久化爬取状态、持久化文件路径 |
embedding_model |
"sentence-transformers/all-MiniLM-L6-v2" |
embedding 策略使用的向量模型 |
embedding_llm_config / query_llm_config |
None |
分别为 embedding 生成与查询扩展(chat completion)单独配置的 LLM |
n_query_variations |
10 |
查询语义空间扩展的变体数量 |
coverage_threshold |
0.85 |
语义覆盖阈值 |
embedding_coverage_radius |
0.2 |
"已覆盖"查询点的余弦距离半径,越小越严格 |
embedding_k_exp |
1.0 |
距离到分数映射的指数衰减因子(score = exp(-k·d)) |
embedding_nearest_weight / embedding_top_k_weight |
0.7 / 0.3 |
最近邻与 top-k 均值的混合评分权重 |
embedding_overlap_threshold |
0.85 |
高于该相似度的链接视为冗余并被降权 |
link_preview_timeout |
5.0 |
链接预览(head 抓取)超时秒数 |
embedding_min_relative_improvement |
0.1 |
继续爬取所需的最小相对置信度提升 |
embedding_validation_min_score |
0.3 |
低于该验证分数则不认为收敛可信,防止过早停止 |
配置对象在构造 AdaptiveCrawler 时会调用 validate() 做断言校验(权重和为 1、各阈值在 0~1 区间等),非法配置会在启动阶段即报错。
2.4 工作原理:CrawlState 状态机与置信度公式
从源码结构看,AdaptiveCrawler.digest() 是整个流程的主循环:
- 初始化/恢复状态:若传入
resume_from,通过CrawlState.load(path)从 JSON 文件恢复完整状态(已爬 URL、知识库、待爬链接、词频统计、embedding 矩阵等),否则创建新的CrawlState; - 首爬:对
start_url执行一次带链接预览的爬取(内部构造LinkPreviewConfig(max_links=50, concurrency=5, timeout=link_preview_timeout)并开启score_links=True,见 _crawl_with_preview),把返回的内部链接全部放入pending_links待选队列; - 自适应扩展循环(
while depth < max_depth),每一轮依次执行:calculate_confidence(state)计算当前置信度;should_stop(state, config)判断是否停止;rank_links(state, config)对待爬链接按预期信息增益排序;- 若最高分低于
min_gain_threshold则停止; - 取 top K 个链接并发批量爬取(_crawl_batch 使用
asyncio.gather),新结果合并进知识库与新链接队列。
统计策略 StatisticalStrategy 的置信度公式在源码中是显式的:
confidence = 0.4 * coverage + 0.3 * consistency + 0.3 * saturation
三个分量分别对应:
- Coverage(覆盖率):对查询词逐一统计文档频率 df 与词频 tf,计算"文档覆盖率 × 对数频率加成",再开平方曲线平滑,衡量查询词在知识库中的存在程度;
- Consistency(一致性):对知识库两两文档做词汇集合的 Jaccard 相似度,均值越高说明内容越围绕同一主题,避免爬虫跑题;
- Saturation(饱和度):跟踪每页新增词条数历史,
saturation = 1 - 近期新增速率 / 初始新增速率,当新信息发现速率趋近于零时判定信息饱和。
链接排序分数则为 relevance × 0.5 + novelty × 0.3 + authority × 0.2:相关性优先复用爬取阶段已算好的 BM25 上下文分数,新异性计算链接预览文本中"知识库尚未出现过的词"的占比,权威性则依据 URL 路径特征(/docs/、/api/ 加分,图片链接减分)与链接固有分数加权得出。
停止条件(should_stop)包括:置信度达到阈值、已爬页数达到 max_pages、待爬链接耗尽、或饱和度超过阈值——这四条与发布说明中"构建置信度分数并随时调整提取策略"的描述一一对应。
2.5 Embedding 策略与状态持久化
除统计策略外,strategy="embedding" 时启用 EmbeddingStrategy:先用 LLM 把查询扩展为 n_query_variations 个语义变体,构建查询点云,再用向量距离矩阵衡量"知识库对查询语义空间的覆盖程度",发现覆盖缺口后优先扩展能填补缺口的链接;入库时对新文档 embedding 做相似度去重(阈值 0.95),避免重复内容稀释知识库。
此外,CrawlState 提供 save(path) / load(path) 实现跨进程断点续爬,digest(start_url, query, resume_from=...) 可直接从文件恢复。爬取完成后,AdaptiveCrawler 还提供:
export_knowledge_base(filepath)/import_knowledge_base(filepath):知识库以 JSONL 格式导出/导入,便于沉淀语料;coverage_stats、print_stats(detailed=True)、is_sufficient、get_relevant_content(top_k):覆盖率统计、富文本报告、充分性判断与相关性内容检索。
发布说明中列出的"预期实战影响"包括:新闻聚合(模板更新下维持高提取准确率)、电商监控(跨数百店铺追踪商品变化)、研究数据采集(经受得住网站改版)、维护成本下降。这些是发布说明给出的应用场景描述,仓库中还提供了配套的官方示例 adaptive_crawling 示例目录 与测试 test_adaptive_crawler.py 供对照验证。
三、Virtual Scroll:从无限滚动页面完整捕获内容
3.1 要解决的问题
现代 Web 应用只渲染可视区域的内容:向下滚动,新内容出现,旧内容被虚拟 DOM 回收机制销毁。传统爬虫只能捕获首屏,可能漏掉绝大部分内容。v0.7.0 的解决方案是模拟人类浏览行为,在内容被浏览器"垃圾回收"之前先保存下来。
3.2 三种典型场景配置
发布说明给出的配置示例覆盖了社交媒体、电商网格、新闻流三类虚拟滚动场景,可直接复制使用:
from crawl4ai import VirtualScrollConfig
# For social media feeds (Twitter/X style)
twitter_config = VirtualScrollConfig(
container_selector="[data-testid='primaryColumn']",
scroll_count=20, # Number of scrolls
scroll_by="container_height", # Smart scrolling by container size
wait_after_scroll=1.0 # Let content load
)
# For e-commerce product grids (Instagram style)
grid_config = VirtualScrollConfig(
container_selector="main .product-grid",
scroll_count=30,
scroll_by=800, # Fixed pixel scrolling
wait_after_scroll=1.5 # Images need time
)
# For news feeds with lazy loading
news_config = VirtualScrollConfig(
container_selector=".article-feed",
scroll_count=50,
scroll_by="page_height", # Viewport-based scrolling
wait_after_scroll=0.5 # Wait for content to load
)
# Use it in your crawl
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
"https://twitter.com/trending",
config=CrawlerRunConfig(
virtual_scroll_config=twitter_config,
# Combine with other features
extraction_strategy=JsonCssExtractionStrategy({
"tweets": {
"selector": "[data-testid='tweet']",
"fields": {
"text": {"selector": "[data-testid='tweetText']", "type": "text"},
"likes": {"selector": "[data-testid='like']", "type": "text"}
}
}
})
)
)
print(f"Captured {len(result.extracted_content['tweets'])} tweets")
3.3 VirtualScrollConfig 参数与默认值
VirtualScrollConfig 定义 中各参数默认值为:
| 参数 | 默认值 | 说明 |
|---|---|---|
container_selector |
必填 | 可滚动容器的 CSS 选择器,JS 会在该容器上执行 scrollTop 滚动 |
scroll_count |
10 |
最大滚动次数上限 |
scroll_by |
"container_height" |
滚动步长:整数表示固定像素;"page_height" 表示一个视口高度;"container_height" 表示容器自身高度 |
wait_after_scroll |
0.5 |
每次滚动后的等待秒数,留给异步内容加载 |
virtual_scroll_config 作为 CrawlerRunConfig 的一级参数传入 arun(),既接受配置对象也接受 dict(内部会调用 VirtualScrollConfig.from_dict 归一化)。
3.4 实现原理:DOM 回收感知与内容保全
虚拟滚动处理入口 揭示了完整的实现逻辑:爬虫策略在页面交互阶段向浏览器注入一段 JavaScript,对目标容器执行"滚动—等待—比对"循环,并按容器 HTML 的变化分三种情况处理:
- HTML 无变化:继续滚动(可能还没触底或内容未加载);
- HTML 是前一版的前缀(新条目追加):内容仍在页面上,无需额外保存,继续滚动;
- 条目被替换(虚拟列表回收了顶部元素):立即把被替换前的 HTML 片段存入
htmlChunks列表——这就是发布说明所说的"DOM 回收感知"与"内容保全",抢在浏览器销毁旧节点前留存。
滚动终止条件有二:达到 scroll_count 上限,或 scrollTop + clientHeight >= scrollHeight - 10 触底(对应发布说明的"智能停止:当不再出现新内容时停止")。若循环中捕获过 HTML 片段,最后会做块合并:解析每个片段,对每个元素提取归一化文本(小写并去除空白与符号)去重,只保留首次出现的元素,最终替换容器 innerHTML 后再交给正常提取流程。仓库中的测试 test_virtual_scroll.py 与示例 virtual_scroll_example.py 覆盖了这一能力的回归验证。
发布说明列出的关键能力还包括:三种滚动物理模式(容器高度/页面高度/固定像素)、内容保全、智能停止、内存友好(流式捕获而非全量驻留内存);预期实战影响包括完整捕获数百条回复的 Twitter 线程、从无限滚动商品目录提取 500+ 商品(对比传统方式的 20~50 个)等。
四、Link Preview:链接智能分析与三层评分
4.1 用法
发布说明的核心痛点:爬到一个页面拿到 200 个链接,哪些值得跟?v0.7.0 提供三层评分系统,像人类一样综合考虑链接的位置、上下文与目标相关性。完整示例(含 score_links=True 启用固有评分、从 result.links 读取分数字段):
import asyncio
from crawl4ai import CrawlerRunConfig, CacheMode, AsyncWebCrawler
from crawl4ai.adaptive_crawler import LinkPreviewConfig
async def main():
# Configure intelligent link analysis
link_config = LinkPreviewConfig(
include_internal=True,
include_external=False,
max_links=10,
concurrency=5,
query="python tutorial", # For contextual scoring
score_threshold=0.3,
verbose=True
)
# Use in your crawl
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
"https://www.geeksforgeeks.org/",
config=CrawlerRunConfig(
link_preview_config=link_config,
score_links=True, # Enable intrinsic scoring
cache_mode=CacheMode.BYPASS
)
)
# Access scored and sorted links
if result.success and result.links:
for link in result.links.get("internal", []):
text = link.get('text', 'No text')[:40]
print(
text,
f"{link.get('intrinsic_score', 0):.1f}/10" if link.get('intrinsic_score') is not None else "0.0/10",
f"{link.get('contextual_score', 0):.2f}/1" if link.get('contextual_score') is not None else "0.00/1",
f"{link.get('total_score', 0):.3f}" if link.get('total_score') is not None else "0.000"
)
asyncio.run(main())
注意 LinkPreviewConfig 在 包导出 中已直接暴露在 crawl4ai 顶层,示例中的 from crawl4ai.adaptive_crawler import LinkPreviewConfig 写法与 from crawl4ai import LinkPreviewConfig 均可用。
4.2 LinkPreviewConfig 参数
源码默认值如下(定义于 async_configs.py):
| 参数 | 默认值 | 说明 |
|---|---|---|
include_internal |
True |
是否包含站内链接 |
include_external |
False |
是否包含站外链接 |
include_patterns / exclude_patterns |
None |
按 URL 模式包含/排除(glob 风格) |
concurrency |
10 |
并发抓取链接 head 的协程数 |
timeout |
5 |
单个链接 head 抓取超时(秒) |
max_links |
100 |
最多预览的链接数量 |
query |
None |
上下文评分用查询串 |
score_threshold |
None |
相关性分数过滤阈值 |
verbose |
False |
是否输出调试日志 |
4.3 三层评分机制的源码印证
发布说明描述的评分组件在源码中可以逐条找到对应实现:
- Intrinsic Score(固有分数):链接质量指标——页面位置(导航/正文/页脚)、链接属性(rel、title、class)、锚文本质量与长度、URL 结构与深度。对应实现为 calculate_link_intrinsic_score(输入锚文本、URL、title/class/rel 属性与页面上下文,输出 0~10 分);
- Contextual Score(上下文分数):基于 BM25 算法计算链接与查询的相关性,综合链接文本/标题关键词匹配、meta 描述分析、内容预览评分——
query参数正是为此提供; - Total Score(综合分数):由 calculate_total_score 根据是否开启
score_links、是否提供 query 决定融合方式,用于最终排序。
执行层 LinkPreview 类 的流程是:按配置过滤链接 → 并发抓取每个链接的 <head>(标题与 meta)→ 将 head 数据合并回 Links 对象并计算相关性分数。这一能力同时被第二节提到的 AdaptiveCrawler 复用(每页爬取时自动附带 max_links=50 的预览配置),是 v0.7.0 "智能内容发现"的公共底座。配套测试见 test_link_extractor.py。
五、Async URL Seeder:规模化 URL 自动发现
5.1 用法
发布说明指出:想爬整个域名却只有首页 URL,人工枚举 URL 是机器该干的活。Async URL Seeder 把多数据源与智能过滤、相关性评分组合起来。发布说明示例:
import asyncio
from crawl4ai import AsyncUrlSeeder, SeedingConfig
async def main():
async with AsyncUrlSeeder() as seeder:
# Discover Python tutorial URLs
config = SeedingConfig(
source="sitemap", # Use sitemap
pattern="*python*", # URL pattern filter
extract_head=True, # Get metadata
query="python tutorial", # For relevance scoring
scoring_method="bm25",
score_threshold=0.2,
max_urls=10
)
print("Discovering Python async tutorial URLs...")
urls = await seeder.urls("https://www.geeksforgeeks.org/", config)
print(f"\n✅ Found {len(urls)} relevant URLs:")
for i, url_info in enumerate(urls[:5], 1):
print(f"\n{i}. {url_info['url']}")
if url_info.get('relevance_score'):
print(f" Relevance: {url_info['relevance_score']:.3f}")
if url_info.get('head_data', {}).get('title'):
print(f" Title: {url_info['head_data']['title'][:60]}...")
asyncio.run(main())
除独立使用外,AsyncWebCrawler 还内置了 aseed_urls() 方法(见 async_webcrawler.py),可在同一浏览器会话生命周期内完成"发现 → 爬取"。
5.2 SeedingConfig 完整参数
| 参数 | 默认值 | 说明 |
|---|---|---|
source |
"sitemap+cc" |
数据源:sitemap(解析 robots.txt 与全部关联 sitemap)、cc(查询 Common Crawl 索引的历史 URL)、或二者组合 |
pattern |
"*" |
URL 模式过滤(glob,如 *python*) |
live_check |
False |
是否对 URL 做实时可达性检查 |
extract_head |
False |
是否抓取每个 URL 的 <head> 元数据(标题/description) |
max_urls |
-1 |
最大返回 URL 数(-1 为不限) |
concurrency |
1000 |
并发上限 |
hits_per_sec |
5 |
请求速率上限(每秒命中数) |
force |
False |
是否忽略缓存强制重新发现 |
query |
None |
用于相关性评分的查询 |
score_threshold |
None |
相关性分数过滤阈值 |
scoring_method |
"bm25" |
评分算法 |
filter_nonsense_urls |
True |
过滤明显无意义的 URL(脚本、样式资源等) |
cache_ttl_hours |
24 |
本地缓存有效期(小时) |
validate_sitemap_lastmod |
True |
校验 sitemap 的 lastmod 以判断缓存是否失效 |
base_directory |
None |
缓存目录根路径 |
5.3 发现方法的源码印证
发布说明列出四种发现方法,前两种在 AsyncUrlSeeder 中可直接定位到实现:
- Sitemap Mining:_from_sitemaps 先请求
robots.txt,提取其中声明的所有Sitemap:地址,支持 sitemap 索引(嵌套子 sitemap)递归展开,并对 XML 内容做_loc归一化; - Common Crawl:_from_cc 查询 Common Crawl 索引接口获取该域名的历史 URL 集合;
- 缓存与限速:结果按域名 + 配置写入本地缓存文件,配合
cache_ttl_hours与 sitemaplastmod校验(_is_cache_valid)避免重复全量发现,hits_per_sec控制对外部索引的访问速率; - 智能爬取与模式分析:发布说明提及的"跟随链接的深度控制"与"URL 结构学习生成变体",在当前仓库中由后续的 DomainMapper 进一步工程化(
sitemap+cc+crt+probe多源扫描、路径探测、软 404 指纹识别),可以理解为该方向的自然延伸。
若开启 query 与 extract_head,_apply_bm25_scoring 会以"URL + 标题 + meta 描述"为文档单元做 BM25 打分,低于 score_threshold 的结果被过滤——这与发布说明的"智能过滤与相关性评分"描述一致。配套测试与文档可参考 test_async_url_seeder_bm25.py 与 URL 种子教程。
六、性能优化
发布说明指出 v0.7.0 通过优化的资源处理、更优的并发管理与更小的内存占用带来显著性能提升,并给出示例:
# Optimized crawling with v0.7.0 improvements
results = []
for url in urls:
result = await crawler.arun(
url,
config=CrawlerRunConfig(
# Performance optimizations
wait_until="domcontentloaded", # Faster than networkidle
cache_mode=CacheMode.ENABLED # Enable caching
)
)
results.append(result)
结合源码可以印证两点:wait_until="domcontentloaded" 正是当前 CrawlerRunConfig 的默认等待策略(DOM 就绪而非网络空闲,显著减少等待时间);cache_mode 默认 BYPASS,需要显式设置为 ENABLED 等模式才启用 SQLite 缓存(缓存读写由 AsyncDatabase 管理)。发布说明声称的性能收益(浏览器初始化快 70%、页面加载降 40%、提取快 3 倍、内存降 60%、并发容量提升 5 倍)来自官方发布说明,实际数值请以自身环境压测为准。
七、破坏性变更与迁移指南
v0.7.0 的破坏性变更共三项,升级前必须处理:
link_extractor重命名为link_preview(更准确反映"抓取链接 head 信息"的功能);- 最低 Python 版本提升为 3.9;
CrawlerConfig拆分为CrawlerRunConfig(单次爬取行为)与BrowserConfig(浏览器生命周期),发布说明给出的迁移对照:
# Old (v0.6.x)
from crawl4ai import CrawlerConfig
config = CrawlerConfig(timeout=30000)
# New (v0.7.0)
from crawl4ai import CrawlerRunConfig, BrowserConfig
browser_config = BrowserConfig(timeout=30000)
run_config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS)
从当前源码结构看,这一拆分是长期生效的架构:BrowserConfig 管理浏览器类型、headless、CDP、代理、视口、stealth 等会话级配置,CrawlerRunConfig 管理缓存、等待、提取策略、link_preview_config、virtual_scroll_config 等单次爬取配置,二者分别传给 AsyncWebCrawler(config=...) 与 arun(config=...)。
八、路线图:智能 Web 自动化
发布说明还预告了后续方向:Crawl Agents(理解目标并自适应策略的自主爬虫)、自动 JS 生成(复杂交互)、智能表单处理、上下文感知动作。从当前仓库看,其中"自动 JS 生成"方向已落地为 C4A 脚本语言(c4a_compile.py 提供 compile/validate/generate_script,可由 HTML + 自然语言查询生成 .c4a 脚本)与 c4a-script 文档。
九、安装与版本说明
安装指定版本:
pip install crawl4ai==0.7.0
说明与适用前提:
- 本文以 v0.7.0 发布说明为骨架;当前仓库已演进到 0.9.0(version.py),核心 API(
AdaptiveCrawler/VirtualScrollConfig/LinkPreviewConfig/AsyncUrlSeeder)保持一致,但 0.7.0 之后的版本在参数与行为上可能有增强,引用新参数时请以对应版本源码为准; AdaptiveConfig(strategy="embedding")需要 embedding 依赖(sentence-transformers)及可选的 LLM 配置,纯统计策略则零额外依赖;- 相关深入文档可继续查阅仓库内的 adaptive-crawling、url-seeding、lazy-loading(虚拟滚动) 与 link-media,以及 adaptive_crawling 示例目录。
十、关键源码路径速查
| 能力 | 源码位置 | 验证位置 |
|---|---|---|
| 自适应爬取主流程 | crawl4ai/adaptive_crawler.py | tests/adaptive/test_adaptive_crawler.py |
| 置信度公式(统计策略) | StatisticalStrategy | tests/adaptive/test_embedding_strategy.py |
| 虚拟滚动处理 | crawl4ai/async_crawler_strategy.py | tests/test_virtual_scroll.py |
| 链接预览执行 | crawl4ai/link_preview.py | tests/test_link_extractor.py |
| 链接评分函数 | crawl4ai/utils.py | — |
| URL 种子引擎 | crawl4ai/async_url_seeder.py | tests/general/test_async_url_seeder_bm25.py |
| 配置定义(VirtualScroll/Seeding/LinkPreview/RunConfig) | crawl4ai/async_configs.py | tests/test_config_defaults.py |
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00