크롤링(crawling)과 스크래핑(scraping)은 웹 데이터를 수집할 때 자주 사용되는 기술이지만, 크롤링은 웹사이트 탐식 및 수집, 스크래핑은 특정 데이터만 추출하는 방식으로 목적과 작동 방식에 차이가 있습니다. 아래에 개념과 차이를 정리해 드리겠습니다.
정의:
크롤링은 웹사이트의 링크 구조를 따라가며 웹 페이지 전체를 자동으로 탐색하고 정보를 수집하는 과정입니다.
검색 엔진(예: 구글, 네이버)의 로봇(크롤러, 봇)이 웹사이트를 탐색할 때 사용하는 기술입니다.
목적:
웹 전체를 탐색하며 새롭거나 변경된 페이지를 찾기 위함
예시:
기술:
정의:
스크래핑은 특정 웹 페이지에서 원하는 데이터만 추출하는 작업입니다. HTML 문서 내의 특정 요소를 파싱하여 정보를 얻습니다.
목적:
웹 페이지의 구조를 분석하여 제목, 가격, 이미지, 기사 내용 등 원하는 정보만 골라서 추출
예시:
기술:
| 항목 | 크롤링 | 스크래핑 |
|---|---|---|
| 목적 | 웹사이트 탐색 및 수집 | 특정 데이터 추출 |
| 대상 | 다수의 웹 페이지 | 특정 웹 페이지 |
| 방식 | 링크 따라 이동 | HTML 요소 분석 |
| 사용 도구 | Scrapy, Selenium, crawler4j 등 | BeautifulSoup, Requests, Puppeteer 등 |
| 유사 예 | 구글봇, 사이트맵 탐색기 | 가격 비교, 뉴스 요약 수집기 |
많은 경우 크롤링 → 스크래핑 순서로 함께 사용됩니다.
이번엔 크롤링 하는 방법에 대해 알아보도록 하겠습니다.
requests 모듈 등)BeautifulSoup 등 사용)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']}") 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) | 항목 | 설명 |
|---|---|
| robots.txt 확인 | https://example.com/robots.txt 파일을 보고 크롤링 허용 여부 확인 |
| User-Agent 설정 | 브라우저처럼 보이도록 헤더 설정 (차단 방지) |
| 지나친 요청 주의 | time.sleep()을 활용하여 서버에 부하 주지 않도록 |
| IP 차단 방지 | 프록시 서버, 랜덤 User-Agent 사용 |
| 데이터 저장 | CSV, DB, JSON 등 원하는 형태로 저장 |
| 도구 | 설명 |
|---|---|
| Scrapy | 파이썬 기반 프레임워크, 대규모 크롤링에 적합 |
| Selenium | 자바스크립트 기반 사이트 크롤링 시 사용 (브라우저 자동제어) |
| Playwright | 최신 헤드리스 브라우저 제어 도구 (Selenium 대체) |
| Crawlee (Node.js) | 현대적인 웹 크롤링 프레임워크 (Playwright + Cheerio 등 통합) |
다음은 스크래핑하는 방법에 대해 알아보도록 하겠습니다.
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']}") 브라우저에서 F12를 누르면 개발자 도구가 열립니다.
원하는 정보에 마우스를 올려 태그 및 클래스명을 확인한 후 soup.select()나 soup.find()로 추출합니다.
| 방법 | 설명 |
|---|---|
soup.find('tag', class_='class') | 첫 번째 해당 태그 추출 |
soup.select('css 선택자') | 여러 개 요소 추출 가능 |
element.text | 텍스트만 추출 |
element['href'] | 링크 속성 추출 |
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']]) 일반 requests로 HTML을 가져올 수 없는 경우, Selenium이나 Playwright를 사용해야 합니다.
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() | 항목 | 설명 |
|---|---|
| robots.txt | 수집 가능 여부 확인 |
| User-Agent 설정 | 차단 방지용 |
| 속도 제한 | time.sleep() 등으로 서버 부하 방지 |
| IP 차단 주의 | 반복 요청 시 프록시 사용 고려 |
| 법적 이슈 확인 | 데이터 수집 정책 위반 여부 점검 필요 |
| 용도 | 도구 |
|---|---|
| 기본 스크래핑 | requests, BeautifulSoup |
| 자바스크립트 페이지 | Selenium, Playwright |
| 구조화된 수집 | Scrapy |
| 데이터 저장 | csv, sqlite3, pandas |
요양원 선택 전 반드시 확인해야 할 체크리스트를 공개합니다. 공식 평가 자료 조회법, 방문 시 확인…
공공기관 채용 비리의 실태와 피해 지원자의 대응법을 정리했습니다. 채용 비리 신고 방법, 공익신고자 보호제도, 취준생…
주식 손실을 세금 절약에 활용하는 합법적 방법을 공개합니다. 해외주식 손익통산, ISA 계좌 활용, 연금계좌 절세까지…
배달이 예상 시간보다 크게 늦으면 취소·환불을 요청할 수 있습니다. 배달앱별 지연 취소 방법과 잘못 배달됐을…
통신비 절약의 핵심은 요금제 최적화입니다. 내 데이터 사용량 확인법, 알뜰폰 전환 비교, 위약금 없이 요금제…