인터넷에는 뉴스, 공공데이터, 상품 정보, 문서 등 다양한 형태의 데이터가 존재합니다. 이러한 웹페이지에서 필요한 정보를 프로그램으로 읽어 원하는 형태로 정리하는 작업을 일반적으로 웹 크롤링 또는 웹 스크래핑이라고 부릅니다.
파이썬에서는 여러 도구를 사용할 수 있지만 초보자가 HTML 구조와 데이터 추출 방법을 배우기 좋은 라이브러리 중 하나가 BeautifulSoup입니다.
이번 글에서는 Requests와 BeautifulSoup을 이용하여 웹페이지의 HTML을 가져오고 필요한 데이터를 찾는 기본적인 과정을 살펴보겠습니다.
BeautifulSoup이란?
BeautifulSoup은 HTML과 XML 문서를 분석하여 특정 태그나 속성을 쉽게 찾을 수 있도록 도와주는 파이썬 라이브러리입니다.
BeautifulSoup이 직접 인터넷에 접속해서 데이터를 받아오는 것은 아닙니다.
일반적으로 다음과 같이 역할을 나눕니다.
Requests↓웹서버에서 HTML 가져오기↓BeautifulSoup↓HTML 분석↓필요한 데이터 추출
이 구조를 이해하면 웹 크롤링의 기본 원리를 쉽게 파악할 수 있습니다.
필요한 라이브러리 설치하기
다음 명령어를 실행합니다.
pip install requests beautifulsoup4
설치한 뒤 파이썬에서는 다음과 같이 불러옵니다.
importrequestsfrombs4importBeautifulSoup
웹페이지 HTML 가져오기
Requests를 이용해 웹페이지의 응답을 가져올 수 있습니다.
importrequestsurl="https://example.com"response=requests.get(url)print(response.status_code)print(response.text)
status_code가 200이라면 일반적으로 서버가 요청을 정상적으로 처리했다는 뜻입니다.
하지만 서버의 응답 상태나 접근 정책에 따라 다른 코드가 반환될 수도 있습니다.
BeautifulSoup으로 HTML 분석하기
가져온 HTML을 BeautifulSoup에 전달합니다.
frombs4importBeautifulSoupimportrequestsurl="https://example.com"response=requests.get(url)soup=BeautifulSoup(response.text, "html.parser")print(soup.title)
HTML에 <title> 태그가 존재한다면 해당 내용을 확인할 수 있습니다.
텍스트만 가져오고 싶다면 다음처럼 작성할 수 있습니다.
print(soup.title.text)
find()와 find_all() 이해하기
BeautifulSoup에서 많이 사용하는 함수가 find()와 find_all()입니다.
find()는 조건에 맞는 첫 번째 요소를 찾습니다.
title=soup.find("h1")print(title.text)
여러 개를 찾으려면 다음과 같이 사용합니다.
items=soup.find_all("a")foriteminitems:print(item.text)
이를 이용하면 한 페이지에 포함된 여러 개의 제목이나 링크 등을 순차적으로 처리할 수 있습니다.
CSS 선택자로 데이터 찾기
BeautifulSoup은 CSS 선택자를 이용할 수도 있습니다.
HTML이 다음과 같은 구조라고 가정해보겠습니다.
<divclass="product"><h2class="title">상품 A</h2></div>
다음 코드로 요소를 찾을 수 있습니다.
title=soup.select_one(".product .title")print(title.text)
여러 개를 찾는 경우에는 select()를 이용합니다.
items=soup.select(".product")foriteminitems:print(item.text.strip())
웹페이지 구조가 복잡해질수록 CSS 선택자를 이해하는 것이 큰 도움이 됩니다.
링크 주소 추출하기
웹페이지의 <a> 태그에는 일반적으로 href 속성이 들어 있습니다.
<ahref="https://example.com/page">페이지 이동</a>
다음과 같이 링크 주소를 읽을 수 있습니다.
links=soup.find_all("a")forlinkinlinks:href=link.get("href")ifhref:print(href)
get()을 사용하면 해당 속성이 존재하지 않는 경우에도 비교적 안전하게 처리할 수 있습니다.
수집한 데이터를 CSV 파일로 저장하기
가져온 데이터는 화면에 출력하는 것보다 파일이나 데이터베이스에 저장하는 경우가 많습니다.
파이썬의 기본 csv 모듈을 활용할 수 있습니다.
importcsvdata= [ ["제목1", "https://example.com/1"], ["제목2", "https://example.com/2"]]withopen("data.csv", "w", newline="", encoding="utf-8-sig") asfile:writer=csv.writer(file)writer.writerow(["제목", "URL"])writer.writerows(data)
엑셀에서 활용할 목적이라면 CSV 형태로 데이터를 정리하는 방식이 간단합니다.
데이터 양이 많아지면 SQLite나 MySQL과 같은 데이터베이스를 이용하는 것도 좋습니다.
요청 실패에 대비한 예외 처리
인터넷 요청은 항상 성공한다고 보장할 수 없습니다.
네트워크 연결이 끊길 수도 있고 서버가 일시적으로 응답하지 않을 수도 있습니다.
따라서 다음과 같이 예외 처리를 추가할 수 있습니다.
importrequeststry:response=requests.get("https://example.com",timeout=10 )response.raise_for_status()exceptrequests.RequestException ase:print("요청 오류:", e)
timeout을 설정하는 습관도 중요합니다.
응답하지 않는 서버를 무한정 기다리지 않도록 하기 때문입니다.
Selenium과 BeautifulSoup의 차이
두 도구는 비슷해 보이지만 목적이 다릅니다.
BeautifulSoup은 받아온 HTML을 분석하는 데 특화되어 있습니다.
반면 Selenium은 실제 웹 브라우저를 실행하고 JavaScript를 처리하거나 버튼을 클릭하는 등의 동작을 수행할 수 있습니다.
일반적인 정적 HTML 페이지는 Requests와 BeautifulSoup 조합이 빠르고 가볍습니다.
JavaScript 실행 이후 데이터가 표시되는 사이트는 Selenium이나 해당 서비스가 제공하는 API 등을 검토해야 합니다.
크롤링할 때 반드시 확인할 부분
웹 크롤링 기술을 배울 때 가장 중요한 것 중 하나는 대상 웹사이트의 정책을 존중하는 것입니다.
사이트에서 제공하는 이용약관과 접근 정책을 확인하고 과도한 요청을 보내지 않는 것이 기본입니다.
공식 API가 제공된다면 가능하면 API를 우선 사용하는 것이 좋습니다.
또한 로그인이나 개인정보 등이 포함된 데이터를 임의로 수집해서는 안 됩니다.
기술적으로 가능하다는 것과 사용이 허용된다는 것은 서로 다른 문제입니다.
서버 자동화로 확장하기
BeautifulSoup으로 작성한 스크립트는 단순히 PC에서 한 번 실행하는 데서 끝나지 않습니다.
예를 들어 다음 구조를 만들 수 있습니다.
Crontab↓Python 실행↓Requests↓BeautifulSoup 분석↓SQLite 저장↓Telegram 결과 알림
이러한 구성은 파이썬 자동화 서버를 학습하기에 좋은 미니 프로젝트입니다.
자주 묻는 질문
BeautifulSoup만 설치하면 크롤링할 수 있나요?
HTML 분석은 가능하지만 웹에서 HTML을 가져오기 위해 Requests 같은 라이브러리를 함께 사용하는 경우가 많습니다.
JavaScript 사이트도 가능한가요?
브라우저에서 JavaScript가 실행된 뒤 데이터가 생성되는 경우 Requests로 받은 HTML에는 원하는 데이터가 없을 수 있습니다. 이런 경우 서비스의 공식 API나 브라우저 자동화 도구 등을 검토할 수 있습니다.
데이터를 계속 수집해서 저장할 수 있나요?
가능합니다. SQLite, MySQL 또는 CSV 파일 등에 저장하도록 프로그램을 구성할 수 있습니다.
마무리
BeautifulSoup은 파이썬 웹 데이터 처리의 기본 원리를 배우기 좋은 라이브러리입니다.
처음에는 웹페이지 제목 하나를 가져오는 것부터 시작하고, 이후 여러 항목을 반복 처리하고 데이터베이스에 저장하는 방식으로 확장하면 이해하기 쉽습니다.
중요한 것은 데이터를 많이 가져오는 기술 자체보다 HTML 구조, 예외 처리, 저장 방식, 서비스 정책을 함께 이해하는 것입니다.