如何使用 rs-trafilatura 与 spider-rs
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,它提供了直接接受 spider 的 Page 类型的便利函数。
简单提取(爬取后处理)
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_markdown | Option<String> | GFM Markdown(启用时) |
content_html | Option<String> | 提取的 HTML 内容 |
metadata.title | Option<String> | 页面标题 |
metadata.author | Option<String> | 作者姓名 |
metadata.date | Option<String> | 出版日期 |
metadata.page_type | Option<PageType> | 检测到的页面类型 |
extraction_quality | f64 | 0.0–1.0 置信度分数 |
images | Vec<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:- 基准测试: