Akashic Records

Scrapy 프레임워크 본문

Web Crawling for Beginners

Scrapy 프레임워크

Andrew's Akashic Records 2024. 5. 16. 15:17
728x90

Here is the energetic and dynamic illustration representing Scrapy as a fast and powerful tool for scraping and web crawling. The image features a futuristic robot with spider-like features, efficiently navigating through a digital network.

 

Scrapy는 웹 크롤링 및 데이터 스크래핑을 위해 사용되는 오픈 소스 파이썬 프레임워크입니다. 웹 사이트에서 데이터를 추출하고 파싱하는 데 필요한 모든 도구를 제공합니다. Scrapy는 비교적 쉽게 사용할 수 있으며, 강력한 성능을 제공하여 대규모 웹 사이트의 데이터를 효율적으로 수집할 수 있습니다.

 

주요 특징

  1. 유연성과 확장성: Scrapy는 사용자의 요구에 맞게 확장할 수 있는 구조를 갖추고 있습니다. 사용자는 필요에 따라 새로운 기능을 추가하거나 기존 기능을 수정할 수 있습니다.
  2. 데이터 추출: Scrapy는 XPath와 CSS 선택자를 사용하여 HTML 및 XML에서 데이터를 추출할 수 있습니다. 이를 통해 원하는 데이터를 정확하고 효율적으로 선택할 수 있습니다.
  3. 비동기 처리: Twisted, 비동기 네트워킹 프레임워크를 사용하여 설계된 Scrapy는 요청을 비동기적으로 처리합니다. 이는 동시에 여러 웹 페이지를 크롤링할 수 있게 하여 성능을 향상시킵니다.
  4. 로봇 배제 표준 준수: Scrapy는 웹사이트의 robots.txt 정책을 존중하며 이에 따라 크롤링을 조정할 수 있습니다.
  5. 항목 파이프라인: 데이터 정제, 유효성 검사 또는 데이터베이스 저장과 같은 추가 처리를 위해 크롤링된 데이터를 항목 파이프라인으로 보낼 수 있습니다.
  6. 플러그인 지원: 다양한 내장 확장 기능과 미들웨어를 통해 사용자 정의가 가능하며, 이를 통해 요청과 응답을 처리하는 방식을 조정할 수 있습니다.
  7. 쉬운 배포: Scrapy Cloud와 같은 플랫폼을 사용하여 Scrapy 프로젝트를 쉽게 배포하고 관리할 수 있습니다.

Scrapy의 구성 요소

  • Spiders: 웹사이트를 크롤링하고, 데이터를 추출하는 규칙을 정의합니다.
  • Items: 추출된 데이터를 저장하는 컨테이너입니다.
  • Item Pipeline: 데이터 처리 라인으로, 데이터 정제 및 저장 과정을 담당합니다.
  • Downloader: 웹 페이지의 다운로드를 담당하며, HTTP 요청을 처리합니다.
  • Scheduler: 요청을 관리하고 순서를 정하는 역할을 합니다.

사용 예

Scrapy 프로젝트를 시작하고, 스파이더를 생성하여 웹 페이지에서 데이터를 추출하는 간단한 예는 다음과 같습니다.

import scrapy

class MySpider(scrapy.Spider):
    name = 'example_spider'
    start_urls = ['https://example.com']

    def parse(self, response):
        for item in response.css('div.quote'):
            yield {
                'text': item.css('span.text::text').get(),
                'author': item.css('span small.author::text').get(),
            }

 

이 코드는 https://example.com에서 시작하여 각 페이지의 특정 요소를 찾아 데이터를 추출하고 딕셔너리 형태로 저장합니다. Scrapy는 이 과정을 매우 효율적으로 처리할 수 있습니다.

 

주요 구성 요소

Scrapy는 복잡한 웹 크롤링 및 데이터 추출 작업을 위한 강력한 프레임워크입니다. 이 프레임워크는 여러 구성 요소로 이루어져 있으며, 각 구성 요소는 특정 역할을 수행합니다. 여기서는 Scrapy의 주요 구성 요소들과 관련 API를 자세히 살펴보겠습니다.

 

