ARTICLE DETAIL

资讯详情

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

xberg Dart 爬虫提取实战:使用 crawl 模式跟随链接批量抽取网页内容

xberg Dart 爬虫提取实战:使用 crawl 模式跟随链接批量抽取网页内容 后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本篇指南围绕 xberg 项目 Dart 绑定中的 URL 爬取crawl提取能力展开讲解如何通过mode: crawl配置让提取引擎从种子 URL 出发自动发现并跟随页面内链接将多个网页的内容一次性抽取为结构化结果。读完本文你将掌握 xberg Dart 侧extract的完整调用流程、url.crawl爬虫策略参数的语义与默认值以及底层 Rust 引擎对爬取模式的分流处理与结果汇总机制可以直接在真实项目中复现可用的链接跟随式提取方案。一次跟随链接的提取从示例片段看完整流程仓库中 docs-site/src/snippets-generated/dart/url/url_crawl_linked_pages.md 是 alef 自动生成并用于类型检查与端到端验证的 Dart 示例片段完整演示了 crawl 模式的最小可运行写法import dart:io; import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { await RustLib.init(); try { final input await createExtractInputFromJson(json: {kind:uri,uri:https://example.com}); final config await createExtractionConfigFromJson(json: {url:{crawl:{max_depth:1,max_pages:4,respect_robots_txt:false},mode:crawl}}); final result await XbergBridge.extract(input, config: config); stdout.writeln(result.summary.pagesCrawled); stdout.writeln(result.results[1].content); } finally { RustLib.dispose(); } }这段代码包含四个关键步骤每一步都与 Rust 核心侧的 API 一一对应初始化原生运行时await RustLib.init()加载由 flutter_rust_bridge 生成的原生库示例末尾的finally块中RustLib.dispose()保证退出时释放资源。相关绑定生成代码位于 packages/dart/lib/src/xberg_bridge_generated/frb_generated.dart。构造输入createExtractInputFromJson以 JSON 字符串形式声明输入为{kind:uri,uri:...}即对指定 URL 发起 HTTP(S) 提取实际使用中也可换用kind: bytes直接传入字节流。构造配置createExtractionConfigFromJson是本篇的核心JSON 中url.mode设为crawl并在url.crawl下给出爬虫策略最大深度 1、最多 4 页、忽略 robots.txt。执行提取XbergBridge.extract(input, config: config)返回结果对象其中summary.pagesCrawled是被爬取页面总数results[1].content是第二个被跟随页面的正文内容。在 e2e/dart/test/url_test.dart 中可以看到与示例片段对应的端到端测试它对两个断言做了严格校验summary.pagesCrawled 2种子页 至少一个链接页且results[1].content包含链接页的正文特征文本About crawl target。url 提取的三种模式auto、document 与 crawlcrawl 模式并非独立功能而是 xberg URL 提取配置中的一种模式选择。在 crates/xberg/src/core/config/extraction/types.rs 中定义了枚举UrlExtractionModeauto默认先抓取 HTTP(S) 资源再按内容类型分类处理——HTML 走页面管线二进制/文档则作为文档下载提取。默认配置下未显式指定mode时即为此值。document把种子 URI 当作单个远程文档或页面处理只提取这一个资源本身。crawl从种子 URI 出发执行爬取将发现的所有页面/文档作为批量结果返回——即本示例使用的模式。对应的结构体UrlExtractionConfigtypes.rs除了mode之外还包含document_url_pattern对文档型链接的正则过滤max_document_urls_per_result每个提取结果最多跟随的文档链接数默认 100max_total_urls整个提取调用累计跟随的 URL 上限默认 1000allow_local_file_inputs/allow_file_uris是否允许本地文件系统路径与file://输入。crawl 配置项逐个拆解max_depth、max_pages 与 respect_robots_txt示例配置{max_depth:1,max_pages:4,respect_robots_txt:false}只是爬虫策略的一部分。xberg 通过依赖的 crawlberg 爬虫引擎的CrawlConfig透传全套参数其 xberg 默认值在 types.rs 的default_xberg_crawl_config()中定义配置项示例值xberg 默认值含义max_depth11从种子页算起的最大跟随深度1表示只跟随种子页的直接链接max_pages4100整个爬取过程最多抓取的页面总数上限max_concurrent未设置10并发抓取的最大连接数respect_robots_txtfalsetrue是否遵守目标站点的 robots.txt 规则示例为本地 mock 服务器而关闭soft_http_errors未设置true是否将 HTTP 错误页作为软错误继续处理而非中断stay_on_domain未设置true是否停留在种子域名内allow_subdomains未设置true是否允许跟随种子域名的子域document_url_depth未设置1对文档型链接的递归跟随深度示例片段显式给出max_depth、max_pages、respect_robots_txt三个参数其余则回落默认值。从配置 JSON 的层级可以看出所有爬虫参数都嵌套在url.crawl之下与url.mode平级。底层原理crawl 模式如何被 Rust 引擎执行模式分流scrape 与 crawl 两条路径在 crates/xberg/src/engine/extract_impl.rs 的extract_remote_uri中config.url.mode决定了底层引擎的调用方式match config.url.mode { UrlExtractionMode::Auto | UrlExtractionMode::Document { let scrape engine.scrape(uri).await.map_err(map_crawl_error)?; output_from_scrape(scrape, config, index).await } UrlExtractionMode::Crawl { let crawl engine.crawl(uri).await.map_err(map_crawl_error)?; output_from_crawl(crawl, config, index).await } }即auto/document走scrape抓取单页/单文档crawl走crawl跟随链接爬取。两种路径共用同一个CrawlEngine构建入口区别仅在于后续处理函数不同。引擎复用按配置指纹缓存 CrawlEngine批量提取多个 URL 时crates/xberg/src/engine/crawl_handle.rs 中的CrawlHandleMemo会把整个批次共享同一份爬虫配置的 URL 路由到一个crawlberg::CrawlEngine复用其缓存、限速器与中间件链。复用与否通过crawl_fingerprint判断将CrawlConfig序列化为规范 JSON 字节后取哈希作为稳定指纹crawl_handle.rs中crawl_fingerprint指纹一致直接克隆缓存的引擎不一致则重新校验并构建。这样既避免了重复构建开销也保证了不同配置之间不会错误复用。结果汇总pages_crawled 与页面顺序output_from_crawlextract_impl.rs接收crawlberg::CrawlResult将crawl.pages.len()写入summary.pages_crawled随后对每个页面调用result_from_crawl_page生成独立结果条目。值得注意的是每个页面的结果中还会注入crawl_depth元数据见 extract_impl.rs便于下游区分页面在爬取树中的层级。merge_crawl_summary则负责汇总最终 URL、重定向计数与去重后的规范化 URL 列表crawl_final_urls、crawl_redirect_count、crawl_unique_normalized_urls。这解释了示例中断言为何是results[1].content索引 0 是种子页面/索引 1 是由种子页a href/about链接发现并跟随的/about页面二者在 mock 服务器的响应中都被声明为text/html因此走 HTML 页面提取管线。端到端验证mock 服务器如何支撑跟随链接示例断言不是凭空设定的。fixture fixtures/url/url_crawl_linked_pages.json 中定义了对应的 mock 服务器行为GET /返回 200HTML 正文为h1Root Crawl Page/h1并带有指向/about的链接GET /about返回 200HTML 正文为h1About crawl target/h1pLinked page body./p输入为{kind:uri,uri:$mock_url}其中$mock_url由测试运行器替换为 mock 服务器地址断言为summary.pages_crawled 2两个页面均被抓取且results[1].content包含About crawl target。e2e 测试 url_test.dart 在setUpAll中设置CRAWLBERG_ALLOW_PRIVATE_NETWORKtrue环境变量允许爬虫引擎访问本地 mock 服务器再通过_fixtureUrl(url_crawl_linked_pages)将 fixture 的$mock_url占位符替换为实际测试地址。若本地没有可用的 SUT被测服务测试会回退到共享的 mock 服务器辅助函数startMockServer。从示例到生产将 crawl 模式接入 Dart 应用综合以上内容在真实 Dart 应用中启用链接跟随式提取的最小改动如下确认项目已引入 xberg Dart 包并执行原生库初始化RustLib.init()用createExtractInputFromJson构造uri类型输入用createExtractionConfigFromJson声明url.mode: crawl按站点规模设置max_depth与max_pages注意默认respect_robots_txt: true公网站点通常建议保留该默认值以避免合规风险调用XbergBridge.extract后遍历result.results读取各页面content用result.summary.pagesCrawled观察实际抓取规模用crawl_depth元数据判断页面层级。需要说明的适用前提crawl 提取依赖url-ingestionfeature在 crates/xberg/Cargo.toml 中定义为url-ingestion [url-config-types, crawlberg/native-runtime]并且要求 Tokio 运行时、不支持 wasm32 目标对应代码均以#[cfg(all(feature url-ingestion, feature tokio-runtime, not(target_arch wasm32)))]条件编译。若目标平台关闭该 featureURI 提取会返回UnsupportedFormat错误提示需要启用url-ingestion见 extract_impl.rs。除了本示例的 crawl 模式同一套url.crawl配置还支持两种相邻场景可在 e2e/dart/test/url_test.dart 中对照参考url_gzip_encoded_document验证 gzip 编码的远程文档提取url_recursive_document_urls则在mode: document下通过follow_document_urls: true与document_url_depth递归跟随结果中发现的文档链接——两者与 crawl 模式共同构成了 xberg 完整的 URL 提取能力矩阵。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg URL 爬取模式实战用 C 提取链接页面与多页站点内容xberg URL 爬取模式实战用 C 提取链接页面与多页站点内容 导读 xberg 的 URL 提取URL ingestion能力不止于抓取单个远程文后端AI 应用NLPXberg Dart 绑定实战用 url.mode: document 从网页 URL 提取 HTML 页面内容Xberg Dart 绑定实战用 url.mode: document 从网页 URL 提取 HTML 页面内容 本篇指南围绕 Xberg 的 Dart后端AI 应用NLP使用 Dart 绑定通过 Xberg extractBatch 批量抽取 URI 文档使用 Dart 绑定通过 Xberg extractBatch 批量抽取 URI 文档 导读 本指南围绕 Xberg 为 Dart/Flutter 提供的高层后端AI 应用NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表