[파이썬] Scrapy 에러 처리 및 디버깅

Scrapy는 파이썬으로 작성된 웹 크롤링 프레임워크로, 웹사이트에서 데이터를 추출하고 처리하는 데 매우 유용합니다. 그러나 가끔씩 Scrapy를 사용하면서 에러가 발생할 수 있으며, 이러한 에러에 대한 적절한 처리와 디버깅은 크롤링 작업을 성공적으로 완료하는 데 중요합니다.

1. 예외 처리

Scrapy에서 발생하는 주요 예외 중 일부는 다음과 같습니다.

이러한 예외를 처리하기 위해 Scrapy는 예외 처리 메커니즘을 제공합니다. 예를 들어, HTTP 연결 오류가 발생할 경우 Request 객체에 errback 매개변수를 사용하여 오류 처리 함수를 지정할 수 있습니다. 이 함수는 failure 객체를 매개변수로 받으며, 오류 메시지를 출력하거나 다시 요청하는 등의 작업을 수행할 수 있습니다.

def parse(self, response):
    # 처리 로직
    
def handle_error(self, failure):
    self.logger.error(failure.getErrorMessage())
    
def start_requests(self):
    yield Request(url='http://example.com', callback=self.parse, errback=self.handle_error)

2. 디버깅 및 로깅

Scrapy는 강력한 로깅 시스템을 제공하여 디버깅 과정을 쉽게 할 수 있습니다. logger 객체를 사용하여 로그 메시지를 출력하고, 파싱 중에 특정 변수 값을 확인하면서 작업을 진행할 수 있습니다.

import logging

class MySpider(scrapy.Spider):
    # 스파이더 설정 정보
    
    def parse(self, response):
        self.logger.debug('Received response: %s', response.status)
        
        # 변수 값 확인 및 디버깅 작업

또한, Scrapy 셸을 사용하여 크롤링 작업을 보다 상세하게 확인할 수도 있습니다. 스파이더 실행 후 scrapy shell을 입력하면 셸이 열리고, fetch() 함수를 사용하여 원하는 URL을 요청할 수 있습니다. 이를 통해 응답을 확인하고 XPath나 CSS 선택자를 테스트하여 데이터 추출 작업을 디버깅할 수 있습니다.

$ scrapy shell "http://example.com"
>>> response
<200 https://example.com>
>>> response.xpath('//title/text()').get()
'Example Domain'

3. 중단점 디버깅

Scrapy에는 중단점 디버깅을 위한 내장된 도구가 없지만, pdb를 사용하여 중단점을 설정할 수 있습니다. 이를 통해 실행 중인 코드에서 중단점으로 이동하고 변수 값을 확인하며 디버깅할 수 있습니다.

import pdb

class MySpider(scrapy.Spider):
    # 스파이더 설정 정보
    
    def parse(self, response):
        # 처리 로직
        pdb.set_trace()  # 중단점 설정
        
        # 다음 작업 수행

위의 예제에서 pdb.set_trace() 코드가 실행되면 실행이 중지되고, pdb 모듈의 디버깅 콘솔로 이동합니다. 여기서 변수의 값을 확인하거나 다음 단계로 진행하며 디버깅 작업을 수행할 수 있습니다.

Scrapy를 사용하다가 에러가 발생하거나 원하는 데이터를 추출하지 못하는 경우, 적절한 예외 처리와 디버깅 기술을 사용하여 문제를 해결할 수 있습니다. 이를 통해 크롤링 작업의 효율성을 향상시키고 원하는 결과를 얻을 수 있습니다.