ARTICLE DETAIL

资讯详情

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

Crawl4AI v0.7.0 自适应智能升级深度解析:自适应爬虫、虚拟滚动、链接评分与 URL 种子发现

Crawl4AI v0.7.0 自适应智能升级深度解析:自适应爬虫、虚拟滚动、链接评分与 URL 种子发现 Crawl4AI v0.7.0 自适应智能升级深度解析自适应爬虫、虚拟滚动、链接评分与 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/crawl4aiCrawl4AI v0.7.0代号 Adaptive Intelligence Update是该项目从静态抓取工具迈向具备学习能力的爬虫框架的关键版本。本篇基于官方发布公告 v0.7.0 发布说明完整继承公告中的全部配置示例与核心概念并结合当前仓库源码逐一对应到实现细节帮助读者掌握 AdaptiveCrawler 自适应爬取、VirtualScrollConfig 无限滚动采集、LinkPreview 链接评分与 AsyncUrlSeeder URL 发现四大特性的用法与底层原理。版本概览Whats New at a Glance发布说明中对 v0.7.0 的五项核心变化总结如下Adaptive Crawling自适应爬取爬虫会观察站点模式、建立置信度评分并动态调整抓取策略Virtual Scroll Support虚拟滚动支持完整采集无限滚动页面的内容应对 DOM 回收问题Link Preview with Intelligent Scoring链接预览与智能评分对页面上的链接做三层评分帮助优先跟进最有价值的 URLAsync URL Seeder异步 URL 种子器结合 sitemap、Common Crawl 等多种来源在数秒内发现数千个 URLPerformance Optimizations性能优化资源处理、并发管理与内存占用方面的改进。安装方式发布公告原文pip install crawl4ai0.7.0四大特性在包入口 crawl4ai/init.py 中均已导出为公共 APIAsyncUrlSeeder、VirtualScrollConfig、LinkPreviewConfig、AdaptiveCrawler、AdaptiveConfig、CrawlState等均可直接from crawl4ai import ...使用。重要变更与迁移指南Breaking Changes发布公告列出了 v0.7.0 的三项破坏性变更这些在仓库源码中均可得到印证CrawlerConfig拆分为CrawlerRunConfig与BrowserConfig。源码中两个配置类分别定义在 crawl4ai/async_configs.pyBrowserConfig管理浏览器级参数headless、viewport、proxy、user_agent 等CrawlerRunConfig管理单次运行参数cache_mode、wait_until、extraction_strategy 等。迁移方式# 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)link_extractor更名为link_preview。对应实现类LinkPreview位于 crawl4ai/link_preview.pyCrawlerRunConfig中的挂载参数也相应命名为link_preview_configPreview更准确地表达了抓取链接 head 内容做预览评分的功能本质。最低 Python 版本提升至 3.9。需要说明的是当前仓库 pyproject.toml 中requires-python 3.10即随着版本演进现仓库实际要求 Python 3.10 及以上3.9 是 v0.7.0 发布时的下限声明。自适应爬虫基于置信度收敛的智能抓取问题背景与设计思路发布说明将痛点描述为网站模板会变化精心编写的选择器随时可能失效。v0.7.0 的解法是一个自适应学习系统——它观察抓取结果中的模式、维护置信度评分并据此调整提取与跟进策略。实现载体是 crawl4ai/adaptive_crawler.py其模块文档字符串写明目标determines when sufficient information has been gathered to answer a query, avoiding unnecessary crawls while ensuring comprehensive coverage判断何时已收集到足以回答查询的信息避免无谓抓取的同时保证覆盖度。基本用法发布公告给出的完整示例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())该示例中用到的digest(start_url, query)、adaptive.confidence、adaptive.state.knowledge_base、get_relevant_content(top_k)均与 AdaptiveCrawler 类实现 完全一致。更多可运行示例见 docs/examples/adaptive_crawling/basic_usage.py 与 docs/examples/adaptive_crawling/embedding_configuration.py。AdaptiveConfig 完整参数以源码为准AdaptiveConfig定义在 crawl4ai/adaptive_crawler.py#L153-L227除公告中用到的字段外还包含若干高级参数参数默认值说明strategystatistical策略类型statistical纯统计无 LLM/无 embedding或embedding语义覆盖分析confidence_threshold0.7置信度达到该值即停止0~1max_depth5最大扩展轮次max_pages20最大抓取页数top_k_links3每轮只跟进排名前 K 的链接min_gain_threshold0.1排名第一的候选链接期望收益低于该值时停止saturation_threshold0.8信息饱和阈值饱和度过高则停止coverage_weight/consistency_weight/saturation_weight0.4 / 0.3 / 0.3置信度三项指标的权重校验逻辑要求三者之和为 1relevance_weight/novelty_weight/authority_weight0.5 / 0.3 / 0.2链接排序三项得分的权重同样要求求和为 1save_state/state_pathFalse/None每轮结束后将CrawlState持久化为 JSON支持断点续抓embedding_modelsentence-transformers/all-MiniLM-L6-v2embedding 策略使用的模型validate()方法对上述权重做求和校验源码配置错误会在构造阶段即暴露这是配置自适应爬虫时值得注意的一点。digest 主循环与停止条件AdaptiveCrawler.digest是整个模块的入口源码主循环逻辑为抓取start_url附带链接预览将结果写入知识库knowledge_base把内部链接放入待抓队列pending_links每一轮调用strategy.calculate_confidence(state)计算置信度 →should_stop检查停止条件 →rank_links对候选链接按期望信息增益排序 → 若最高分低于min_gain_threshold则停止 → 取前top_k_links个未抓链接批量抓取 →update_state更新词频统计。停止条件统计策略实现于 crawl4ai/adaptive_crawler.py#L527-L546包括置信度 ≥confidence_threshold、已抓页数达到max_pages、待抓链接耗尽、或饱和度 ≥saturation_threshold。置信度的构成覆盖、一致性、饱和度发布说明称自适应爬虫为每个域名维护持久化状态跟踪模式成功率、选择器稳定性、内容结构差异与提取置信度。从源码结构看CrawlState源码实际跟踪的是已抓 URL 集合、知识库CrawlResult列表、待抓链接、查询词、TF/DF 词频统计、新词发现历史new_terms_history等。StatisticalStrategy的置信度公式为源码confidence 0.4 * coverage 0.3 * consistency 0.3 * saturationcoverage覆盖度查询词在知识库中的文档覆盖率并对词频取对数归一化加权最后做开方曲线平滑consistency一致性知识库内两两文档的 Jaccard 词重叠均值衡量话题聚焦程度saturation饱和度基于新词发现速率的递减比例——后期每页发现的新词越少饱和度越高意味着继续抓取收益递减。链接排序得分则为0.5 * relevance 0.3 * novelty 0.2 * authorityrelevance 优先复用 LinkPreview 阶段算好的 BM25 上下文分contextual_scorenovelty 统计链接预览文本中知识库未见过的新词占比。此外CrawlState支持save()/load()JSON 持久化与digest(resume_from...)断点恢复export_knowledge_base()/import_knowledge_base()支持知识库跨会话交换jsonl 格式。实际场景发布公告列出的预期收益包括新闻聚合模板改版下保持高提取准确率、电商监控跨数百店铺免维护跟踪、学术数据收集跨站改版生存以及选择器维护工作量下降。这些属于发布说明中的场景化描述实际效果取决于目标站点建议以 tests/adaptive/test_adaptive_crawler.py 与 tests/adaptive/test_embedding_strategy.py 中的测试口径为准。更完整的文档见 docs/md_v2/core/adaptive-crawling.md。虚拟滚动完整捕获无限滚动页面问题背景现代 Web 应用Twitter/X 信息流、Instagram 风格商品网格、新闻懒加载列表只渲染可见区域滚动时旧内容会被虚拟 DOM 回收销毁。传统爬虫只能拿到首屏发布说明称这相当于只读了每本书的第一页。VirtualScrollConfig 参数配置类定义在 crawl4ai/async_configs.py#L1110-L1150参数默认值说明container_selector必填可滚动容器的 CSS 选择器scroll_count10最大滚动次数scroll_bycontainer_height滚动幅度container_height按容器高度、page_height按视口高度或整数像素值wait_after_scroll0.5每次滚动后等待内容加载的秒数发布说明给出的三组典型配置社交信息流 / 电商网格 / 新闻列表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)配置通过CrawlerRunConfig.virtual_scroll_config挂载参数支持传对象或字典CrawlerRunConfig 定义 中类型为Union[VirtualScrollConfig, Dict[str, Any]]。实现原理三态检测 分块合并核心实现在 AsyncCrawlerStrategy._handle_virtual_scroll。该方法向页面注入一段 JavaScript在滚动容器上执行循环每轮对比滚动前后container.innerHTMLCase 0 无变化继续滚动Case 1 追加appendedcurrentHTML.startsWith(previousHTML)成立说明新条目是追加进来的内容仍在页面中无需特殊处理Case 2 替换replaced内容被 DOM 回收重写此时把上一帧 HTML作为 chunk 压栈保存防止内容丢失。当scrollTop clientHeight scrollHeight - 10判定到达底部时提前结束。滚动结束后如果存在被替换的 chunk脚本会把所有 chunk 解析进临时 div按元素文本归一化小写、去空格符号去重再用container.innerHTML uniqueElements.join(\n)把合并后的唯一元素写回容器——这正是发布说明中Content Preservation在被销毁前捕获与Memory Efficient流式处理而非全量驻留内存的落地方式。整个过程在浏览器端完成Python 侧只拿到{chunksCount, uniqueCount, replaced}摘要日志。配套资源可本地复现的演示页面有 docs/examples/assets/virtual_scroll_twitter_like.html、virtual_scroll_instagram_grid.html、virtual_scroll_news_feed.html 与 virtual_scroll_append_only.html分别模拟替换型与追加型滚动运行示例见 docs/examples/virtual_scroll_example.py自动化测试见 tests/test_virtual_scroll.py专题文档见 docs/md_v2/advanced/virtual-scroll.md。Link Preview三层评分的链接智能分析问题背景抓取一页会得到数百个链接哪些值得跟进传统做法要么全跟、要么手写过滤器。v0.7.0 的方案是三层评分系统像人类一样从位置、上下文、与目标的相关性三个维度评估链接。基本用法发布说明示例完整继承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在 v0.7.0 发布说明中从crawl4ai.adaptive_crawler导入而在当前仓库中它定义于 crawl4ai/async_configs.py 并从 crawl4ai/init.py 直接导出from crawl4ai import LinkPreviewConfig即可另外示例里result.links.get(internal, [])的字典写法对应Links模型的序列化视图crawl4ai/models.py 中定义了Links/Link模型Link带有intrinsic_score、contextual_score、total_score、head_data等字段。LinkPreviewConfig 参数源码默认值定义于 crawl4ai/async_configs.py参数默认值说明include_internalTrue是否对内链做 head 预览include_externalFalse是否对外链做 head 预览include_patternsNoneglob 包含模式列表fnmatch语义exclude_patternsNoneglob 排除模式列表concurrency10并发抓取 head 的并发数timeout5单个 URL 抓取超时秒max_links100参与预览的链接上限queryNone提供后启用 BM25 上下文评分score_thresholdNone上下文分低于该值的链接被过滤verboseFalse是否输出批次进度日志三层评分的实现证据发布说明描述的评分组成与源码逐一对应Intrinsic Score固有质量分0~10由 calculate_link_intrinsic_score 实现纯字符串分析、不触碰 DOM。可见的规则包括title属性有效 1.0class 含nav/menu/primary/main/important1.5含ad/sponsor/track/promo/banner−1.0rel含canonical/next/prev/chapter1.0含nofollow/sponsored/ugc−0.5此外还有 URL 结构质量与锚文本质量评分。这正是公告中位置、链接属性、锚文本质量、URL 深度的落地。Contextual Score上下文相关性分由AsyncUrlSeeder的 BM25 打分管线计算——LinkPreview内部构造SeedingConfig(extract_headTrue, query..., scoring_methodbm25)先只抓各链接的head标题、meta description/keywords再对查询词做 BM25 相关性评分。实现链在 crawl4ai/link_preview.py#L177-L222。Total Score总分_merge_head_data阶段调用 calculate_total_score 按score_links开关与是否提供 query 组合出最终排序分crawl4ai/link_preview.py#L328-L399。LinkPreview的完整流程为extract_link_heads→_filter_links内外链筛选 模式过滤 去重 截断到 max_links→_extract_heads_parallel复用 URLSeeder 的并发与缓存设施抓 head→_merge_head_data把 head 数据、状态、相关性分合并回Link对象并按相关性降序排序。该机制与自适应爬虫深度耦合——digest抓取时即为链接携带预览StatisticalStrategy._calculate_relevance直接复用contextual_score。运行示例见 docs/examples/link_head_extraction_example.py回归测试见 tests/test_merge_head_data_scoring.py。Async URL Seeder规模化 URL 自动发现问题背景你只有首页却想爬整个域名或想在数千页中只找特定内容类型。手工收集 URL 不现实v0.7.0 提供的AsyncUrlSeeder是一个多来源、可过滤、可评分的 URL 发现引擎。基本用法发布说明示例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())返回结构为List[Dict]每项含url、relevance_score启用评分时、head_dataextract_headTrue时等字段。SeedingConfig 参数源码默认值定义于 crawl4ai/async_configs.py参数默认值说明sourcesitemapcc发现源组合sitemap、ccCommon Crawl可叠加pattern*glob 风格 URL 模式过滤live_checkFalse是否对结果做存活检查extract_headFalse是否抓取 head 元数据标题、metamax_urls-1结果上限-1 表示不限concurrency1000并发 worker 数hits_per_sec5限速次/秒forceFalse忽略本地缓存强制重新获取query/score_threshold/scoring_methodNone/None/bm25BM25 相关性评分配置filter_nonsense_urlsTrue过滤无意义 URLcache_ttl_hours24缓存有效期小时validate_sitemap_lastmodTrue结合 sitemap 的 lastmod 校验缓存有效性发现管线与缓存机制公告列出的四种发现方式中源码crawl4ai/async_url_seeder.py可确认的是Sitemap Mining与Common CrawlSitemap Mining_from_sitemaps解析 robots.txt 中声明的 sitemap递归处理子 sitemap并做 TTL lastmod 双条件缓存校验失效时回退直连抓取源码Common Crawl_from_cc先查询 CC collection-info 接口拿最新索引 ID再流式拉取 URL 索引带 503 退避重试结果以 jsonl 落盘缓存源码两者结果经有界队列min(10000, max(1000, concurrency*100))汇合防止大域名的内存尖峰随后由 worker 做去重、模式匹配、垃圾 URL 过滤与 BM25 评分_apply_bm25_scoring。此外多域名版本many_urls与extract_head_for_urls被 LinkPreview 复用也在同一模块中。教程与演示见 docs/examples/url_seeder/url_seeder_demo.py、docs/examples/url_seeder/url_seeder_quick_demo.py 与 教程文档测试见 tests/general/test_async_url_seeder_bm25.py专题文档见 docs/md_v2/core/url-seeding.md。性能优化公告声明与源码对应发布说明中给出的性能数据浏览器初始化提速 70%、资源拦截减少 40% 页面加载、CSS 选择器编译使提取提速 3 倍、流式处理降低 60% 内存、5 倍并发能力属于发布公告的声明值仓库内没有对应的基准测试数据可复核引用时应注明出处为发布说明。公告同时给出的优化实践在源码中可直接对应# 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 的默认值即默认就不等 networkidleCacheMode枚举ENABLED / BYPASS / NO_READ / NO_WRITE 等配合 crawl4ai/async_database.py 的 SQLite 缓存实现重复 URL 免抓取批量场景下的并发控制由 crawl4ai/async_dispatcher.py 提供SemaphoreDispatcher信号量限流默认 5与MemoryAdaptiveDispatcher按内存阈值动态暂停/恢复任务可作为arun_many的dispatcher参数传入对应公告5x 并发的支撑设施。版本路线图发布公告中的 Coming Soon发布说明最后预告了后续方向Crawl Agents自主理解目标的爬虫、Auto JS Generation复杂交互的自动 JS 生成、Smart Form Handling智能表单识别与填写、Context-Aware Actions基于页面上下文的决策。从当前仓库结构看crawl4ai/script/c4ai_script.py 已提供了一套可编译为 Playwright 脚本的声明式脚本语言c4a_compile/c4a_validate已在包入口导出与该方向存在关联其余方向在仓库中尚无对应实现应以后续版本发布为准。小结与延伸阅读v0.7.0 的四个特性构成了一条完整的发现 → 筛选 → 抓取 → 收敛链路AsyncUrlSeeder从 sitemap 与 Common Crawl 中发现候选 URL 并做 BM25 预评分LinkPreview在抓取过程中为每个链接补充 head 预览与三层评分VirtualScrollConfig保证单页内容采集的完整性AdaptiveCrawler则把前三者的信号汇总为置信度驱动的智能收敛决策。核心源码文件对照特性主要实现配置类自适应爬取crawl4ai/adaptive_crawler.pyAdaptiveConfig/CrawlState虚拟滚动crawl4ai/async_crawler_strategy.py#L1286-L1455VirtualScrollConfig链接预览评分crawl4ai/link_preview.py crawl4ai/utils.py#L3398LinkPreviewConfigURL 种子发现crawl4ai/async_url_seeder.pySeedingConfig延伸阅读docs/examples/adaptive_crawling/README.md、docs/md_v2/advanced/virtual-scroll.md、docs/md_v2/core/url-seeding.md 以及各特性目录下的测试用例。【免费下载链接】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),仅供参考
返回列表