웹 크롤링(Web Crawling)은 웹사이트에 존재하는 데이터를 자동으로 수집하는 기술을 말한다.
웹 크롤링은 기본적으로 웹페이지의 HTML 구조를 분석하고 필요한 데이터가 들어있는 태그를 찾아 원하는 값만 추출하는 방식으로 동작한다.
사람이 직접 웹페이지에 접속하여 뉴스, 상품 정보, 이미지 등을 확인하는 과정을 프로그램이 대신 수행한다고 생각하면 된다.
예를 들어 쇼핑몰 상품 정보를 모으거나, 뉴스 기사 제목을 수집하거나, 여러 페이지의 데이터를 분석해야 할 때 사용된다.

1. 크롤링 라이브러리 설치
Python에서 웹 크롤링을 하기 위해선 별도로 두가지 라이브러리를 설치해야한다.
1_1) Requests
Requests는 웹 서버에 요청을 보내 응답을 받아오기 위해 사용하는 라이브러리로
쉽게 말해 Python코드로 브라우저 접속을 하기 위한 역할이다.
# 터미널에 아래 코드 실행
python -m pip install requests
1_2) BeautifulSoup
BeautifulSoup은 Requests로 가져온 HTML문서를 분석하여 원하는 데이터를 쉽게 찾을 수 있도록 도와주는 라이브러리이다.
# 터미얼에 아래 코드 실행
python -m pip install beautifulsoup4
💡 실제 사용 방법
설치를 마치면 두 라이브러리를 사용하겠다고 코드를 입력하면 된다.
ipynb 파일의 경우 코드셀에 입력 후 실행하면 라이브러리 사용선언이 완료된다.
import requests
from bs4 import BeautifulSoup
2. 크롤링 예제 HTML 파일
본격적으로 크롤링을 진행하기 위한 HTML파일을 임의로 만들어 정리 할 예정이다.
아래 HTML 파일을 기준으로 데이터를 추출하였다.
3. HTML 데이터 가져오기
크롤링을 하기 위해선 가장 먼저 requests를 사용해서 HTML 데이터를 요청한다.
웹 서버에 요청을 보내 HTML 데이터를 가져와서 가져 온 HTML 문자열을 분석 가능한 구조로 변환하는것이다.
import requests
from bs4 import BeautifulSoup
url = "http://127.0.0.1:5501/index.html" # index.html 라이브서버 주소
# 웹 페이지 요청
response = requests.get(url)
# HTML 분석
soup = BeautifulSoup(response.text, "html.parser")
4. 태그 하나만 가져오기 (find)
find()는 조건에 맞는 첫 번째 태그 하나만 가져온다.
title = soup.find("h1")
# 출력
print(title.text)
# 결과▶
# IT 뉴스
※ .text는 태그를 제외하고 내부 글자만 가져올 때 사용한다.
5. 특정 영역 지정하여 내부 데이터 가져오기
실제 사이트에선 같은 태그가 여러개 존재한다. (<p>태그, <li>태그 등..)
그렇기 때문에 태그 하나만 가져오면 정확히 특정하기 어렵기 때문에
원하는 영역을 찾은 후 그 안에서 다시 데이터를 찾는 방식으로 사용한다.
news = soup.find(
"div",
{"class":"news"}
)
title = news.find("h2").text
content = news.find("p").text
# 출력
print(title)
print(content)
# 결과▶
# AI 기술 발전
# 인공지능 기술이 빠르게 발전하고 있습니다.
6. 속성의 값 가져오기
HTML 구조를 보면 대부분이 글자뿐만 아닌 속성도 가지고있다.
링크는 href, 이미지는 src와 같은 속성을 가지고 있는데
크롤링을 사용해서 해당 속성도 뽑아올 수 있다.
6_1) 링크 주소 가져오기
link = soup.find("a")
# 출력
print(link.text)
print(link["href"])
# 결과▶
# 기사 바로가기
# https://기사URL.com
6_2) 이미지 주소 가져오기
image = soup.find("img")
# 출력
print(image["src"])
# 결과▶
# 이미지.jpg
7. 데이터 여러개 가져오기 (find_all)
find_all()은 조건에 맞는 데이터를 찾아 해당 데이터의 모든 태그를 리스트 형태로 가져온다.
상품같은 여러개의 반복되는 데이터를 가져와야할 때 사용된다.
products = soup.find_all(
"div",
{"class":"product"}
)
# 출력
for product in products:
name = product.find("h2").text
price = product.find("p").text
print(name)
print(price)
# 결과▶
# 노트북
# 150만원
# 키보드
# 10만원
8. CSS 선택자로 가져오기 (Class, ID)
BeautifulSoup에선 CSS 선택자를 이용해서도 가져올 수 있다.
사실 태그로 가져오기엔 너무 복잡해질 수 있기 때문에 선택자를 이용하여 가져오는것이 더 효율적인 방식이다.
8_1) select_one()
()안에 클래스나 아이디를 넣어 사용가능하며
해당 선택자 조건에 맞는 첫 번쨰 요소를 선택하여 가져온다.
title = soup.select_one("#title")
# 출력
print(title.text)
# 결과▶
# IT 뉴스
8_2) select()
사용 방법은 select_one()과 같으며 해당 방식은 조건에 맞는 모든 요소를 선택하여 가져오는 방식이다.
products = soup.select(".product")
# 출력
for product in products:
print(product.select_one("h2").text)
# 결과▶
# 노트북
# 키보드
9. 테이블 데이터 가져오기
표로 작성된 HTML 데이터도 <table>태그를 기준으로 가져올 수 있다.
table = soup.find("table")
datas = table.find_all("td")
# 출력
for data in datas:
print(data.text)
# 결과▶
# 마우스
# 30000원
💡 find 와 select 의 차이
| 함수 | 설명 |
| find() | 조건에 맞는 첫 번째 태그 검색 |
| find_all() | 조건에 맞는 모든 태그 검색 |
| select_one() | CSS 선택자로 하나 검색 |
| select() | CSS 선택자로 여러 개 검색 |
10. 실제 사이트 크롤링 - headers
사실 실제 사이트를 크롤링하려고 프로그램에 요청을 보내려하면 차단하는 경우가 많다.
이때 headers 정보를 추가하여 브라우저 요청처럼 전달하여 크롤링을 진행할 수 있다.
headers = {
"User-Agent":"Mozilla/5.0"
}
response = requests.get(
url,
headers=headers
)
User-Agent는 사용자의 브라우저 정보를 나타내는 값으로 어떤 환경에서 요청을 보내는지 서버에게 알려주는 역할을 한다.
브라우저 정보를 설정하여 서버가 일반 브라우저 요청으로 판단하도록 도와줘 크롤링을 진행할 수 있다.
11. robots.txt
robots.txt는 사이트 운영자가 크롤러에게 접근 가능한 페이지와 제한 페이지를 알려주는 파일이다.
크롤링 프로그램은 데이터를 수집하기 전 해당 파일을 확인하여
어떤 경로의 데이터 수집이 허용되어 있는지 확인할 수 있다.
# 확인 방법
사이트주소/robots.txt
# robots.txt 파일 내부 형태
User-agent: *
Allow: /
Disallow: /admin/
- User-agent : 적용할 크롤러 대상
- Allow : 접근 허용 경로
- Disallow : 접근 제한 경로
위 예시는 모든 크롤러(*)에게 사이트 접근은 허용하지만 /admin/ 경로는 수집하지 말라는 의미이다.
robots.txt는 강제로 접근을 막는 보안 기능이 아닌 사이트 운영자가 정해둔 크롤링 규칙이다.
그래서 크롤링을 진행할 때 사이트 정책을 확인하고 서버에 부담을 주지 않는 선에서 작성하는것이 중요하다.
정리
- requests → 웹페이지 요청
- BeautifulSoup → HTML 분석
- find/select → 원하는 데이터 선택
- text/속성 → 데이터 추출
'데이터분석' 카테고리의 다른 글
| [데이터 분석] Pandas의 여러가지 기능 1(csv파일, 데이터프레임 구조, loc) (0) | 2026.06.05 |
|---|---|
| [데이터 분석] Pandas 기초 정리 (0) | 2026.06.02 |
| [데이터 분석] NumPy (0) | 2026.06.02 |