Scrapy와 함께 rs‑trafilatura 사용 방법

발행: (2026년 4월 3일 PM 11:23 GMT+9)
3 분 소요
원문: Dev.to

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)
0 조회
Back to Blog

관련 글

더 보기 »

Python에서 행렬

행렬 정의 python matrix = 1, 2, 3, 4, 5, 6, 7, 8, 9 3x3 행렬 만들기 python matrix_3x3 = 0 3 for in range3 일반적인 행렬 문제 행렬 전치…