크롤링(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 |
아이폰에서 위치 조작(위치 스푸핑이, 가짜 GPS 위치 설정)은 보안 정책 때문에 안드로이드보다 훨씬 어렵습니다. 하지만…
스큐어모피즘(Skeuomorphism)은 디지털 사용자 인터페이스(UI) 디자인에서, 실제 물리적 객체의 모양, 질감, 동작 방식을 가상 공간에 그대로…
오늘은 AI 생태계에 혁신적인 변화를 가져올 것으로 예상되는 MCP(Model Context Protocol)에 대해 상세히 알아보겠습니다. 2024년…
1. TPM이란? TPM(Trusted Platform Module)은 국제 표준 기반의 보안 하드웨어 칩으로, 컴퓨터나 디지털 장비 내에서…