[오늘의 문제] BeautifulSoup+Selenium 활용한 데이터 파싱

shlim55·2025년 11월 13일

코딩테스트

목록 보기
174/223
'''
1.네이버 검색창에 '{지역} 날씨' 형태로 검색하기
2.검색된 페이지로 와서 날씨 정보 파싱
'''

'''
1.현재온도
2.현재 날씨 상태(맑음, 흐림, 비 등등의 키워드)
3.미세먼지 정도
4.초미세먼지 정도
5.자외선 정도 
6.현재 날씨 상태에 대한 이미지 URL
'''

내가 작성한 코드문

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

import time, re
import requests
import json
'''
1.네이버 검색창에 '{지역} 날씨' 형태로 검색하기
2.검색된 페이지로 와서 날씨 정보 파싱
'''

'''
1.현재온도
2.현재 날씨 상태(맑음, 흐림, 비 등등의 키워드)
3.미세먼지 정도
4.초미세먼지 정도
5.자외선 정도 
6.현재 날씨 상태에 대한 이미지 URL
'''

driver = webdriver.Chrome()
driver.get("https://www.naver.com/")
time.sleep(1)

# 1.네이버 검색창에 '{지역} 날씨' 형태로 검색하기
지역 = input("콘솔창에 검색하고자 하는 날씨를 입력하세요: ")
query = driver.find_element(By.XPATH, '//*[@id="query"]')
query.send_keys(f"{지역}날씨")

search_btn = driver.find_element(By.CSS_SELECTOR, "button.btn_search")
search_btn.click()

time.sleep(2) # 딜레이 없어서 weather = []로 추출된 현상이 있었음
# 2.검색된 페이지로 와서 날씨 정보 파싱

html = driver.page_source # 셀레니움에서 추출한 url 
bs = BeautifulSoup(html, "html.parser")
weather =  bs.select_one("div.weather_info div.status_wrap")


today_weather = weather.select_one("div._today")
temp = today_weather.select_one("div.temperature_text strong").get_text(strip=True) # 1.현재온도
status = today_weather.select_one("span.weather").get_text(strip=True) # 2.현재 날씨 상태(맑음, 흐림, 비 등등의 키워드)
# print(f"{temp} {status}")

card_weather = bs.select("ul.today_chart_list")

fine_dust = card_weather[0].select_one("ul.today_chart_list li:nth-child(1)").get_text(strip=True) # 3.미세먼지 정도
ultra_fine_dust = card_weather[0].select_one("ul.today_chart_list li:nth-child(2)").get_text(strip=True) # 4.초미세먼지 정도

ultraviolet_rays = card_weather[0].select_one("ul.today_chart_list li.item_today.level2 span").get_text(strip=True) # 5.자외선 정도 

# 1. 일단 i태그 클래스 값 추출 000_000 형식으로 나올거임
icon_tag = weather.select_one("i.wt_icon")["class"][1] # <i class="wt_icon ico_wt2"><span class="blind">맑음</span></i>
print(icon_tag)#  ico_wt2
# 2. split 활용후 _뒤의 문자열 추출
icon_code = icon_tag.split("_")[1]
# 3. 이미지 url 이있고 f.string 활용해서 추출한 문자열을 그 링크에 넣는다.
url = f"https://ssl.pstatic.net/sstatic/keypage/outside/scui/weather_new_new/img/weather_svg_v2/icon_flat_{icon_code}.svg"

time.sleep(2)  # 렌더링 대기
weather_data = {
  "지역": 지역,
  "날씨": {
    "현재 온도": temp,
    "아이콘 식별자(클래스)": url, 
    "날씨 상태": status,
    "미세먼지": fine_dust,
    "초미세먼지": ultra_fine_dust,
    "자외선": ultraviolet_rays
  }
}

json_output = json.dumps(weather_data, ensure_ascii=False, indent=2)
print(json_output)

input("엔터를 누르면 창이 닫힙니다.")    

많이 코드문이 러프하긴 하다.

출력결과

콘솔창에 검색하고자 하는 날씨를 입력하세요: 도봉
ico_wt2
{
  "지역": "도봉",
  "날씨": {
    "현재 온도": "현재 온도8.8°",
    "아이콘 식별자(클래스)": "https://ssl.pstatic.net/sstatic/keypage/outside/scui/weather_new_new/img/weather_svg_v2/icon_flat_wt2.svg",
    "날씨 상태": "맑음",
    "미세먼지": "미세먼지보통",
    "초미세먼지": "초미세먼지보통",
    "자외선": "자외선좋음"
  }
}
엔터를 누르면 창이 닫힙니다.
profile
A Normal Programmer

0개의 댓글