기억을 지배하는 기록

Scrapy, Pipelines 본문

Web Crawling for Beginners

Scrapy, Pipelines

Andrew's Akashic Records 2024. 7. 10. 13:15
728x90

Here is an illustrated diagram depicting a Python Scrapy pipeline. This image visualizes the sequence of stages from web crawling to data storage, helpful for understanding the data flow in a Scrapy project.

Scrapy 파이프라인

Scrapy는 웹 크롤링과 스크레이핑을 위한 파이썬 프레임워크로, 웹 사이트로부터 데이터를 추출하고 이를 다양한 형식으로 저장할 수 있게 해줍니다. Scrapy 프로젝트의 중요한 구성 요소 중 하나는 파이프라인(pipeline)입니다. 파이프라인은 데이터 처리를 위한 일련의 과정을 정의하며, 크롤링 과정에서 수집된 아이템을 처리하고 저장하는 역할을 합니다.

 

Scrapy 파이프라인의 주요 기능

  1. 클린업: 수집된 데이터의 포맷을 정리하거나, 타이핑 오류를 수정하는 등의 클린업 작업을 수행합니다.
  2. 유효성 검사: 아이템이 완전하고 유효한지 확인합니다. 예를 들어 필수 필드가 비어 있지 않은지 검사할 수 있습니다.
  3. 아이템 중복 제거: 동일한 아이템이 여러 번 수집되는 것을 방지합니다.
  4. 데이터 저장: 아이템을 데이터베이스나 파일 등 지정된 저장소에 저장합니다.

파이프라인 구성 방법

Scrapy에서 파이프라인을 설정하고 활성화하기 위해 다음 단계를 따릅니다:

  1. 파이프라인 클래스 정의: pipelines.py 파일에 파이프라인 로직을 포함하는 클래스를 정의합니다. 이 클래스는 process_item 메서드를 구현해야 하며, 이 메서드는 각 아이템을 처리한 후 반환해야 합니다.

  2. 설정 활성화: settings.py 파일에서 ITEM_PIPELINES 설정을 사용하여 파이프라인을 활성화합니다. 파이프라인 클래스와 함께 실행 순서를 정의하는 정수 값을 매핑합니다. 숫자가 낮을수록 파이프라인 컴포넌트가 먼저 실행됩니다.
    ITEM_PIPELINES = {
        'myproject.pipelines.PriceConverterPipeline': 300,
        'myproject.pipelines.SaveToDatabasePipeline': 800,
    }
  3. 파이프라인 로직 구현: 각 파이프라인 컴포넌트에서 필요한 데이터 처리 로직을 구현합니다. 예를 들어 PriceConverterPipeline에서는 가격 정보를 변환하고, SaveToDatabasePipeline에서는 데이터베이스에 저장합니다.

예제: 간단한 파이프라인

아래는 간단한 Scrapy 파이프라인의 예제 코드입니다:

class CleanUpPipeline(object):
    def process_item(self, item, spider):
        item['price'] = item['price'].replace('$', '').strip()
        return item

class SaveToDatabasePipeline(object):
    def open_spider(self, spider):
        self.client = MongoClient('localhost', 27017)
        self.db = self.client['mydatabase']

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db['products'].insert_one(dict(item))
        return item

이 코드는 가격 정보를 정리하고, 아이템을 MongoDB 데이터베이스에 저장하는 두 개의 파이프라인을 포함합니다. 이처럼 Scrapy 파이프라인을 사용하면 데이터 처리와 저장을 유연하게 관리할 수 있습니다.

 

DataBase 연계 예제

Scrapy를 사용하여 크롤링한 데이터를 데이터베이스에 저장하는 좀 더 실용적인 예제 코드를 제공하겠습니다. 이 예제에서는 Python의 SQLite 데이터베이스를 사용하여 크롤링 결과를 저장하는 파이프라인을 구현합니다. SQLite는 설정이 간단하고 경량이며 Scrapy 프로젝트에 쉽게 통합할 수 있습니다.

 

1. SQLite 데이터베이스 설정

먼저, SQLite 데이터베이스를 설정하고 테이블을 생성합니다. 이 예제에서는 간단한 products 테이블을 생성합니다.

import sqlite3

class SQLitePipeline(object):
    def open_spider(self, spider):
        self.connection = sqlite3.connect('mydatabase.db')
        self.c = self.connection.cursor()
        self.c.execute('''
            CREATE TABLE IF NOT EXISTS products(
                id INTEGER PRIMARY KEY,
                name TEXT,
                price TEXT,
                description TEXT
            )
        ''')
        self.connection.commit()

    def close_spider(self, spider):
        self.connection.close()

    def process_item(self, item, spider):
        self.c.execute('''
            INSERT INTO products (name, price, description) VALUES(?,?,?)
        ''', (item.get('name'), item.get('price'), item.get('description')))
        self.connection.commit()
        return item

 

2. Scrapy 아이템 설정

items.py 파일에서 필요한 필드를 포함하는 Product 클래스를 정의합니다.

import scrapy

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    description = scrapy.Field()

 

3. Scrapy 스파이더 예제