1. Spiders

역할: 스파이더(Spider)는 크롤링 작업의 핵심으로, 어떤 웹사이트를 크롤링할 것인지, 어떤 데이터를 추출할 것인지를 정의합니다. 스파이더(Spider)는 start_urls 리스트에 크롤링을 시작할 URL을 지정하고, 웹페이지로부터 데이터를 추출하기 위해 parse 메서드를 구현합니다.

 

API:

  • scrapy.Spider: 가장 기본적인 Spider 클래스입니다.
  • start_requests(): Spider가 크롤링을 시작할 때 호출되는 메소드로, 시작 URL을 생성합니다.
  • parse(response): 웹 페이지의 응답을 처리하고 데이터를 추출하는 기본 콜백 함수입니다.
import scrapy

class NewsSpider(scrapy.Spider):
    name = 'news'
    start_urls = ['https://news.example.com']

    def parse(self, response):
        for article in response.css('div.article'):
            yield {
                'title': article.css('h2.title::text').get(),
                'summary': article.css('p.summary::text').get()
            }

 

2. Items

역할: 추출한 데이터를 저장하기 위한 컨테이너입니다. Scrapy에서는 파이썬 클래스로 아이템을 정의하며, 각 필드는 scrapy.Field()를 사용하여 선언됩니다.

 

API:

  • scrapy.Item: 데이터를 저장할 필드를 정의하는 클래스입니다.
  • scrapy.Field(): Item 내의 개별 필드를 정의할 때 사용됩니다.
import scrapy

class Article(scrapy.Item):
    title = scrapy.Field()
    summary = scrapy.Field()

 

3. Item Pipeline

역할: 아이템 파이프라인은 스파이더로부터 추출된 아이템을 처리하는 과정을 정의합니다. 이 파이프라인을 통해 데이터 검증, 중복 제거, 데이터베이스 저장 등의 작업을 수행할 수 있습니다.

 

API:

  • process_item(self, item, spider): 각 아이템을 처리하는 메소드입니다. 아이템과 Spider 객체를 인수로 받습니다.
class NewsPipeline:
    def process_item(self, item, spider):
        # 데이터베이스에 아이템 저장 로직
        return item

 

4. Middlewares

역할: Downloader Middleware와 Spider Middleware가 있습니다. 이들은 요청 및 응답을 가로채어 사용자 정의 코드를 실행할 수 있게 해 줍니다.

API:

  • process_request(self, request, spider): 요청을 서버로 보내기 전에 호출됩니다.
  • process_response(self, request, response, spider): 서버로부터의 응답을 받았을 때 호출됩니다.

5. Scheduler

역할: Scheduler는 Spider로부터 생성된 요청을 관리하고, 다운로더로 보내는 순서를 결정합니다.

API:

  • Scrapy는 기본적으로 자체 스케줄러를 사용합니다. 이는 내부적으로 메모리 기반의 우선순위 큐를 사용하여 요청을 관리합니다.

6. Downloader

역할: Downloader는 웹 페이지의 내용을 실제로 다운로드하는 구성 요소입니다. HTTP 요청을 실행하고 응답을 받아 Spider로 전달합니다.

 

API:

  • Downloader는 일반적으로 사용자가 직접 접근하거나 수정하지 않으며, Scrapy의 내부 구성 요소로 작동합니다.

이 구성 요소들을 통해 Scrapy는 강력하고 유연한 웹 크롤링 솔루션을 제공합니다. 각 구성 요소는 특정 역할을 담당하며, 이를 조합함으로써 복잡한 크롤링 작업도 효과적으로 관리할 수 있습니다. 자세한 API 사용법과 예제는 Scrapy의 공식 문서에서 찾아볼 수 있습니다. 이 문서는 각 API의 상세한 설명과 사용 방법을 제공합니다.

728x90
Comments