크롤링(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 |
1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…