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

반응형 웹 개발할 때 레이아웃 px과 이미지 크기

기본

사이트를 반응형으로 개편하면서 한가지 궁금한 점이 생겼습니다. 맥의 레티나 디스플레이나 요새 모바일은 물리적인 화면은 작아도 해상도는 2배-3배인 경우가 있기 때문에 미디어 쿼리의 max-width < 760px 같은 수식이 정말 모바일을 구별 할 수 있을까? 하는 점이죠.

원리는 의의로 간단했습니다. 안드로이드의 dp 개념처럼 웹브라우저도 density 값을 가지고 해상도 / density를 한 값을 미디어 쿼리가 사용합니다. 그래서 해상도가 높아도 모바일과 데스크탑을 구분하는게 가능합니다.

http://uhb.kr/book/wiki/rwd/resolution/

위 사이트에서 브라우저가 계산하는 실제 해상도 크기를 볼 수 있죠.

정리해보면 density가 1인 모니터에서 작업을 할 때 디자인 가이드라인의 px 값은 그대로 사용하고(desity가 다른 환경에서도 동일한 크기로 보여질 테니 말이죠.) 이미지들은 2배-3배 크기가 따로 필요합니다. (아니면 density가 높은 환경에서 이미지를 늘여서 표시해야 하니까요.)