파이썬

Urlib 네이버 날씨 크롤링 2023 개정판 예제

0
Please log in or register to do it.

파이썬에서 간단하게 네이버 날씨 및 기상청 날씨를 가져올 수 있는 예제입니다.

* 본 예제 및 사용 인터프리터는 파이참 (pycharm) + Python 3.8 버전입니다.

완제 코드는 문서 가장 맨 아래에 있습니다. 목차 참고.

#Python Korea Weather Crawling 2023 Revise
#https://epix.kr

import datetime
import urllib
from bs4 import BeautifulSoup
import urllib.request as req

now = datetime.datetime.now()
nowDate = now.strftime('%Y년 %m월 %d일 %H시 %M분 입니다.')

print("\n   Python Weather Crawling 2022 Revise\n ")
print('   Current Datetime, ' + nowDate)
print('   오늘의 날씨 정보입니다.\n')

# 기상청에서 데이터를 가져옵니다.
url = "http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"
res = req.urlopen(url)
# res = req.urlopen("http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp")
soup = BeautifulSoup(res, "html.parser")
# Html 수프를 떠요. 우리가 지정해준 url을 파이썬이 대신 열어서 해당 html 파일을 파싱 (복사)해옵니다.

title = soup.find("title").string
# html 구문 분석 결과 타이틀을 가져올거에요

weather_info = soup.find("wf").string
print(title)
print(weather_info)
# 좀더 깔끔하게 표현하려면 print 함수내에 내장된 sep 기능과 텍스트 치환기능 을 활용해요
# print(weather_info.replace("<br />","\n "),sep='\n')


#네이버 날씨 크롤링
# Phase1 Seoul Weather Crawling

webpage = urllib.request.urlopen('https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EC%84%9C%EC%9A%B8%EB%82%A0%EC%94%A8')

soup = BeautifulSoup(webpage, 'html.parser')
temps = soup.find('div','temperature_text')
summary = soup.find('p','summary')
# print(temps)
print("서울 "+temps.text.strip())
# print(summary)
print(summary.text.strip())

시도해보면 아쉽게도 네이버 크롤링 예제 부분은 에러가 발생할 가능성이 높습니다.

왜 그럴까요?

Python 3.8 버전 실행 결과

Urlib 네이버 날씨 크롤링 2022 개정판 예제 - undefined - undefined - Python 3.8 버전 실행 결과

완전 자세히까지 들어가진 않겠지만 https로 된 웹사이트를 크롤링하기 위해서는 우리가 사용하는 라이브러리인 python urlib에 ssl 기능을 좀 더 보강해줘야 합니다.

이런 에러가 뜨면 일단 구글에다가 저 에러 코드 자체를 전체 붙여 넣기 해보면 좀 더 빠르게 해결책을 찾아볼 수 있어요.

찾아보니 pip에 ssl 버전을 업데이트하라고 합니다.

먼저 터미널에서 우리의 인스톨 도우미 pip 버전을 업그레이드해줍니다.

Urlib 네이버 날씨 크롤링 2022 개정판 예제 - undefined - undefined - Python 3.8 버전 실행 결과

명령어는

pip isntall --upgrade pip

라고 써주시고 엔터를 눌러주세요.

버전 업그레이드를 한지 얼마 안 되신 분들은 넘어가도 상관없습니다~

이제 ssl 버전을 업데이트를 먼저 한 뒤, 문제를 해결해보도록 하겠습니다.

pip install --upgrade certifi

이후 3줄을 추가 타이핑해주세요.

import ssl
context = ssl._create_unverified_context()
webpage = urllib.request.urlopen('https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EC%84%9C%EC%9A%B8%EB%82%A0%EC%94%A8',context=context)

설명하자면 https에 필요한 ssl 인증 문제에 대한 의존성을 추가하여서, urlib이 성공적으로 https 문서를 열람할 수 있도록 돕습니다.

전체 코드를 드리기 전에 웹크롤링 urlib과 beautifulsoup을 조금 더 살펴봅니다.

*짤막한 라이브러리 설명

import urllib

파이썬이 url을 가져올 수 있도록 하는 라이브러리 다양한 통신 규칙을 사용할 수 있음.

from bs4 import BeautifulSoup

urlib 등을 통해 통신한 데이터를 파이썬이 읽을 수 있는 형태로 변환 html 형태로 변환 후 해당 문서의 구조에 따라 데이터를 가져올 수 있도록 돕는 라이브러리

우선 네이버 날씨 크롤링 예제 부분에서

import ssl
#네이버 날씨 크롤링
# Phase1 Seoul Weather Crawling
context = ssl._create_unverified_context()
webpage = urllib.request.urlopen('https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EC%84%9C%EC%9A%B8%EB%82%A0%EC%94%A8',context=context)
soup = BeautifulSoup(webpage, 'html.parser')
print(soup)

