如何使用 rs-trafilatura 与 spider-rs

发布: (2026年4月3日 GMT+8 22:21)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本(除代码块和 URL 之外的内容),我将把它翻译成简体中文并保持原有的 Markdown 格式。谢谢!

介绍

spider 是用 Rust 编写的高性能异步网络爬虫。它负责发现、获取和排队 URL——但内容提取由用户自行处理。rs‑trafilatura 作为提取层加入,为每个爬取的页面提供基于页面类型的内容提取,并附带质量评分。

添加依赖

将两个 crate 添加到你的 Cargo.toml 中:

[dependencies]
rs-trafilatura = { version = "0.2", features = ["spider"] }
spider = "2"
tokio = { version = "1", features = ["full"] }

spider 功能标志启用 rs_trafilatura::spider_integration,它提供了直接接受 spiderPage 类型的便利函数。

简单提取(爬取后处理)

use spider::website::Website;
use rs_trafilatura::spider_integration::extract_page;

#[tokio::main]
async fn main() {
    let mut website = Website::new("https://example.com");
    website.crawl().await;

    for page in website.get_pages().into_iter().flatten() {
        match extract_page(&page) {
            Ok(result) => {
                println!(
                    "[{}] {} (confidence: {:.2})",
                    result.metadata.page_type.unwrap_or_default(),
                    result.metadata.title.unwrap_or_default(),
                    result.extraction_quality,
                );
                println!("  Content: {} chars", result.content_text.len());
            }
            Err(e) => eprintln!("  Extraction failed: {e}"),
        }
    }
}

extract_page 接受一个 &Page 并返回 Result。页面 URL 会自动传递给分类器,用于页面类型检测。

流式提取(页面到达时处理)

use spider::website::Website;
use rs_trafilatura::spider_integration::extract_page;

#[tokio::main]
async fn main() {
    let mut website = Website::new("https://example.com");
    let mut rx = website.subscribe(0).unwrap();

    let handle = tokio::spawn(async move {
        let mut count = 0;
        while let Ok(page) = rx.recv().await {
            if let Ok(result) = extract_page(&page) {
                count += 1;
                println!(
                    "[{count}] {} → {} ({:.2})",
                    page.get_url(),
                    result.metadata.page_type.unwrap_or_default(),
                    result.extraction_quality,
                );
            }
        }
        println!("Extracted {count} pages");
    });

    website.crawl().await;
    website.unsubscribe();
    let _ = handle.await;
}

每当 spider 抓取到页面时,生成的任务就会立即对该页面进行提取。提取每页大约需要 44 毫秒,因此能够轻松跟上典型的爬取速度。

使用 extract_page_with_options 实现细粒度控制

use rs_trafilatura::{Options, spider_integration::extract_page_with_options};
use rs_trafilatura::page_type::PageType;

let options = Options {
    output_markdown: true,          // 获取 GFM Markdown 输出
    include_images: true,           // 提取图片元数据
    favor_precision: true,         // 更严格的过滤
    page_type: Some(PageType::Product), // 强制页面类型
    ..Options::default()
};

let result = extract_page_with_options(&page, &options)?;

if let Some(md) = &result.content_markdown {
    println!("Markdown:\n{}", md);
}

for img in &result.images {
    println!("Image: {} (hero: {})", img.src, img.is_hero);
}

如果在 options 中提供了 URL,它将在分类时优先于页面的 URL;否则会自动使用页面的 URL。

按提取质量过滤

for page in website.get_pages().into_iter().flatten() {
    let url = page.get_url().to_string();
    let result = extract_page(&page)?;

    if result.extraction_quality {
        // 在此添加您的过滤逻辑
    }
}

结果字段

字段类型描述
content_markdownOption<String>GFM Markdown(启用时)
content_htmlOption<String>提取的 HTML 内容
metadata.titleOption<String>页面标题
metadata.authorOption<String>作者姓名
metadata.dateOption<String>出版日期
metadata.page_typeOption<PageType>检测到的页面类型
extraction_qualityf640.0–1.0 置信度分数
imagesVec<Image>图片 URL、替代文字、标题

spider_transformations 的比较

spider 自带的 spider_transformations crate 可以将页面转换为 Markdown 或纯文本。它能工作,但它是一个基本的可读性风格提取器,缺少:

  • 机器学习页面类型分类
  • 针对特定类型的提取配置文件(论坛评论处理、多段合并、JSON‑LD 备选)
  • 提取质量评分
  • 从 JSON‑LD、Open Graph 和 Dublin Core 中提取结构化元数据

rs‑trafilatura 提供了所有这些功能。对于以文章为主的爬取,spider_transformations 可能已经足够;而对于遇到多种页面类型的爬取,rs‑trafilatura 能显著提升结果质量。

链接

  • rs-trafilatura:
  • Python 包:
  • spider:
  • 基准测试:
0 浏览
Back to Blog

相关文章

阅读更多 »

如何使用 rs‑trafilatura 与 crawl4ai

crawl4ai 是一个异步网页爬虫,旨在生成对 LLM 友好的输出。默认情况下,它使用自己的 scraping pipeline 将页面转换为 Markdown,但你可以……