크롤링(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 |
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…