Cute Running Puppy
본문 바로가기
개발일기/웹 종합

크롤링 연습 (기상청 홈페이지)

by 징구짱 2023. 1. 18.
728x90

강의를 통해 파이썬 기초와 크롤링 기초를 배운 후 크롤링을 연습해보기로 했다.

 

파이썬 기초, 웹스크래핑(크롤링) 기초

2023.01.18 3-1 3주차 설치 파이썬(윈도우 다운로드) https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe (5주차를 위한) gitbash 다운로드 https://git-scm.com/ Git git-scm.com 3-2 연습 겸 복습 - 스파르타피디아에 Op

pingu514.tistory.com

 

 

기상청 홈페이지의 황사관측일수를 가져와서

년도별로 황사 관측이 많이된 월을 조회하기로 했다.

https://www.weather.go.kr/w/dust/dust-obs-days.do

 

황사관측일수 - 기상청 날씨누리

개편된 날씨누리 홈페이지 첫 화면에서 지도를 통한 실시간 기상정보와 레이더영상, 전국 특보 현황을 조회할 수 있으며, 내 지역의 현재 기상상황과 대기질 상태, 일출/일몰 시각을 확인할 수

www.weather.go.kr

 

 

우선 년도를 가져오자

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.weather.go.kr/w/dust/dust-obs-days.do',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

title = soup.select_one('#pm10-stat > tbody > tr:nth-child(1) > th')
print(title)

 

반복문으로 전체 년도와 관측일수를 출력했다.

rows = soup.select('#pm10-stat > tbody > tr')
for row in rows:
    year = row.select_one('th').text
    print(year)
    yearcount = row.text
    print(yearcount)

 

리스트 형태로 바꾸기

yearcount = yearcount.split()
print(yearcount)

 

맨 앞의 년도 삭제

del (yearcount[0])
print(yearcount)

 

'.'으로 출력되는 내역은 0으로 출력되도록 반복문으로 출력했다.

for num in range(12):
    if yearcount[num] != '.':
        count = int(yearcount[num])
    else :
        count = 0
    print(count)

 

변수 설정

cnt = 0			// 월 저장된 카운트
count = 0		// 황사관측일수를 저장할 변수
max_count = 0		// 최대 관측된 황사관측일수를 저장할 변수
max_month = ''		// 최대 관측된 월을 저장할 변수

 

count와 max_count를 비교해서 같다면 max에 count와 월을 추가한다.

cnt를 이용하여 첫번째 출력인지 확인하고 아니라면 구분하기 위해 ', '를 붙여준다.

if max_count == count:
    if cnt == 0:
        max_month = str(num + 1) + '월'
        max_count = count
        
    else :
        max_month += ', ' + str(num + 1) + '월'
    
    cnt = cnt + 1

 

count와 max_count를 비교해서 count가 크면 max의 count와 월을 적용한다.

cnt는 1로 셋팅

if (max_count < count):
    max_month = str(num + 1) + '월'
    max_count = count
    cnt = 1

 

관측일수가 있으면 출력해주고 없으면 관측일수 없음 출력

if (max_count != 0):
    print(max_month, '관측일수 :', max_count)
else :
    print('관측일수 없음')

 

전체 소스

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.weather.go.kr/w/dust/dust-obs-days.do', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

title = soup.select_one('#pm10-stat > tbody > tr:nth-child(1) > th')
# print(title)

rows = soup.select('#pm10-stat > tbody > tr')
for row in rows:
    year = row.select_one('th').text
    print(year)

    yearcount = row.text
    # print(yearcount)

    yearcount = yearcount.split()
    # print(yearcount)

    del (yearcount[0])
    # print(yearcount)

    cnt = 0
    count = 0
    max_count = 0
    max_month = ''

    for num in range(12):
        if yearcount[num] != '.':
            count = int(yearcount[num])
        else:
            count = 0
        #print(count)

        if max_count == count:
            if cnt == 0:
                max_month = str(num + 1) + '월'
                max_count = count

            else:
                max_month += ', ' + str(num + 1) + '월'

            cnt = cnt + 1

        else :
            if (max_count < count):
                max_month = str(num + 1) + '월'
                max_count = count
                cnt = 1

        print('max_month : ' + max_month + ', max_count : ' + str(max_count) + ', count: ' + str(count) + ', cnt : ' + str(cnt))

    if (max_count != 0):
        print(max_month, '관측일수 :', max_count)
    else:
        print('관측일수 없음')

 

❗주의할점

  • 문자열 나누기 (.split)은 리스트로 변환됨
yearcount = yearcount.split()
print(yearcount)

 

  • 형변환
// int를 str로 변환 예시 (int와 str이 합쳐지지 않으므로 형변환을 시켜줘야한다)
max_month = str(num + 1) + '월'

// str을 int로 변환 예시 (str 값을 숫자로 넣고 싶음)
count = int(yearcount[num])

 

  • 데이터 삭제 (del) 

삭제 후 yearcount[1] 데이터가 yearcount[0]로 옮겨짐

del (yearcount[0])
print(yearcount)

 

  • 들여쓰기 주의
if max_count == count:
    if cnt == 0:
        max_month = str(num + 1) + '월'
    else :
        max_month += ', ' + str(num + 1) + '월'
    
    cnt = cnt + 1 		// if max_count == count인 경우 모두 적용됨
    	cnt = cnt + 1		// else에만 적용됨
728x90

'개발일기 > 웹 종합' 카테고리의 다른 글

Flask 프레임워크  (0) 2023.01.21
mongoDB 연결하기  (1) 2023.01.19
파이썬 기초, 웹스크래핑(크롤링) 기초  (0) 2023.01.18
Ajax  (0) 2023.01.14
JQuery  (0) 2023.01.14