Guidelines

JavaScript와 동적 μ›Ή 크둀링

μ›Ή νŽ˜μ΄μ§€λŠ” HTML, CSS, JavScript 이 3가지가 κ²°ν•©λ˜μ–΄ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

HTML은 μ›Ή νŽ˜μ΄μ§€μ˜ ꡬ쑰λ₯Ό μ •μ˜ν•˜κ³ , CSSλŠ” μ›Ή νŽ˜μ΄μ§€μ˜ μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€.

JavaScriptλŠ” μ–Έμ–΄λŠ” μ›Ή νŽ˜μ΄μ§€λ₯Ό 동적(Dynamic)으둜 λ§Œλ“­λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ™μ μ΄λΌλŠ” λ‹¨μ–΄μ˜ μ˜λ―ΈλŠ” μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜κ±°λ‚˜, νŠΉμ • μ΄λ²€νŠΈμ— λ°˜μ‘ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ μ½˜ν…μΈ κ°€ λ°”λ€ŒλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ JavaScriptλ₯Ό ν™œμš©ν•˜λ©΄ μ‚¬μš©μžκ°€ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ μƒˆλ‘œμš΄ λ‚΄μš©μ„ ν‘œμ‹œν•˜κ±°λ‚˜, μ‚¬μš©μžμ˜ μŠ€ν¬λ‘€μ— 따라 좔가적인 μ½˜ν…μΈ λ₯Ό 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 동적 μ½˜ν…μΈ λŠ” μ›Ή νŽ˜μ΄μ§€λ₯Ό 처음 뢈러올 λ•ŒλŠ” μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€κ°€, μ›Ή λΈŒλΌμš°μ €μ—μ„œ JavaScriptλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ λ™μ μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.


BeautifulSoup의 ν•œκ³„

BeautifulSoup은 HTML을 뢄석해 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ JavaScriptλ₯Ό ν™œμš©ν•΄ λ™μ μœΌλ‘œ μƒμ„±λœ μ½˜ν…μΈ λŠ” BeautifulSoup으둜 κ°€μ Έμ˜¬ 수 μ—†μŠ΅λ‹ˆλ‹€.


BeautifulSoup으둜 크둀링이 λΆˆκ°€ν•œ μ½”λ“œ 예제

λ¨Όμ € BeautifulSoup을 μ‚¬μš©ν•΄ 기상청 ν™ˆνŽ˜μ΄μ§€μ—μ„œ ν˜„μž¬ 기온과 체감 μ˜¨λ„λ₯Ό κ°€μ Έμ˜€λŠ” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

BeautifulSoup으둜 크둀링 μ‹œλ„ν•˜κΈ°
import requests from bs4 import BeautifulSoup # 기상청 ν™ˆνŽ˜μ΄μ§€ URL url = 'https://www.weather.go.kr/w/index.do' # νŽ˜μ΄μ§€ μš”μ²­ response = requests.get(url) # BeautifulSoup으둜 HTML νŒŒμ‹± soup = BeautifulSoup(response.text, 'html.parser') # 기온과 μ²΄κ°μ˜¨λ„ μ°ΎκΈ° # 'tmp' ν΄λž˜μŠ€λŠ” ν˜„μž¬ κΈ°μ˜¨μ„ λ‚˜νƒ€λ‚΄κ³ , 'chill' ν΄λž˜μŠ€λŠ” μ²΄κ°μ˜¨λ„λ₯Ό λ‚˜νƒ€λƒ„ temperature_element = soup.find('span', class_='tmp') feels_like_element = soup.find('span', class_='chill') # ν…μŠ€νŠΈ μΆ”μΆœ temperature = temperature_element.text.strip() if temperature_element else 'N/A' feels_like = feels_like_element.text.strip() if feels_like_element else 'N/A' # κ²°κ³Ό 좜λ ₯ print(f"였늘의 기온: {temperature}") print(f"μ²΄κ°μ˜¨λ„: {feels_like}")

μœ„ μ½”λ“œλŠ” BeautifulSoup으둜 기상청 ν™ˆνŽ˜μ΄μ§€μ˜ 날씨 정보λ₯Ό κ°€μ Έμ˜€λ €κ³  μ‹œλ„ν•˜μ§€λ§Œ, temperature_element와 feels_like_elementκ°€ None을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ΄λŠ” JavaScriptκ°€ μ‹€ν–‰λ˜κΈ° μ „μ˜ HTML만 κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μš”μ†Œλ₯Ό 찾을 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.


Selenium을 ν™œμš©ν•œ 동적 μ›Ή 크둀링

기상청 ν™ˆνŽ˜μ΄μ§€λŠ” JavaScriptλ₯Ό ν™œμš©ν•΄ λ™μ μœΌλ‘œ 날씨 정보λ₯Ό ν‘œμ‹œν•˜κΈ° λ•Œλ¬Έμ— BeautifulSoupμœΌλ‘œλŠ” 데이터λ₯Ό μ œλŒ€λ‘œ κ°€μ Έμ˜¬ 수 μ—†μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ Selenium(μ…€λ ˆλ‹ˆμ›€)을 μ‚¬μš©ν•˜λ©΄ μ‹€μ œ λΈŒλΌμš°μ €μ—μ„œ JavaScriptκ°€ μ‹€ν–‰λœ ν›„μ˜ 화면을 가져와, μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³  : μ‹€μŠ΅ μ½”λ“œλ₯Ό μ»΄ν“¨ν„°μ—μ„œ μ‹€μ œλ‘œ μ‹€ν–‰ν•˜λ €λ©΄, pip install selenium λͺ…λ Ήμ–΄λ‘œ 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둜 λ™μ μœΌλ‘œ μƒμ„±λœ μ½˜ν…μΈ λ₯Ό 크둀링할 수 μžˆμŠ΅λ‹ˆλ‹€.

Mission
0 / 1

λ‹€μŒ 쀑 JavaScript둜 λ™μ μœΌλ‘œ μƒμ„±λœ μ›Ή μ½˜ν…μΈ λ₯Ό 크둀링할 λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” λ„κ΅¬λŠ” λ¬΄μ—‡μΌκΉŒμš”?

BeautifulSoup
requests
Selenium
pandas

Guidelines

AI Tutor

Publish

Design

Upload

Notes

Favorites

Help

Code Editor

Run
Generate

Execution Result