클론코더

웹 크롤링이란? 크롤러가 웹페이지에서 데이터를 가져오는 원리

웹 크롤링이 무엇인지, 크롤링과 스크래핑은 어떻게 다른지, 크롤러가 페이지 요청부터 저장까지 어떤 순서로 일하는지 그림과 파이썬 예제로 설명합니다. 크롤링해도 되는 사이트인지 확인하는 robots.txt까지 다룹니다.

클론코더··5분

웹 크롤링(Web Crawling)은 프로그램이 웹페이지를 받아 와서 필요한 데이터를 골라 저장하는 일입니다. 이 일을 하는 프로그램을 크롤러(Crawler)라고 합니다.

크롤러는 사람이 브라우저로 하던 일, 즉 페이지를 열고 읽고 필요한 부분을 옮겨 적는 일을 코드로 처리합니다.

이 글에서는 크롤링과 스크래핑이 어떻게 다른지, 크롤러가 어떤 순서로 일하는지 그림으로 먼저 살펴보고, 파이썬 코드 몇 줄로 크롤러를 직접 만들어 봅니다. 마지막으로 크롤링해도 되는 사이트인지 확인하는 방법을 다룹니다.


웹 크롤링이란 무엇인가요?

매일 아침 쇼핑몰 몇 곳에 들어가 같은 상품의 가격을 확인해 엑셀에 적는다고 해 보겠습니다. 사람이 하면 사이트를 열고, 가격을 찾고, 복사해서 붙여 넣는 일을 매일 반복해야 합니다.

크롤러는 이 일을 대신합니다. 정해진 주소의 페이지를 받아 오고, 그 안에서 가격만 골라 파일에 쌓습니다. 다음과 같은 일에 주로 씁니다.

  • 쇼핑몰 가격이나 재고를 주기적으로 확인하기
  • 여러 블로그나 뉴스 사이트의 새 글 모으기
  • 채용 공고, 부동산 매물처럼 여러 페이지에 흩어진 정보를 표 하나로 모으기

구글이나 네이버 같은 검색엔진도 크롤러를 씁니다. 검색엔진의 크롤러는 페이지에 있는 링크를 따라 사이트를 계속 옮겨 다니며, 검색 결과에 보여 줄 페이지를 모읍니다. 하는 일의 기본 순서는 이 글에서 다루는 크롤러와 같고, 모으는 범위가 훨씬 넓습니다.


크롤링과 스크래핑은 무엇이 다른가요?

두 말은 자주 섞어 쓰지만, 원래 가리키는 일이 다릅니다.

크롤링 (Crawling)스크래핑 (Scraping)
하는 일링크를 따라 여러 페이지를 돌아다니며 모으기한 페이지에서 원하는 값을 꺼내기
결과페이지 목록, 페이지 내용표로 정리된 값 (상품명, 가격 등)
예검색엔진이 웹 전체를 돌아다니기상품 페이지에서 가격만 뽑기

실제로 "크롤링해 줘"라고 할 때는 대부분 스크래핑까지 포함한 뜻입니다. 여러 페이지를 돌면서(크롤링) 각 페이지에서 값을 꺼내는(스크래핑) 경우가 많기 때문입니다. 이 글에서도 두 일을 합쳐 크롤링이라고 부르겠습니다.


크롤러는 어떤 순서로 일하나요?

크롤러가 하는 일을 나누면 네 단계입니다.

  1. 페이지 요청: 사이트 주소로 페이지를 달라고 요청합니다.
  2. HTML 받기: 사이트의 서버가 보낸 HTML을 받습니다.
  3. 원하는 부분 고르기: HTML에서 상품명이나 가격처럼 필요한 부분만 골라냅니다.
  4. 저장: 고른 값을 파일이나 데이터베이스에 남깁니다.

앞의 두 단계는 크롤러와 사이트가 주고받는 일입니다. 크롤러가 주소로 요청을 보내면 요청은 인터넷을 거쳐 사이트의 서버에 도착하고, 서버는 그 페이지의 HTML을 담아 응답합니다. 브라우저가 페이지를 열 때와 같은 과정입니다.

1/4. 크롤러가 요청 문서를 들고 있다2/4. 요청 문서가 인터넷을 지나 쇼핑몰 서버로 간다3/4. 쇼핑몰 서버가 HTML 문서를 담아 크롤러 쪽으로 보낸다4/4. HTML 문서가 크롤러에 도착했다
그림 1. 크롤러의 요청과 서버의 응답 (네 장면)

뒤의 두 단계는 받은 HTML 안에서 일어납니다. 상품 목록에서 상품마다 상품명, 가격, 평점을 골라 표의 한 행으로 만들고, 그 행들을 파일에 쌓습니다. 화면의 39,000원을 파일에는 39000처럼 숫자만 남기는 정리도 이 단계에서 합니다.

왼쪽은 shop.example.com/products 화면의 상품 카드 세 개로, 무선 키보드 39,000원 평점 4.6, USB 허브 18,000원 평점 4.3, 노트북 거치대 27,000원 평점 4.8이다. 첫 카드의 상품명, 가격, 평점이 추출되어 오른쪽 표의 한 행이 된다. 아래 products.csv 파일에는 상품명, 가격, 평점 열 아래 행이 쌓인다.
그림 2. 상품 카드에서 값을 골라 표의 행으로 만들고, 파일에 쌓기

