아래와 같이 기상청 날씨누리에 들어가면 연도별, 지역별 황사관측일수 데이터를 볼 수 있다.

파이썬을 이용해 표에 있는 데이터를 엑셀로 가져와 보자.

 

아래 코드를 실행하면 날 것 그대로의 데이터를 엑셀 파일을 얻을 수 있다.

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

wb = Workbook(write_only=True)
ws = wb.create_sheet('duststorm_count')
ws.append(['구분', '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'])

response = requests.get("https://www.weather.go.kr/w/dust/dust-obs-days.do", verify = False)
duststorm_page = response.text

soup = BeautifulSoup(duststorm_page, 'html.parser')

for tr_tag in soup.select('tr')[1:]:
    th_tag = tr_tag.select('th')
    td_tags = tr_tag.select('td')
    row = [
        th_tag[0].get_text(),   # 구분
        td_tags[0].get_text(),   # 1월
        td_tags[1].get_text(),   # 2월
        td_tags[2].get_text(),   # 3월
        td_tags[3].get_text(),   # 4월
        td_tags[4].get_text(),   # 5월
        td_tags[5].get_text(),   # 6월
        td_tags[6].get_text(),   # 7월
        td_tags[7].get_text(),   # 8월
        td_tags[8].get_text(),   # 9월
        td_tags[9].get_text(),   # 10월
        td_tags[10].get_text(),   # 11월
        td_tags[11].get_text(),   # 12월
    ]
    ws.append(row)

wb.save('연도별 황사관측일수.xlsx')

 

위 코드를 실행했을 때 아래와 같은 엑셀 데이터를 얻을 수 있다.

 

연도별 황사관측일수.xlsx
0.01MB

 


이제 코드를 해석해 보자.

import requests                       # requests 라이브러리를 가져와.(웹페이지 내용을 가져오는 데 사용할거야)
from bs4 import BeautifulSoup         # bs4 모듈에서 BeautifulSoup 클래스를 가져와.(웹 페이지의 데이터를 추출하는 데 사용 할거야)
from openpyxl import Workbook         # openpyxl 라이브러리에서 Workbook 클래스를 가져와.(액셀 파일을 생성하려고 해)

wb = Workbook(write_only=True)        # Workbook 클래스를 사용해 새로운 엑셀 워크북을 생성하고 쓰기 전용 모드로 설정해.
ws = wb.create_sheet('duststorm_count')     # 위에서 생성한 액셀 워크북(wb)에 'duststorm_count'라는 이름의 새로운 워크시트를 생성해.
ws.append(['구분', '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'])    # 워크시트(ws)에 첫 번째 행으로 '구분'과 각 월(1월부터 12월)을 나타내는 열 제목을 추가해.

response = requests.get("https://www.weather.go.kr/w/dust/dust-obs-days.do", verify=False)     # requests 라이브러리를 사용하여 주어진 URL로 HTTP GET 요청을 보내서 웹 페이지 내용을 가져와. SSL 인증서 검증은 비활성화 하고.
duststorm_page = response.text        # 웹 페이지의 내용을 가져와서 duststorm_page 변수에 저장해.

soup = BeautifulSoup(duststorm_page, 'html.parser')     # BeautifulSoup을 사용하여 duststorm_page의 HTML을 파싱해. 

for tr_tag in soup.select('tr')[1:]:      # BeautifulSoup을 사용하여 웹 페이지의 모든 <tr>(테이블 행) 태그를 선택해.(첫 번째 행은 테이블의 헤더 행이니까 제외하고 나머지 행들만 선택하면 돼)
    th_tag = tr_tag.select('th')          # 각 행에서 <th>(테이블 헤더 셀) 태그를 선택해.('구분'열을 나타내는 셀을 선택하면 돼)
    td_tags = tr_tag.select('td')         # 각 행에서 <td>(테이블 데이터 셀) 태그를 선택해.(각 월(1월부터 12월)에 해당하는 데이터 셀을 선택하면 돼)
    row = [                               # 각 월의 데이터를 row라는 리스트에 저장해.(각 셀의 텍스트 내용을 get_text() 메서드로 가져와서 row 리스트에 추가하면 돼)
    	th_tag[0].get_text(),      # 구분      # th_tag는 '구분' 셀이야.
    	td_tags[0].get_text(),     # 1월       # td_tags는 1월부터 12월까지의 데이터 셀이야.
        td_tags[1].get_text(),     # 2월      
        td_tags[2].get_text(),     # 3월
        td_tags[3].get_text(),     # 4월
        td_tags[4].get_text(),     # 5월
        td_tags[5].get_text(),     # 6월
        td_tags[6].get_text(),     # 7월
        td_tags[7].get_text(),     # 8월
        td_tags[8].get_text(),     # 9월
        td_tags[9].get_text(),     # 10월
        td_tags[10].get_text(),    # 11월
        td_tags[11].get_text(),    # 12월
	]
    wb.save('연도별 황사관측일수.xlsx')        # 위에서 구성한 row 리스트를 워크시트(ws)에 추가해.(각 연도별로 월별 데이터가 엑셀 파일에 추가되는거야)

wb.save('연도별 황사관측일수.xlsx')            # 작성한 워크북(wb)을 '연도별 황사관측일수.xlsx'라는 이름의 엑셀 파일로 저장해.

 

 

 

 

반응형

+ Recent posts