자택경비대

'크롤링'에 해당되는 글 1건

  1. Python scrapy 사용법

Python scrapy 사용법

Programming

개요

기본적으로 scrapy crawler의 조작은 scrapy 명령어를 통해 이루어진다.

scrapy는 해당 모듈을 global이 아닌 virtualenv등을 이용하여 프로젝트 단위로 관리하는 것을 권장한다.

Spider class?

CrawlerRule, 즉 규칙을 구체화 시킬 수 있도록 만든 클래스이다. 디자인 패턴에서는 Template Method Pattern과 같이 scrapy.Spider 클래스 자체로는 특별한 일을 하지 않지만, 크롤러의 행동을 정의해 놓았기 때문에 이를 상속된 하위 클래스에서 구현해주는 패턴으로 생각하면 될 것 같다.

하위 클래스에서는 기본적으로 scrapy.Spider 클래스를 상속받도록 구현해야 한다. 흐름은 start_requests 함수에서 반환된 scrapy.Request객체를 시작으로, 각 응답 scrapy.http.Responsecallback 매개변수의 인자로서 넘겨주게 된다.
start_requests는 일련의 scrapy.Request객체들을 반환하는데, 이는 start_urls라는 URL을 모은 list타입의 Property로 대체할 수 있다. (이 때는, scarpy.Request처럼 callback 지정이 없기 때문의 자동으로 self.parsecallback으로 사용한다.)
callback 매개변수는 보통 parse 함수를 지정하게 되는데, 여기서 받아온 응답에 대한 처리를 진행하게 된다.
callback에서 인자로 받은 응답 값을 처리하여 직접 파일로 저장하게 하거나, 반환하여 scrapy에서 처리하도록 할 수 있다.
parse에서 반환된 객체들은 결과물로서 scrapy 옵션에 따라 파일에 저장되거나 stdout 으로 출력되게 할 수 있다.
parse 함수 또한 scrapy.Request객체를 돌려주도록 할 수 있는데, 이 경우 다시 start_requests로 흐름이 넘어가 응답을 받아오게 된다.
따라서 파싱 된 결과물에서 다음페이지로 이동 등의 링크를 추출하여 다시 start_requests로 넘겨주는 것이 가능하게 된다. 이 때는 보통 response.follow라는 축약 명령을 사용해서 가독성을 높이고, 불필요한 타이핑도 줄일 수 있다.

scrapy command

scrapy 프로젝트 생성하기
scrapy startproject [project_name]

구현한 spider를 실행
scrapy crawl [spider_name]

특정 URL의 spider구현을 위한 interactive 모드
scrapy shell [URL]

scrapy.Spider를 상속하는 템플릿 코드 생성
scrapy genspider [spider_name] [URL]

spider의 목록을 출력
scrapy list