네 단계 사이에 어떤 데이터가 오가는지는 아래에서 다음을 눌러 한 단계씩 확인할 수 있습니다.

직접 해 보기크롤러가 단계를 지나는 과정
단계를 넘기면 크롤러가 노드를 하나씩 지납니다. 지금은 아무것도 하지 않은 상태입니다.
크롤러가 아는 것
url = "https://books.toscrape.com/"
0 / 4

파이썬으로 만드는 가장 짧은 크롤러

네 단계를 그대로 코드로 옮기면 다음과 같습니다. 크롤링 연습용으로 공개된 책방 사이트(books.toscrape.com)에서 책 제목을 가져옵니다.

bash
pip install requests beautifulsoup4
books.py
import requests
from bs4 import BeautifulSoup
 
html = requests.get("https://books.toscrape.com/").content  # 1·2. 페이지를 요청해 HTML을 받는다
soup = BeautifulSoup(html, "html.parser")                  # 받은 HTML을 읽는다
for a in soup.select("h3 a"):                              # 3. 원하는 부분을 고른다
    print(a["title"])                                      # 4. 저장 대신 화면에 출력한다
실행 결과
A Light in the Attic
Tipping the Velvet
Soumission
...

실행하면 첫 페이지에 있는 책 20권의 제목이 한 줄씩 나옵니다. 두 라이브러리는 이렇게 일을 나눠 맡습니다.

  • requests: 사이트에 요청을 보내 HTML을 받아 옵니다. (1·2단계)
  • BeautifulSoup: 받은 HTML을 읽어, 원하는 부분을 찾을 수 있는 형태로 바꿉니다. (3단계)

저장 단계까지 넣으려면 print 대신 csv 모듈로 파일에 한 줄씩 쓰면 됩니다.


크롤러는 원하는 부분을 어떻게 찾나요?

위 코드에서 원하는 부분을 고르는 줄은 soup.select("h3 a") 하나뿐입니다. 페이지에는 책 제목 말고도 메뉴, 가격, 버튼이 함께 들어 있는데, 크롤러는 어떻게 제목만 골라냈을까요? 두 가지가 필요합니다.

  1. DOM: 받은 HTML은 긴 문자열 하나라서 그대로는 위치를 찾기 어렵습니다. 그래서 BeautifulSoup은 HTML을 태그끼리 부모와 자식으로 이은 트리로 바꿉니다. 이 트리를 DOM이라고 합니다. → DOM이란? HTML과 DOM의 차이
  2. 선택자: DOM 트리에서 원하는 요소를 가리키는 문법입니다. "h3 a"는 "h3 안에 있는 a"라는 뜻이라서, h3 안에 들어 있는 책 제목 링크만 골라집니다. → CSS 선택자란? 크롤링에서 원하는 요소만 고르는 법

크롤러가 읽는 것은 우리가 보는 화면이 아니라, 그 화면을 만든 DOM입니다. 그래서 화면이 거의 같아 보여도 사이트가 HTML 구조를 바꾸면 같은 선택자로는 아무것도 찾지 못합니다. 잘 돌던 크롤러가 갑자기 빈 값을 돌려주는 가장 흔한 이유입니다.


크롤링해도 되는 사이트인지 어떻게 알 수 있나요?

기술적으로 가져올 수 있다고 해서 다 가져와도 되는 것은 아닙니다. 크롤러를 돌리기 전에 세 가지를 확인합니다.

1. robots.txt

사이트 주소 뒤에 /robots.txt를 붙여 열면, 그 사이트가 크롤러에게 허락하는 범위가 적혀 있습니다.

robots.txt 예시
User-agent: *
Disallow: /cart/
Disallow: /mypage/

모든 크롤러(*)에게 /cart/와 /mypage/ 아래 페이지는 가져가지 말아 달라는 뜻입니다. robots.txt는 사이트의 요청이지 기술적으로 막는 장치는 아니어서, 지키지 않아도 크롤러는 돌아갑니다. 그래도 크롤링하기 전에 확인하는 것이 기본입니다.

2. 이용약관

robots.txt에 막혀 있지 않더라도 이용약관에서 자동 수집을 금지하는 사이트가 있습니다. 특히 로그인해야 볼 수 있는 페이지나 개인정보가 담긴 페이지는 가져오지 않습니다.

3. 요청 간격

크롤러는 사람보다 훨씬 빠르게 요청을 보낼 수 있어서, 짧은 시간에 많은 요청을 보내면 사이트에 부담이 됩니다. 페이지를 여러 개 가져올 때는 time.sleep(1)처럼 요청 사이에 간격을 둡니다.


정리

  • 웹 크롤링은 프로그램이 웹페이지를 받아 와서 필요한 데이터를 골라 저장하는 일입니다. 엄밀히는 페이지를 돌아다니는 일이 크롤링, 값을 꺼내는 일이 스크래핑이지만 보통 합쳐서 부릅니다.
  • 크롤러는 페이지 요청 → HTML 받기 → 원하는 부분 고르기 → 저장 순서로 일합니다.
  • 원하는 부분은 HTML을 DOM 트리로 바꾼 뒤 선택자로 고릅니다. 사이트가 HTML 구조를 바꾸면 선택자도 고쳐야 합니다.
  • 크롤링 전에는 robots.txt와 이용약관을 확인하고, 요청 사이에 간격을 둡니다.

더 알아볼 것: