rs-trafilatura
Rust에서 빠르고 정확하게 웹 콘텐츠를 추출합니다.
기능 (Features)
- 속도(Fast): 1,497페이지 벤치마크에서 기사당 71 파일/초, 전체 평균 46 파일/초를 기록합니다 (순수 Rust, 컴파일 타임 정규식 사용).
- 정확도(Accurate): ScrapingHub 벤치마크에서 F1 점수 0.966을 달성했으며, 7가지 페이지 유형 전반에 걸쳐 F1 점수 0.859를 기록합니다.
- 페이지 유형 분류 (Page Type Classification): XGBoost 분류기(트리 200개, 피처 181개)를 사용하여 다음 7가지 페이지 유형을 감지합니다: 기사(article), 포럼(forum), 제품(product), 컬렉션(collection), 목록(listing), 문서화(documentation), 서비스(service).
- 유형별 추출 (Per-Type Extraction): 각 페이지 유형에 맞게 조정된 전문 추출 프로필을 제공합니다 (포럼 플랫폼 12개, 문서화 프레임워크 4개, JSON-LD 제품 대체 기능 포함).
- 추출 품질 예측기 (Extraction Quality Predictor): 27개 피처의 XGBoost 모델을 사용하여 기계 학습(ML)-기반 신뢰 점수(0.0~1.0)를 산출하며, 이는 추출 F1 점수를 예측합니다. (F1 점수가 0.80 미만인 페이지는 LLM 대체 기능 적용 후보가 됩니다.)
- Markdown 출력: 제목(headings), 목록(lists), 표(tables), 굵게/기울임꼴(bold/italic), 코드 블록을 보존하는 GitHub Flavored Markdown 형식으로 출력이 가능합니다.
- 풍부한 메타데이터 (Rich Metadata): JSON-LD, Open Graph, Dublin Core 및 HTML 메타 태그에서 가져온 제목(Title), 작성자(author), 날짜(date), 설명(description), 카테고리(categories), 태그(tags), 라이선스(license) 및 이미지를 지원합니다.
- 설정 가능 (Configurable): 정밀도/재현율 트레이드오프(precision/recall tradeoff), 콘텐츠 선택 및 출력 형식을 조정할 수 있는 28가지 옵션을 제공합니다.
- 견고성 (Robust): 자동 문자 인코딩 감지(UTF-8, ISO-8859-1, Windows-1252)를 통해 손상된 HTML도 안정적으로 처리합니다.
빠른 시작 (Quick Start)
use rs_trafilatura::extract;
fn main() -> Result<(), rs-trafilatura::Error> {
...
설치 (Installation)
Cargo.toml에 추가하세요:
[dependencies]
rs-trafilatura = "0.2"
사용법 (Usage)
use rs_trafilatura::extract;
let result = extract(html)?;
...
사용자 정의 옵션 (Custom Options)
use rs-trafilatura::{extract_with_options, Options};
let options = Options {
...
Markdown 출력 (Markdown Output)
use rs-trafilatura::{extract_with_options, Options};
let options = Options {
...
페이지 유형 재정의 (Page Type Override)
use rs-trafilatura::{extract_with_options, Options};
use rs-trafilatura::page_type::PageType;
...
use rs_trafilatura::{extract_with_options, Options};
let options = Options {
...
인코딩을 알 수 없는 HTML의 경우:
use rs_trafilatura::extract_bytes;
let html_bytes: &[u8] = ;
...
spider-rs와의 통합 (Integration with spider-rs)
[spider] 웹 크롤러의 콘텐츠 추출기로서 rs-trafilatura를 사용하세요:
[dependencies]
rs-trafilatura = { version = "0.2", features = ["spider"] }
spider = "2"
...
사이트를 크롤링하고 모든 페이지에서 콘텐츠를 추출하세요:
use spider::website::Website;
use rs_trafilatura::spider_integration::extract_page;
...
let mut website = Website::new("https://example.com");
tokio::spawn(async move {
...
사용자 지정 추출 설정(마크다운 출력, 정밀도/재현율 트레이드오프 등)을 위해 extract_page_with_options를 사용하세요.
CLI (명령줄 인터페이스)
포함된 extract_stdin 바이너리는 표준 입력(stdin)에서 HTML을 읽어와 JSON으로 출력합니다:
echo '<html><body><h1>Test</h1><p>Hello world</p></body></html>' | cargo run --bin extract_stdin
...
ExtractResult 구조체는 다음을 포함합니다:
| Field | Type | Description |
|---|
content_text | String | 본문 기사 콘텐츠를 일반 텍스트로 담음 |
| ... | | |
벤치마크 (Benchmarks)
Linux x86_64 환경에서 1,497개의 HTML 파일(총 462 MB)을 기준으로 벤치마크되었습니다:
| Page Type | Count | ms/file | Avg Size | files/s |
|---|
| article | 782 | 14.1 | 225 KB | 71.0 |
| ... | | | | |
| 추출 속도는 페이지 크기에 비례합니다. 기사(가장 일반적인 페이지 유형)는 초당 71개 파일로 처리됩니다. | | | | |
ScrapingHub 기사 추출 벤치마크 (ScrapingHub Article Extraction Benchmark)
scrapinghub/article-extraction-benchmark에서 테스트되었습니다 (181개 기사 페이지):
| 구현체 | F1 | 정밀도(Precision) | 재현율(Recall) |
|---|
| rs-trafilatura (Rust) | 0.966 | 0.942 | 0.991 |
| ... | | | |
다중 유형 벤치마크 (Multi-Type Benchmark, WCXB)
Web Content Extraction Benchmark (https://webcontentextraction.org)(GitHub)에서 테스트되었으며, 7가지 페이지 유형에 걸쳐 총 1,497개의 페이지를 사용했습니다:
| 데이터셋 | F1 |
|---|
| Development set (1,497 pages) | 0.859 |
| ... | |
페이지 유형별 F1 (Per-Page-Type F1)
| 페이지 유형 | 개수 | F1 |
|---|
| Article | 793 | 0.932 |
| ... | | |
예시 (Examples)
examples/ 디렉터리를 참조하십시오:
cargo run --example basic
...
라이선스 (License)
MIT 또는 Apache-2.0
인용 (Citation)
학술 작업에 rs-trafilatura를 사용한 경우, 다음을 인용해 주십시오:
@software{rs_trafilatura,
title = {rs-trafilatura: Fast Web Content Extraction in Rust},
author = {Foley, Murrough},
...
감사의 글 (Acknowledgments)