ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Crawl4AI v0.7.0 自适应智能更新深度解析:AdaptiveCrawler、虚拟滚动、链接智能评分与异步 URL 种子发现

Crawl4AI v0.7.0 自适应智能更新深度解析:AdaptiveCrawler、虚拟滚动、链接智能评分与异步 URL 种子发现 Crawl4AI v0.7.0 自适应智能更新深度解析AdaptiveCrawler、虚拟滚动、链接智能评分与异步 URL 种子发现【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai本篇基于 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 种子发现结合智能过滤秒级发现成百上千个 URLPerformance 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( strategystatistical, # or embedding for semantic understanding max_pages10, confidence_threshold0.7, # Stop at 70% confidence top_k_links3, # Follow top 3 links per page min_gain_threshold0.05 # Need 5% information gain to continue ) async with AsyncWebCrawler(verboseFalse) as crawler: adaptive AdaptiveCrawler(crawler, config) print(Starting adaptive crawl about Python decorators...) result await adaptive.digest( start_urlhttps://docs.python.org/3/glossary.html, querypython 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_k3) 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 源码定义 揭示了完整的配置面。所有参数均可用默认值运行参数默认值说明strategystatistical爬取策略可选statistical纯统计、无 LLM、无 embedding或embedding语义空间覆盖confidence_threshold0.7置信度达到该值即停止取值 0~1max_depth5自适应扩展的最大深度max_pages20最大爬取页数top_k_links3每轮选取得分最高的 K 个链接min_gain_threshold0.1链接最高分低于该值则停止信息增益门槛saturation_threshold0.8信息饱和度阈值达到即停consistency_threshold0.7一致性阈值coverage_weight/consistency_weight/saturation_weight0.4/0.3/0.3三项指标加权组合validate()强制要求三者之和为 1relevance_weight/novelty_weight/authority_weight0.5/0.3/0.2链接评分权重同样强制和为 1save_state/state_pathFalse/None是否持久化爬取状态、持久化文件路径embedding_modelsentence-transformers/all-MiniLM-L6-v2embedding 策略使用的向量模型embedding_llm_config/query_llm_configNone分别为 embedding 生成与查询扩展chat completion单独配置的 LLMn_query_variations10查询语义空间扩展的变体数量coverage_threshold0.85语义覆盖阈值embedding_coverage_radius0.2已覆盖查询点的余弦距离半径越小越严格embedding_k_exp1.0距离到分数映射的指数衰减因子score exp(-k·d)embedding_nearest_weight/embedding_top_k_weight0.7/0.3最近邻与 top-k 均值的混合评分权重embedding_overlap_threshold0.85高于该相似度的链接视为冗余并被降权link_preview_timeout5.0链接预览head 抓取超时秒数embedding_min_relative_improvement0.1继续爬取所需的最小相对置信度提升embedding_validation_min_score0.3低于该验证分数则不认为收敛可信防止过早停止配置对象在构造AdaptiveCrawler时会调用validate()做断言校验权重和为 1、各阈值在 0~1 区间等非法配置会在启动阶段即报错。2.4 工作原理CrawlState 状态机与置信度公式从源码结构看AdaptiveCrawler.digest() 是整个流程的主循环初始化/恢复状态若传入resume_from通过CrawlState.load(path)从 JSON 文件恢复完整状态已爬 URL、知识库、待爬链接、词频统计、embedding 矩阵等否则创建新的CrawlState首爬对start_url执行一次带链接预览的爬取内部构造LinkPreviewConfig(max_links50, concurrency5, timeoutlink_preview_timeout)并开启score_linksTrue见 _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 策略与状态持久化除统计策略外strategyembedding时启用 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(detailedTrue)、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-testidprimaryColumn], scroll_count20, # Number of scrolls scroll_bycontainer_height, # Smart scrolling by container size wait_after_scroll1.0 # Let content load ) # For e-commerce product grids (Instagram style) grid_config VirtualScrollConfig( container_selectormain .product-grid, scroll_count30, scroll_by800, # Fixed pixel scrolling wait_after_scroll1.5 # Images need time ) # For news feeds with lazy loading news_config VirtualScrollConfig( container_selector.article-feed, scroll_count50, scroll_bypage_height, # Viewport-based scrolling wait_after_scroll0.5 # Wait for content to load ) # Use it in your crawl async with AsyncWebCrawler() as crawler: result await crawler.arun( https://twitter.com/trending, configCrawlerRunConfig( virtual_scroll_configtwitter_config, # Combine with other features extraction_strategyJsonCssExtractionStrategy({ tweets: { selector: [data-testidtweet], fields: { text: {selector: [data-testidtweetText], type: text}, likes: {selector: [data-testidlike], type: text} } } }) ) ) print(fCaptured {len(result.extracted_content[tweets])} tweets)3.3 VirtualScrollConfig 参数与默认值VirtualScrollConfig 定义 中各参数默认值为参数默认值说明container_selector必填可滚动容器的 CSS 选择器JS 会在该容器上执行scrollTop滚动scroll_count10最大滚动次数上限scroll_bycontainer_height滚动步长整数表示固定像素page_height表示一个视口高度container_height表示容器自身高度wait_after_scroll0.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_linksTrue启用固有评分、从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_internalTrue, include_externalFalse, max_links10, concurrency5, querypython tutorial, # For contextual scoring score_threshold0.3, verboseTrue ) # Use in your crawl async with AsyncWebCrawler() as crawler: result await crawler.arun( https://www.geeksforgeeks.org/, configCrawlerRunConfig( link_preview_configlink_config, score_linksTrue, # Enable intrinsic scoring cache_modeCacheMode.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_internalTrue是否包含站内链接include_externalFalse是否包含站外链接include_patterns/exclude_patternsNone按 URL 模式包含/排除glob 风格concurrency10并发抓取链接 head 的协程数timeout5单个链接 head 抓取超时秒max_links100最多预览的链接数量queryNone上下文评分用查询串score_thresholdNone相关性分数过滤阈值verboseFalse是否输出调试日志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_links50的预览配置是 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( sourcesitemap, # Use sitemap pattern*python*, # URL pattern filter extract_headTrue, # Get metadata querypython tutorial, # For relevance scoring scoring_methodbm25, score_threshold0.2, max_urls10 ) 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 完整参数参数默认值说明sourcesitemapcc数据源sitemap解析 robots.txt 与全部关联 sitemap、cc查询 Common Crawl 索引的历史 URL、或二者组合pattern*URL 模式过滤glob如*python*live_checkFalse是否对 URL 做实时可达性检查extract_headFalse是否抓取每个 URL 的head元数据标题/descriptionmax_urls-1最大返回 URL 数-1 为不限concurrency1000并发上限hits_per_sec5请求速率上限每秒命中数forceFalse是否忽略缓存强制重新发现queryNone用于相关性评分的查询score_thresholdNone相关性分数过滤阈值scoring_methodbm25评分算法filter_nonsense_urlsTrue过滤明显无意义的 URL脚本、样式资源等cache_ttl_hours24本地缓存有效期小时validate_sitemap_lastmodTrue校验 sitemap 的 lastmod 以判断缓存是否失效base_directoryNone缓存目录根路径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 进一步工程化sitemapcccrtprobe多源扫描、路径探测、软 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, configCrawlerRunConfig( # Performance optimizations wait_untildomcontentloaded, # Faster than networkidle cache_modeCacheMode.ENABLED # Enable caching ) ) results.append(result)结合源码可以印证两点wait_untildomcontentloaded正是当前 CrawlerRunConfig 的默认等待策略DOM 就绪而非网络空闲显著减少等待时间cache_mode默认BYPASS需要显式设置为ENABLED等模式才启用 SQLite 缓存缓存读写由 AsyncDatabase 管理。发布说明声称的性能收益浏览器初始化快 70%、页面加载降 40%、提取快 3 倍、内存降 60%、并发容量提升 5 倍来自官方发布说明实际数值请以自身环境压测为准。七、破坏性变更与迁移指南v0.7.0 的破坏性变更共三项升级前必须处理link_extractor重命名为link_preview更准确反映抓取链接 head 信息的功能最低 Python 版本提升为 3.9CrawlerConfig拆分为CrawlerRunConfig单次爬取行为与BrowserConfig浏览器生命周期发布说明给出的迁移对照# Old (v0.6.x) from crawl4ai import CrawlerConfig config CrawlerConfig(timeout30000) # New (v0.7.0) from crawl4ai import CrawlerRunConfig, BrowserConfig browser_config BrowserConfig(timeout30000) run_config CrawlerRunConfig(cache_modeCacheMode.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 crawl4ai0.7.0说明与适用前提本文以 v0.7.0 发布说明为骨架当前仓库已演进到 0.9.0version.py核心 APIAdaptiveCrawler/VirtualScrollConfig/LinkPreviewConfig/AsyncUrlSeeder保持一致但 0.7.0 之后的版本在参数与行为上可能有增强引用新参数时请以对应版本源码为准AdaptiveConfig(strategyembedding)需要 embedding 依赖sentence-transformers及可选的 LLM 配置纯统计策略则零额外依赖相关深入文档可继续查阅仓库内的 adaptive-crawling、url-seeding、lazy-loading虚拟滚动 与 link-media以及 adaptive_crawling 示例目录。十、关键源码路径速查能力源码位置验证位置自适应爬取主流程crawl4ai/adaptive_crawler.pytests/adaptive/test_adaptive_crawler.py置信度公式统计策略StatisticalStrategytests/adaptive/test_embedding_strategy.py虚拟滚动处理crawl4ai/async_crawler_strategy.pytests/test_virtual_scroll.py链接预览执行crawl4ai/link_preview.pytests/test_link_extractor.py链接评分函数crawl4ai/utils.py—URL 种子引擎crawl4ai/async_url_seeder.pytests/general/test_async_url_seeder_bm25.py配置定义VirtualScroll/Seeding/LinkPreview/RunConfigcrawl4ai/async_configs.pytests/test_config_defaults.py【免费下载链接】crawl4ai Crawl4AI: Open-source LLM Friendly Web Crawler Scraper. Dont be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表