[파이썬] Scrapy 커스텀 미들웨어 작성

Scrapy는 웹 크롤링 및 스크래핑을 위한 파이썬 기반 프레임워크로, 웹 사이트에서 데이터를 추출하는 다양한 기능과 기능들을 제공합니다. 하지만 때로는 기본 제공되는 미들웨어만으로는 요구사항을 충족시키기 어려울 수 있습니다. 이럴 때는 Scrapy의 커스텀 미들웨어를 작성하여 원하는 기능을 추가할 수 있습니다.

미들웨어란?

Scrapy에서 미들웨어는 리퀘스트와 리스폰스를 처리하는 과정에서 중간에 실행되는 훅(hook)입니다. 이를 통해 리퀘스트 및 리스폰스를 수정하거나, 새로운 기능을 추가할 수 있습니다.

미들웨어는 다양한 종류의 훅을 사용할 수 있으며, 대표적인 훅들은 다음과 같습니다.

커스텀 미들웨어 작성하기

커스텀 미들웨어를 작성하기 위해서는 Scrapy의 SpiderMiddleware 클래스를 상속받아야 합니다. 그리고 필요한 훅을 오버라이드하여 원하는 동작을 수행할 수 있습니다.

아래는 커스텀 미들웨어를 작성하는 예시입니다.

import random

class MyCustomMiddleware:
    def process_request(self, request, spider):
        # 요청의 헤더에 User-Agent 추가하기
        user_agent = random.choice(USER_AGENT_LIST)
        request.headers['User-Agent'] = user_agent

    def process_response(self, request, response, spider):
        # 특정 조건에 따라 리스폰스 수정하기
        if 'blocked' in response.body:
            # 리스폰스가 'blocked'라는 단어를 포함하고 있을 경우 처리 로직
            # ...

        return response

    def process_exception(self, request, exception, spider):
        # 예외 처리 로직 추가하기
        # ...

위의 예시에서는 process_request 훅을 이용하여 요청의 헤더에 랜덤한 User-Agent를 추가하고, process_response 훅을 이용하여 특정 조건에 따라 리스폰스를 수정하였습니다. 또한, process_exception 훅을 이용하여 예외 처리 로직을 추가할 수 있습니다.

커스텀 미들웨어를 사용하기 위해서는 Scrapy의 설정 파일(settings.py)에 미들웨어 클래스를 추가해야 합니다.

# settings.py

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.MyCustomMiddleware': 543,
}

위의 예시에서 myproject.middlewares.MyCustomMiddleware는 작성한 커스텀 미들웨어의 클래스 경로입니다. 숫자인 543은 우선순위를 나타내며 숫자가 작을수록 우선순위가 높습니다.

결론

Scrapy의 커스텀 미들웨어를 작성하면 기본 기능에 제한받지 않고 원하는 기능을 추가할 수 있습니다. 적절한 훅을 오버라이드하여 웹 크롤링 및 스크래핑 작업을 더욱 효율적으로 수행할 수 있습니다.