Scrapy와 함께 rs‑trafilatura 사용 방법
Source: Dev.to
설치
pip install rs-trafilatura scrapy
파이프라인 설정
Scrapy 프로젝트의 settings.py에 파이프라인을 추가합니다:
ITEM_PIPELINES = {
"rs_trafilatura.scrapy.RsTrafilaturaPipeline": 300,
}
기본 스파이더
스파이더는 응답 본문(바이트)과 URL을 포함한 아이템을 반환합니다:
import scrapy
class ContentSpider(scrapy.Spider):
name = "content"
start_urls = ["https://example.com"]
def parse(self, response):
yield {
"url": response.url,
"body": response.body, # 원시 바이트 — rs-trafilatura가 인코딩을 자동 감지합니다
}
# 링크 따라가기
for href in response.css("a::attr(href)").getall():
yield response.follow(href, self.parse)
파이프라인은 body(바이트) 또는 html(문자열) 필드를 감지하고 추출을 수행한 뒤, 결과를 item["extraction"]에 추가합니다.
추출 결과 예시
{
"url": "https://example.com/blog/post",
"body": "...",
"extraction": {
"title": "Blog Post Title",
"author": "John Doe",
"date": "2026-01-15T00:00:00+00:00",
"main_content": "The full extracted text...",
"content_markdown": "# Blog Post Title\n\nThe full extracted text...",
"page_type": "article",
"extraction_quality": 0.95,
"language": "en",
"sitename": "Example Blog",
"description": "A blog post about..."
}
}
마크다운 출력 활성화
settings.py에 다음을 추가합니다:
RS_TRAFILATURA_MARKDOWN = True
활성화하면 item["extraction"]["content_markdown"]에 GitHub‑Flavored Markdown이 포함됩니다.
페이지 유형별 아이템 라우팅
page_type 필드를 기준으로 아이템을 라우팅하는 커스텀 파이프라인을 추가할 수 있습니다:
# myproject/pipelines.py
class PageTypeRouter:
def process_item(self, item, spider):
ext = item.get("extraction", {})
page_type = ext.get("page_type", "article")
if page_type == "product":
save_product(item)
elif page_type == "forum":
save_forum_post(item)
elif page_type == "article":
save_article(item)
else:
save_generic(item)
return item
settings.py에서 파이프라인 순서를 설정합니다:
ITEM_PIPELINES = {
"rs_trafilatura.scrapy.RsTrafilaturaPipeline": 300,
"myproject.pipelines.PageTypeRouter": 400,
}
저품질 추출 필터링
# myproject/pipelines.py
import scrapy
class QualityFilter:
def process_item(self, item, spider):
ext = item.get("extraction", {})
quality = ext.get("extraction_quality", 0)
if quality
- rs‑trafilatura GitHub 저장소:
- Rust 크레이트:
- Scrapy 문서:
- 벤치마크 세부 정보: (GitHub, Zenodo)