soup 부분만 출력해봅시다.

Urlib 네이버 날씨 크롤링 2022 개정판 예제 - undefined - undefined - Python 3.8 버전 실행 결과

네이버에서 보니 일단 ‘어제보다’라는 키워드를 찾는 게 쉬워 보입니다.

컨트롤 + F / (Mac Command + F)를 눌러 네이버에서 가져올 데이터를 찾아볼 건데요.

위 화면처럼 뜬 검색창에 ‘어제보다’를 먼저 쳐볼까요?

Urlib 네이버 날씨 크롤링 2022 개정판 예제 - undefined - undefined - Python 3.8 버전 실행 결과
soup 출력 예시

class=”temperature_text”> <strong><span class=”blind”>현재 온도 </span>16 <span class=”celsius”>°</span></strong> </div> </div> <div class=”temperature_info”> <p class=”summary”> 어제보다 <span class=”temperature down”>1° <span class=”blind”> 낮아요 </span> </span> <span class=”weather before_slash”> 맑음 </span> </p> <dl class=”summary_list”> <dt class=”term”> 강수확률 </dt> <dd class=”desc”>0% </dd> <dt class=”term”> 습도 </dt> <dd

요런 내용의 값을 찾으셨다면 이제 우리는 class 라던가, div, span 구조등에 대해 배울 차례이지만…

이것은 일단 간단하게만 설명하고 넘어가겠습니다.

우리가 가져온 HTML은 구조가 단순한 편이라 div > p > span 이런 식으로 우리가 가져올 글 구조가 담겨있습니다.

따라서 우리가 찾으려는 값들은 temperature_text라는 클래스 이면서 div 태그 안에 담겨 있어요

(사실 한 두 번 연습으로는 어렵고 직접 html 요소에 대한 공부를 어느 정도 해야 감이 오실 거예요)

어쨌든 오늘의 온도 값은 temps = soup.find(‘div’, ‘temperature_text’)라는 친구로 쉽게 받아올 수 있습니다.

어 그런데 선생님, 막상 print(temps)를 찍어보니 모양이 막 이쁘지 않아요.~!

이런 비정제 데이터를 조금 더 예쁘게 만들어 줄 수 있습니다.

soup.text.strip

strip()은 파이썬에서 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다. 말이 좀 어렵죠? 말 그대로 현재 텍스트 값을 서술하기 위해 쓰인 요소들을 덜어내 준다고 생각하시면 됩니다.

<div class=”temperature_text”> <strong><span class=”blind”>현재 온도 </span>14 <span class=”celsius”>°</span></strong> </div>

현재 온도 14°

이런 식으로 바꾸어 출력할 수 있습니다.


전체 코드 (코드 개정 일자 2023.4.4 / 실행 일자 2023.7.6)

#Python Korea Weather Crawling 2022 Revise
#https://mustzee.tistory.com

import datetime
import urllib
from bs4 import BeautifulSoup
import urllib.request as req

now = datetime.datetime.now()
nowDate = now.strftime('%Y년 %m월 %d일 %H시 %M분 입니다.')

print("\n   Python Weather Crawling 2023 Revise\n ")
print('   Current Datetime, ' + nowDate)
print('   오늘의 날씨 정보입니다.\n')

# 기상청에서 데이터를 가져옵니다.
url = "http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"
res = req.urlopen(url)
# res = req.urlopen("http://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp")
soup = BeautifulSoup(res, "html.parser")
# Html 수프를 떠요. 우리가 지정해준 url을 파이썬이 대신 열어서 해당 html 파일을 파싱 (복사)해옵니다.
title = soup.find("title").string
# html 구문 분석 결과 타이틀을 가져올거에요
weather_info = soup.find("wf").string
print(title)
print(weather_info)
# 좀더 깔끔하게 표현하려면 print 함수내에 내장된 sep 기능과 텍스트 치환기능 을 활용해요
# print(weather_info.replace("<br />","\n "),sep='\n')

import ssl
#네이버 날씨 크롤링
# Phase1 Seoul Weather Crawling
context = ssl._create_unverified_context()
webpage = urllib.request.urlopen('https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EC%84%9C%EC%9A%B8%EB%82%A0%EC%94%A8',context=context)
soup = BeautifulSoup(webpage, 'html.parser')
temps = soup.find('div','temperature_text')
summary = soup.find('p','summary')
print(temps)
print("서울 "+temps.text.strip())
# print(summary)
print(summary.text.strip())

Google Colab 으로 구글애널리틱스(GA4) 데이터 가져오기
페이스북 비즈니스 매니저 영구정지 해결방법은?

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다