크롤링(crawling)과 스크래핑(scraping)은 웹 데이터를 수집할 때 자주 사용되는 기술이지만, 크롤링은 웹사이트 탐식 및 수집, 스크래핑은 특정 데이터만 추출하는 방식으로 목적과 작동 방식에 차이가 있습니다. 아래에 개념과 차이를 정리해 드리겠습니다.
1. 크롤링(Crawling)
정의:
크롤링은 웹사이트의 링크 구조를 따라가며 웹 페이지 전체를 자동으로 탐색하고 정보를 수집하는 과정입니다.
검색 엔진(예: 구글, 네이버)의 로봇(크롤러, 봇)이 웹사이트를 탐색할 때 사용하는 기술입니다.
목적:
웹 전체를 탐색하며 새롭거나 변경된 페이지를 찾기 위함
예시:
- 구글봇이 인터넷상의 수많은 웹 페이지를 돌아다니며 검색 색인을 만들 때 사용
- 특정 도메인에서 링크를 따라 페이지 목록을 수집
기술:
- URL Queue 관리
- HTML 다운로드
- robots.txt 확인
- 사이트맵 기반 탐색
2. 스크래핑(Scraping)
정의:
스크래핑은 특정 웹 페이지에서 원하는 데이터만 추출하는 작업입니다. HTML 문서 내의 특정 요소를 파싱하여 정보를 얻습니다.
목적:
웹 페이지의 구조를 분석하여 제목, 가격, 이미지, 기사 내용 등 원하는 정보만 골라서 추출
예시:
- 쇼핑몰에서 상품명과 가격만 수집
- 뉴스 사이트에서 기사 제목과 요약문 추출
기술:
- HTML 파싱 (BeautifulSoup, lxml 등)
- 정규 표현식
- API 요청 활용
3. 크롤링과 스크래핑의 차이
항목 | 크롤링 | 스크래핑 |
---|---|---|
목적 | 웹사이트 탐색 및 수집 | 특정 데이터 추출 |
대상 | 다수의 웹 페이지 | 특정 웹 페이지 |
방식 | 링크 따라 이동 | HTML 요소 분석 |
사용 도구 | Scrapy, Selenium, crawler4j 등 | BeautifulSoup, Requests, Puppeteer 등 |
유사 예 | 구글봇, 사이트맵 탐색기 | 가격 비교, 뉴스 요약 수집기 |
4. 관계 요약
- 크롤링은 ‘어디에 무엇이 있는지 찾는 과정’
- 스크래핑은 ‘찾은 페이지에서 필요한 정보를 뽑아내는 과정’
많은 경우 크롤링 → 스크래핑 순서로 함께 사용됩니다.
이번엔 크롤링 하는 방법에 대해 알아보도록 하겠습니다.
1. 크롤링 기본 흐름
- 수집 대상 URL 정의
- robots.txt 확인 (접근 허용 여부)
- HTTP 요청 보내기 (
requests
모듈 등) - 응답 HTML 파싱하기 (
BeautifulSoup
등 사용) - 링크 추출 및 다음 URL로 반복
- 중복 URL 방지 및 저장
2. 기본 크롤링 예제 (Python)
import requests
from bs4 import BeautifulSoup
# 1. 크롤링 대상 URL
url = "https://news.ycombinator.com/"
# 2. HTTP 요청
response = requests.get(url)
response.raise_for_status() # 실패 시 예외 발생
# 3. HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')
# 4. 원하는 데이터 추출 (예: 기사 제목)
titles = soup.select('.titleline > a') # CSS 선택자 활용
# 5. 출력
for i, title in enumerate(titles, 1):
print(f"{i}. {title.text} - {title['href']}")
3. 링크 따라가며 크롤링하기 (재귀적 방식)
from urllib.parse import urljoin
def crawl_site(start_url, depth=1):
if depth == 0:
return
res = requests.get(start_url)
soup = BeautifulSoup(res.text, 'html.parser')
print(f"\n>>> 현재 페이지: {start_url}")
for link in soup.find_all('a', href=True):
next_url = urljoin(start_url, link['href'])
print(f" - 링크: {next_url}")
# 중복 방지, 도메인 제한 등 로직 필요
# 예제에서는 depth를 1 줄이고 재귀 호출
crawl_site(next_url, depth - 1)
4. 크롤링 시 유의사항
항목 | 설명 |
---|---|
robots.txt 확인 | https://example.com/robots.txt 파일을 보고 크롤링 허용 여부 확인 |
User-Agent 설정 | 브라우저처럼 보이도록 헤더 설정 (차단 방지) |
지나친 요청 주의 | time.sleep() 을 활용하여 서버에 부하 주지 않도록 |
IP 차단 방지 | 프록시 서버, 랜덤 User-Agent 사용 |
데이터 저장 | CSV, DB, JSON 등 원하는 형태로 저장 |
5. 고급 도구
도구 | 설명 |
---|---|
Scrapy | 파이썬 기반 프레임워크, 대규모 크롤링에 적합 |
Selenium | 자바스크립트 기반 사이트 크롤링 시 사용 (브라우저 자동제어) |
Playwright | 최신 헤드리스 브라우저 제어 도구 (Selenium 대체) |
Crawlee (Node.js) | 현대적인 웹 크롤링 프레임워크 (Playwright + Cheerio 등 통합) |
다음은 스크래핑하는 방법에 대해 알아보도록 하겠습니다.
1. 스크래핑 기본 절차
- 대상 웹 페이지 선정
- HTML 구조 분석 (개발자 도구 활용)
- HTTP 요청으로 페이지 가져오기
- HTML 파싱 및 원하는 요소 추출
- 데이터 정제 및 저장
2. Python 기반 스크래핑 예제
💡 라이브러리 설치
pip install requests beautifulsoup4
🔍 간단한 스크래핑 코드 (예: 뉴스 제목)
import requests
from bs4 import BeautifulSoup
# 1. 요청 보낼 URL
url = "https://news.ycombinator.com/"
# 2. HTTP GET 요청
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
response.raise_for_status()
# 3. HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')
# 4. 원하는 요소 추출 (CSS Selector 기반)
titles = soup.select('.titleline > a')
# 5. 출력
for i, title in enumerate(titles, 1):
print(f"{i}. {title.text} - {title['href']}")
3. HTML 구조 분석 방법
브라우저에서 F12를 누르면 개발자 도구가 열립니다.
원하는 정보에 마우스를 올려 태그 및 클래스명을 확인한 후 soup.select()
나 soup.find()
로 추출합니다.
방법 | 설명 |
---|---|
soup.find('tag', class_='class') | 첫 번째 해당 태그 추출 |
soup.select('css 선택자') | 여러 개 요소 추출 가능 |
element.text | 텍스트만 추출 |
element['href'] | 링크 속성 추출 |
4. 스크래핑한 데이터 저장하기
📁 CSV로 저장
import csv
with open('titles.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['번호', '제목', '링크'])
for i, title in enumerate(titles, 1):
writer.writerow([i, title.text, title['href']])
5. 동적 웹사이트 스크래핑 (자바스크립트 기반 사이트)
일반 requests
로 HTML을 가져올 수 없는 경우, Selenium이나 Playwright를 사용해야 합니다.
Selenium 간단 예시
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome()
driver.get('https://example.com')
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 스크래핑 작업
driver.quit()
6. 스크래핑 시 유의사항
항목 | 설명 |
---|---|
robots.txt | 수집 가능 여부 확인 |
User-Agent 설정 | 차단 방지용 |
속도 제한 | time.sleep() 등으로 서버 부하 방지 |
IP 차단 주의 | 반복 요청 시 프록시 사용 고려 |
법적 이슈 확인 | 데이터 수집 정책 위반 여부 점검 필요 |
7. 추천 툴 및 라이브러리
용도 | 도구 |
---|---|
기본 스크래핑 | requests , BeautifulSoup |
자바스크립트 페이지 | Selenium , Playwright |
구조화된 수집 | Scrapy |
데이터 저장 | csv , sqlite3 , pandas |