이 글에서는 Python에서 제공하는 Scrapy 프레임워크를 사용해 웹 스크래핑을 구현하는 방법을 단계별로 살펴봅니다.
웹 스크래핑이란?
웹 스크래핑(Web Scraping)은 크롤러(crawler) 또는 스파이더(spider)라고 불리는 자동화 프로그램을 이용해 웹사이트에서 데이터를 수집·추출하는 기술입니다. API를 제공하지 않는 웹 페이지에서 필요한 데이터를 가져와야 할 때 특히 유용합니다.
Python에서는 Beautiful Soup, Scrapy, lxml 등 다양한 모듈과 라이브러리로 웹 스크래핑을 구현할 수 있으며, 이번 글에서는 그중 Scrapy를 사용하는 방법을 집중적으로 다룹니다.
1. Scrapy 설치
먼저 터미널 또는 명령 프롬프트에서 다음 명령어로 Scrapy를 설치합니다.
>>> pip install scrapy
2. 프로젝트 생성
Scrapy는 단순한 라이브러리가 아니라 하나의 프레임워크이기 때문에, 프로젝트를 시작할 때 초기화 명령어를 실행해야 합니다.
>>> scrapy startproject tutpts
이 명령을 실행하면 프로젝트에 필요한 기본 디렉터리 구조와 설정 파일들이 자동으로 생성됩니다.
3. 웹 크롤러(스파이더) 작성
이제 웹사이트에서 데이터를 가져올 웹 크롤러(스파이더)를 만들어 보겠습니다. 별도의 스크립트 파일(예: tutptscraw.py)을 생성하고, 콘텐츠 추출을 담당할 클래스를 선언합니다. 클래스 안에는 크롤러의 이름을 지정하고, request를 통해 지정된 URL에서 데이터를 요청(fetch)합니다.
가져온 데이터는 제너레이터(generator) 함수를 통해 yield 방식으로 반환됩니다.
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# 제너레이터 함수
def start_requests(self):
# 크롤링할 URL 입력
urls = ['https://www.tutorialspoint.com/index.htm/']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)4. Scrapy 셸 활용하기
Scrapy는 자체 셸(shell)을 제공하므로, 코드를 실행하기 전에 선택자(selector)의 동작을 빠르게 테스트해 볼 수 있습니다. 다음 명령어로 스크래핑 셸을 실행합니다.
>>> scrapy shell https://www.tutorialspoint.com/index.htm
셸이 실행되면 CSS 선택자 또는 XPath를 사용해 앵커(<a>) 태그의 데이터를 손쉽게 추출할 수 있습니다.
response.css('a')
links = response.css('a').extract()5. parse 메서드로 전체 링크 추출
웹 페이지에 있는 모든 링크를 가져오려면 parse 메서드를 작성합니다. Scrapy는 내부적으로 이미 방문한 URL을 자동으로 건너뛰기 때문에, 결과를 렌더링할 때 처리 시간을 크게 줄여줍니다.
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# 제너레이터 함수
def start_requests(self):
# 크롤링할 URL 입력
urls = ['https://www.tutorialspoint.com/index.htm/']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# parse 함수
def parse(self, response):
title = response.css('title::text').extract_first()
# 앵커 태그의 href 속성 추출
links = response.css('a::attr(href)').extract()
for link in links:
yield {
'title': title,
'links': link
}
# tutorialspoint 도메인 링크만 재귀적으로 크롤링
if 'tutorialspoint' in link:
yield scrapy.Request(url=link, callback=self.parse)코드 핵심 포인트
- start_requests(): 크롤링을 시작할 최초 URL 목록을 정의하고 요청을 생성합니다.
- parse(): 응답(response)에서 페이지 제목과 링크를 추출해 yield로 반환합니다.
- 재귀 호출: 특정 도메인(tutorialspoint)의 링크만 골라 다시 parse를 호출함으로써 사이트 전체를 순회합니다.
마무리
이번 튜토리얼에서는 Python의 Scrapy 프레임워크를 사용해 웹 크롤러를 구현하는 방법을 배웠습니다. Scrapy 설치부터 프로젝트 생성, 스파이더 작성, 셸을 활용한 선택자 테스트까지 전 과정을 익혔다면, 이제 원하는 웹사이트에서 데이터를 자동으로 수집하는 강력한 크롤러를 직접 만들어 볼 수 있습니다.