Scrapy
IT위키
더 많은 작업
Scrapy(스크래피)는 웹사이트를 돌아다니며 페이지를 내려받고 그 안에서 필요한 데이터를 뽑아 저장하는 일을 한 틀 안에서 처리하는 파이썬 기반의 오픈 소스 웹 크롤링·스크레이핑 프레임워크이다.
Scrapy 는 2008년 BSD 라이선스로 공개되었고, 지금은 Zyte(옛 이름 Scrapinghub)와 공동체가 함께 관리한다. 개발자는 어떤 주소에서 출발해 어떤 링크를 따라가고 페이지에서 무엇을 뽑을지만 스파이더(Spider) 클래스로 적고, 요청 예약·동시 내려받기·재시도·저장 같은 반복 작업은 프레임워크가 맡는다. 비동기 네트워크 라이브러리 Twisted 위에서 동작해 여러 요청을 동시에 처리하므로 대량 수집에 알맞다.
웹 크롤러를 직접 짜는 데 필요한 부품을 다 갖추고 있어 라이브러리가 아니라 프레임워크로 분류된다. 데이터 마이닝, 가격·뉴스 모니터링, 검색용 문서 수집, 자동화 테스트 등에 쓴다.
| 구성 요소 | 하는 일 |
|---|---|
| 엔진(Engine) | 전체 데이터 흐름을 조율하고 각 구성 요소 사이에 요청과 응답을 넘긴다 |
| 스케줄러(Scheduler) | 처리할 요청을 대기열에 넣고 순서를 정한다. 같은 주소를 두 번 방문하지 않도록 거른다 |
| 다운로더(Downloader) | 웹 페이지를 실제로 내려받아 응답을 돌려준다 |
| 스파이더(Spider) | 사용자가 작성하는 부분. 응답을 분석(parse)해 데이터 항목(Item)을 뽑고, 따라갈 링크로 새 요청을 만든다 |
| 아이템 파이프라인(Item Pipeline) | 뽑은 항목을 정제·검증·중복 제거한 뒤 파일이나 데이터베이스에 저장한다 |
| 미들웨어(Middleware) | 다운로더·스파이더 앞뒤에 끼워 요청 헤더, 프록시, 재시도, 쿠키 처리 등을 바꾼다 |
$ pip install scrapy $ scrapy startproject books # 프로젝트 틀 생성 $ cd books $ scrapy genspider list 도메인 # 스파이더 파일 생성 $ scrapy crawl list -O items.json # 크롤링 실행, 결과를 JSON 으로 저장
import scrapy
class ListSpider(scrapy.Spider):
name = "list"
start_urls = ["시작할 주소"]
def parse(self, response):
for book in response.css("article.product"): # CSS 선택자로 요소 선택
yield {
"title": book.css("h3 a::attr(title)").get(),
"price": book.css("p.price::text").get(),
}
next_page = response.css("li.next a::attr(href)").get()
if next_page: # 다음 쪽 링크를 따라간다
yield response.follow(next_page, self.parse)
- 요소는 CSS 선택자나 XPath로 고른다
- 새 프로젝트의 기본 설정은
ROBOTSTXT_OBEY = True로, 사이트의 robots.txt 규칙을 따른다. 요청 간격(DOWNLOAD_DELAY)과 동시 요청 수도 설정으로 조절한다 - 자바스크립트를 실행해야 데이터가 나타나는 페이지는 Scrapy 혼자 처리하지 못해 브라우저 자동화 도구와 함께 쓴다
| 이름 | 성격 |
|---|---|
| Scrapy | 크롤링(링크 따라가기)과 스크레이핑(데이터 추출), 저장까지 하는 파이썬 프레임워크 |
| Beautiful Soup | 이미 받아 온 HTML·XML 문서를 분석하는 파이썬 파서 라이브러리. 내려받기는 requests 같은 다른 라이브러리가 한다 |
| Selenium | 실제 웹 브라우저를 프로그램으로 조작하는 브라우저 자동화 도구. 원래 웹 테스트용이다 |
| 라이파이(Li-Fi) | 빛(가시광선)의 깜빡임으로 데이터를 보내는 무선 통신 기술. 크롤링과 관계없다 |
| SBAS | 위성항법(GPS 등)의 오차를 정지궤도 위성으로 보정해 주는 위성 기반 보강 시스템. 크롤링과 관계없다 |