크롤링(Crawling)은 웹사이트의 HTML 문서나 API 데이터를 자동으로 수집하여 원하는 정보를 추출하는 기술이다.
사람이 직접 웹페이지를 열어 뉴스, 상품 정보, 댓글, 주가, 날씨 등을 확인하는 과정을 프로그램이 대신 수행한다고 생각하면 된다.
Requests
Requests는 Python에서 웹 서버에 HTTP 요청을 보내고 응답을 받아오기 위해 사용하는 대표적인 라이브러리이다.
웹 브라우저가 사이트에 접속할 때처럼 Python 코드에서도 웹페이지, 이미지, JSON 데이터 등을 서버로부터 가져올 수 있게 해주며, 웹 크롤링과 API 연동에서 가장 많이 사용되는 기본 도구 중 하나이다.
requests.get()으로 웹페이지를 요청하거나, requests.post()로 데이터를 서버에 전송할 수 있으며, 응답 결과로 HTML 코드, 이미지 데이터, 상태 코드 등을 쉽게 다룰 수 있다.
BeautifulSoup
BeautifulSoup의 from bs4 impor BeautifulSoup 코드는 Python에서 HTML이나 XML 문서를 쉽게 분석하고 원하는 데이터를 추출하기 위해 BeautifulSoup 클래스를 불러오는 코드이다.
여기서 bs4는 BeautifulSoup4 라이브러리를 의미하며, 웹 크롤링에서 가장 많이 사용하는 라이브러리 중 하나이다.
import requests
from bs4 import BeautifulSoup
# 가상 서버 주소
url = "http://127.0.0.1:5500/1.html"
# 서버에 요청 보내기
response = requests.get(url)
# HTML 코드 가져오기
html = response.text
# HTML 분석
soup = BeautifulSoup(html, "html.parser")
# 데이터 추출
h1 = soup.find("h1").text
p = soup.find("p").text
# 출력
print("제목:", h1)
print("내용:", p)
데이터 추출 기능
메서드
찾는 개수
찾는 방식
반환 형식
데이터가 없을 때
find()
최초 1개
HTML 태그, 속성
Tag 객체 (.text 가능)
None
find_all()
일치하는 모두
HTML 태그, 속성
리스트 형식
빈 리스트 ([])
select_one()
최초 1개
CSS 선택자 (CSS Selector)
Tag 객체 (.text 가능)
None
select()
일치하는 모두
CSS 선택자 (CSS Selector)
리스트 형식
빈 리스트 ([])
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
# HTML 페이지 요청
url = "http://127.0.0.1:5500/4.html"
response = requests.get(url)
# HTML 파싱
soup = BeautifulSoup(response.text, "html.parser")
# img 태그 찾기
img_tag = soup.find("img")
# 이미지 주소 가져오기
img_src = img_tag["src"]
# 상대경로 → 절대경로 변환
img_url = urljoin(url, img_src)
print("이미지 주소:", img_url)
# images 폴더 생성
os.makedirs("images", exist_ok=True)
# 이미지 다운로드
img_response = requests.get(img_url)
# 파일 이름 추출
file_name = img_src.split("/")[-1]
# 저장 경로
save_path = os.path.join("images", file_name)
# 이미지 저장
with open(save_path, "wb") as file:
file.write(img_response.content)
print("이미지 저장 완료")
open()
open() 함수는 파일을 읽거나 저장할 때 사용하는 함수이다.
텍스트 파일(txt), CSV, 이미지 파일 등을 열어서 데이터를 읽거나 저장할 수 있으며, 크롤링, 데이터분석, AI 개발 등 거의 모든 분야에서 사용되는 매우 중요한 기능이다.
headers는 웹 브라우저가 서버에 보내는 추가 정보이며, 크롤링에서는 서버가 요청을 정상적인 브라우저 접속으로 인식하도록 도와주는 역할을 한다.
User-Agent는 "어떤 브라우저와 운영체제로 접속했는가"를 나타내는 정보로, 이를 설정하지 않으면 일부 사이트는 프로그램(봇) 접속으로 판단하여 데이터를 차단하거나 빈 페이지를 반환할 수 있다.
Referer는 "어떤 페이지에서 이동해 왔는가"를 나타내는 정보이며, 벅스 같은 사이트는 내부 페이지 이동처럼 보여야 정상 응답을 주는 경우가 있어 함께 설정하는 경우가 많다.
즉, headers는 크롤링 프로그램이 실제 사람이 사용하는 브라우저처럼 보이게 만들어 사이트 차단을 줄이고 안정적으로 데이터를 가져오기 위해 사용하는 설정이다.
robots.txt
robots.txt는 웹사이트 운영자가 검색 엔진이나 크롤링 프로그램(봇)에게 "어떤 페이지는 접근 가능하고, 어떤 페이지는 접근하지 말아야 하는지"를 알려주는 규칙 파일이다.
보통 사이트 주소 뒤에 /robots.txt를 붙여 확인할 수 있다.
이 파일에는 특정 경로를 수집 금지(Disallow) 하거나 허용(Allow) 하는 규칙이 작성되어 있으며, 검색 엔진이나 크롤러는 이를 참고하여 사이트에 과도한 부하를 주지 않고 운영 정책을 존중하며 데이터를 수집한다.
다만 robots.txt는 강제 차단 시스템이 아니라 "권장 규칙"에 가까우므로 기술적으로 접근은 가능할 수 있지만, 실무에서는 반드시 robots.txt와 사이트 이용약관을 확인하고 서버에 무리를 주지 않는 범위에서 크롤링하는 것이 중요하다.
셀레니움 (Selenium)
셀레니움이란?
셀레니움(Selenium)은 파이썬 코드로 실제 웹 브라우저(Chrome, Edge 등)를 자동으로 제어할 수 있게 해주는 웹 자동화 라이브러리이다.
일반적인 requests 크롤링은 서버에서 받은 HTML만 분석하지만, Selenium은 브라우저를 직접 실행하여 버튼 클릭, 검색 입력, 스크롤, 로그인, 페이지 이동 등의 사용자 동작을 그대로 수행할 수 있기 때문에 JavaScript로 동적으로 생성되는 데이터까지 가져올 수 있다.
따라서 멜론, 유튜브, 쇼핑몰처럼 JavaScript 렌더링이 많은 사이트의 크롤링이나 웹 자동화 테스트에서 매우 많이 사용된다.
보통 webdriver.Chrome()으로 브라우저를 실행하고, find_element()로 요소를 찾으며, click(), send_keys() 등을 통해 자동화 작업을 수행한다.
xpath
XPath는 XML 또는 HTML 문서 내에서 특정 요소나 속성을 선택하기 위해 사용되는 경로 표현 언어이다.
웹 크롤링이나 자동화 도구에서 주로 사용되며, 요소를 효율적으로 찾을 수 있도록 도와준다.
일반적인 XPath는 특정 위치나 속성을 기준으로 요소를 선택하는 상대적인 경로를 사용한다.또한 full xpath는 루트 요소에서 시작하여 대상 요소까지의 절대적인 경로를 나타낸다. 따라서 문서 구조가 변경되면 경로가 깨질 가능성이 높다.
find_elements()
Selenium에서 HTML 요소를 여러 개 찾을 때 사용하는 메서드이다.
하나의 요소만 찾는 find_element()와 달리, 조건에 맞는 요소들을 리스트 형태로 모두 반환한다.
여러 개의 이미지, 게시글, 테이블 행(tr) 등을 반복해서 크롤링할 때 자주 사용된다.
찾는 방식은 By.ID, By.CLASS_NAME, By.CSS_SELECTOR, By.XPATH 등 다양한 선택자를 사용할 수 있으며, 반환 결과는 리스트이므로 for문으로 반복 처리하는 경우가 많다.
find_element()는 요소를 찾지 못하면 에러가 발생하지만, find_elements()는 빈 리스트([])를 반환하기 때문에 반복 크롤링에서 더 안정적으로 사용된다.