개요
기본적으로 scrapy crawler의 조작은 scrapy
명령어를 통해 이루어진다.
scrapy
는 해당 모듈을 global
이 아닌 virtualenv
등을 이용하여 프로젝트 단위로 관리하는 것을 권장한다.
Spider class?
Crawler
의 Rule
, 즉 규칙을 구체화 시킬 수 있도록 만든 클래스이다. 디자인 패턴에서는 Template Method Pattern
과 같이 scrapy.Spider
클래스 자체로는 특별한 일을 하지 않지만, 크롤러의 행동을 정의해 놓았기 때문에 이를 상속된 하위 클래스에서 구현해주는 패턴으로 생각하면 될 것 같다.
하위 클래스에서는 기본적으로 scrapy.Spider
클래스를 상속받도록 구현해야 한다. 흐름은 start_requests
함수에서 반환된 scrapy.Request
객체를 시작으로, 각 응답 scrapy.http.Response
을 callback
매개변수의 인자로서 넘겨주게 된다.
start_requests
는 일련의 scrapy.Request
객체들을 반환하는데, 이는 start_urls
라는 URL
을 모은 list
타입의 Property
로 대체할 수 있다. (이 때는, scarpy.Request
처럼 callback
지정이 없기 때문의 자동으로 self.parse
을 callback
으로 사용한다.)
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