Scrapy는 웹 크롤링 및 스크래핑을 위한 파이썬 기반 프레임워크로, 웹 사이트에서 데이터를 추출하는 다양한 기능과 기능들을 제공합니다. 하지만 때로는 기본 제공되는 미들웨어만으로는 요구사항을 충족시키기 어려울 수 있습니다. 이럴 때는 Scrapy의 커스텀 미들웨어를 작성하여 원하는 기능을 추가할 수 있습니다.
미들웨어란?
Scrapy에서 미들웨어는 리퀘스트와 리스폰스를 처리하는 과정에서 중간에 실행되는 훅(hook)입니다. 이를 통해 리퀘스트 및 리스폰스를 수정하거나, 새로운 기능을 추가할 수 있습니다.
미들웨어는 다양한 종류의 훅을 사용할 수 있으며, 대표적인 훅들은 다음과 같습니다.
- ‘process_request’: 리퀘스트가 미들웨어로 전송되기 전에 실행됩니다.
- ‘process_response’: 리스폰스가 처리되고 스파이더로 전송되기 전에 실행됩니다.
- ‘process_exception’: 예외가 발생했을 때 실행됩니다.
커스텀 미들웨어 작성하기
커스텀 미들웨어를 작성하기 위해서는 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의 커스텀 미들웨어를 작성하면 기본 기능에 제한받지 않고 원하는 기능을 추가할 수 있습니다. 적절한 훅을 오버라이드하여 웹 크롤링 및 스크래핑 작업을 더욱 효율적으로 수행할 수 있습니다.