Django에서 Scrapy 커스텀 익스텐션 사용하기

기본

Scrapy는 웹 크롤링을 쉽게 해주는 파인썬 라이브러리 입니다. 이 크롤러 라이브러리는 기본적으로 독립적인 프로젝트로 돌아가게끔 설계가 돼있지만 장고 모델을 사용해 크롤링 한 데이터를 저장할 수 있는 방법도 있고, 장고에서 스크래피를 실행시키는 방법도 문서에 잘 나와있습니다.

다음으로 에러났을 때 메일을 받고 싶어서 확장 포인트를 찾다가 custom extension을 작성하는 방법도 문서에서 찾았죠. 그런데 이걸 스크래피 기본 설정에서 어떻게 읽게 하는지에 대해선 관련 문서를 찾기가 어려웠습니다. (삽질의 시작..)

그래서 간단하게 정리해 보는 스크래피 커스텀 익스텐션 사용하기 3 스텝:
1. scrapy_setting.py 를 하나 작성합니다. 어떤 설정을 할 수 있는지에 대해 문서화가 잘 돼있습니다. 저는 덜렁 4줄..

BOT_NAME = 'zibit_spider'

SPIDER_MODULES = ['zibit.spiders']
EXTENSIONS = {
'zibit.spiders.extension.ReportError': 0,
}

2. 해당 설정 파일을 읽을 수 있도록 manage.py에 한 줄 추가.

os.environ['SCRAPY_SETTINGS_MODULE'] = 'zibit.scrapy_settings'

3. extension 작성. 작성 시 주의점은 스크래피가 기본적으로 APP_NAME/spiders/APP_NAME_spider.py 를 꼭 찾는다는 점입니다. 저처럼 삽질하지 마시고 왠만하면 저 패키지에 파일을 작성하세요. 어떤 시그널을 받을 수 있는지도 문서화가 잘돼있네요.

from scrapy import signals
import logging

logger = logging.getLogger(__name__)

class ReportError(object):

def __init__(self, crawler):
self.crawler = crawler
crawler.signals.connect(self.spider_opened, signal=signals.spider_opened)
crawler.signals.connect(self.report_error, signal=signals.spider_error)
crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)

@classmethod
def from_crawler(cls, crawler):
return cls(crawler)

def report_error(self, failure, response, spider):
logger.debug('spider error!!')
logger.error('error message: ' + failure.getErrorMessage())
logger.error('traceback: ' + failure.getTraceback())

def spider_opened(self, spider):
logger.debug('spider opened!!')

def spider_closed(self, spider):
logger.debug('spider closed!!')

signals.connect 부분만 설정해 주면 콜백이 들어오더라고요. 굿.

스크래피 익스텐션 테스트

Advertisements