BeautifulSoup 웹 크롤링의 한계
requests
와 BeautifulSoup
라이브러리는 변하지 않는 웹사이트, 즉 정적인 데이터를 크롤링하는 데에 사용됩니다.
하지만 최신 웹사이트들은 사용자와의 상호작용에 따라 데이터를 동적으로 처리합니다. 사용자는 서버에 추가적인 데이터를 요청하고, 서버로부터 받은 응답값을 웹 브라우저의 JavaScript가 처리하여 화면에 이를 표시합니다.
requests
라이브러리는 정적 HTML만을 가져올 수 있고, BeautifulSoup
은 가져온 HTML을 파싱하는 데에 사용됩니다.
JavaScript가 생성하거나 변경하는 데이터는 requests
로 가져올 수 있는 HTML에 포함되어 있지 않기 때문에, 기존 방식으로는 JavaScript로 처리한 데이터를 크롤링할 수 없습니다.
동적 데이터를 크롤링하는 방법?
하지만 Selenium
를 사용하면 실제로 웹 브라우저를 실행시키고, JavaScript가 실행된 후의 DOM을 크롤링할 수 있습니다.
기상청 홈페이지는 JavaScript를 활용해 동적으로 날씨 정보를 표시하기 때문에 BeautifulSoup으로는 데이터를 제대로 가져올 수 없 습니다.
하지만 Selenium을 사용하면 실제 브라우저에서 JavaScript가 실행된 후의 화면을 가져와, 이러한 문제를 해결할 수 있습니다.
참고 : 실습 코드를 컴퓨터에서 실제로 실행하려면,
pip install selenium
명령어로 Selenium 라이브러리를 설치해야 합니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
# Chrome 브라우저 열기
driver = webdriver.Chrome()
# 기상청 동네 예보 페이지 열기
url = "https://www.weather.go.kr/w/index.do"
driver.get(url)
# 기온과 체감온도 찾기
# 'tmp' 클래스는 현재 기온을 나타내고, 'chill' 클래스는 체감온도를 나타냄
temperature_element = driver.find_element(By.CLASS_NAME, 'tmp')
feels_like_element = driver.find_element(By.CLASS_NAME, 'chill')
# 텍스트 추출
temperature = temperature_element.text
feels_like = feels_like_element.text
# 결과 출력
print(f"오늘의 기온: {temperature}")
print(f"체감온도: {feels_like}")
# WebDriver 종료
driver.quit()
코드 상세 설명
-
driver = webdriver.Chrome()
: Chrome 브라우저를 열고,driver
객체 생성 -
driver.get(url)
: 지정한 URL(기상청 홈페이지)로 이동 -
temperature_element = driver.find_element(By.CLASS_NAME, 'tmp')
:tmp
클래스를 가진 요소를 찾아temperature_element
에 저장 -
feels_like_element = driver.find_element(By.CLASS_NAME, 'chill')
:chill
클래스를 가진 요소를 찾아feels_like_element
에 저장 -
temperature = temperature_element.text
:temperature_element
의 텍스트를 추출하여temperature
에 저장 -
feels_like = feels_like_element.text
:feels_like_element
의 텍스트를 추출하여feels_like
에 저장 -
driver.quit()
: WebDriver 종료
오늘의 기온: 30.4℃
체감온도: 체감(30.6℃)
이렇게 Selenium을 사용하면 JavaScript로 동적으로 생성된 콘텐츠를 크롤링할 수 있습니다.
Selenium 라이브러리에 대한 더 자세한 내용은 파이썬과 AI로 끝내는 업무 자동화 커리큘럼에서 배우실 수 있습니다!
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!