spiders 폴더 안에 스파이더를 구현합니다. 아래의 예제는 웹 페이지에서 제품의 이름, 가격, 설명을 추출합니다.

import scrapy
from myproject.items import Product

class MySpider(scrapy.Spider):
    name = 'my_spider'
    start_urls = ['http://example.com/products']

    def parse(self, response):
        for product in response.css('div.product'):
            item = Product()
            item['name'] = product.css('h2::text').get()
            item['price'] = product.css('.price::text').get()
            item['description'] = product.css('.description::text').get()
            yield item

 

4. 파이프라인 활성화

settings.py 파일에서 SQLitePipeline을 활성화하여 크롤링 데이터가 데이터베이스에 저장되도록 합니다.

ITEM_PIPELINES = {
    'myproject.pipelines.SQLitePipeline': 300,
}

이 설정을 통해, 스파이더가 크롤링을 완료하면 SQLitePipeline을 통해 데이터가 SQLite 데이터베이스에 저장됩니다. 이런 방식으로 Scrapy 프로젝트를 설정하면 웹 크롤링 데이터를 효율적으로 관리하고 활용할 수 있습니다.

 

파이프라인 개발을 위한 가이드

Scrapy 파이프라인을 개발하기 위한 개발자 가이드를 제공합니다. 이 가이드는 Scrapy 파이프라인의 구조, 설정, 개발 팁 등을 포함하여 효율적으로 파이프라인을 설계하고 구현할 수 있도록 도와줍니다.

 

1. Scrapy 프로젝트 구조 이해

Scrapy 프로젝트는 여러 구성 요소로 이루어져 있습니다. 파이프라인을 개발하기 전에 다음 구성 요소들에 대한 기본적인 이해가 필요합니다:

  • Spiders: 웹사이트에서 데이터를 수집하는 클래스입니다.
  • Items: 수집된 데이터를 구조화하는 모델입니다.
  • Item Pipelines: 데이터를 처리하고 저장하는 메커니즘입니다.
  • Settings: 프로젝트의 구성 및 설정을 담당합니다.

2. 파이프라인 개발 준비

파이프라인 개발을 시작하기 전에 다음 사항을 준비하세요:

  • 개발 환경 설정: Python과 Scrapy가 설치된 환경을 준비합니다.
  • 데이터베이스 및 외부 라이브러리: 필요한 데이터베이스 드라이버와 외부 라이브러리를 설치합니다.
  • 목표 설정: 파이프라인을 통해 달성하고자 하는 목표를 명확히 합니다 (예: 데이터 정제, 저장, 통계 등).

3. 파이프라인 클래스 개발

파이프라인 개발의 핵심은 process_item 메서드를 효과적으로 구현하는 것입니다. 아래는 기본적인 파이프라인 클래스 개발 순서입니다:

  1. 클래스 정의: pipelines.py 파일에 새로운 파이프라인 클래스를 정의합니다.
  2. 필수 메서드 구현:
    • open_spider(self, spider): 스파이더가 시작될 때 호출됩니다 (예: 데이터베이스 연결).
    • process_item(self, item, spider): 각 아이템을 처리합니다. 처리된 아이템은 다음 파이프라인으로 넘어가거나, 저장/폐기됩니다.
    • close_spider(self, spider): 스파이더가 종료될 때 호출됩니다 (예: 데이터베이스 연결 종료).
  3. 로직 추가: 데이터 유효성 검사, 변환, 저장 로직을 구현합니다.

4. 설정 파일 수정

settings.py에서 파이프라인을 활성화하고 실행 순서를 설정합니다.

ITEM_PIPELINES = {
    'myproject.pipelines.MyCustomPipeline': 300,
}

 

5. 테스트 및 디버깅

파이프라인을 테스트하고 디버깅하는 것은 중요한 개발 단계입니다. 특히, 다음을 확인해야 합니다:

  • 데이터 유효성: 입력된 데이터가 정의된 스키마와 일치하는지 확인합니다.
  • 오류 처리: 데이터 처리 중 발생할 수 있는 예외를 적절히 처리합니다.
  • 성능: 대량의 데이터를 처리할 때 성능 저하가 없는지 확인합니다.

6. 문서화 및 유지보수

코드에 적절한 주석을 추가하고, 파이프라인의 동작 방식을 문서화하여 팀 내 다른 개발자들이 이해할 수 있도록 합니다. 또한, 정기적인 코드 리뷰와 리팩토링을 통해 파이프라인의 유지보수성을 높입니다.

이러한 단계를 따라 Scrapy 파이프라인을 효과적으로 개발할 수 있습니다. 각 프로젝트의 구체적인 요구 사항에 맞춰 파이프라인을 맞춤화하고 최적화하는 것이 중요합니다.

728x90

'Web Crawling for Beginners' 카테고리의 다른 글

Scrapy, CrawlSpider  (0) 2024.07.05
Python Visualization 라이브러리  (0) 2024.05.24
Scrapy, logging  (0) 2024.05.16
Scrapy, A multi-page website into An Excel file  (0) 2024.05.16
Scrapy 프레임워크  (0) 2024.05.16
Comments