728x90
강의를 통해 파이썬 기초와 크롤링 기초를 배운 후 크롤링을 연습해보기로 했다.
기상청 홈페이지의 황사관측일수를 가져와서
년도별로 황사 관측이 많이된 월을 조회하기로 했다.
https://www.weather.go.kr/w/dust/dust-obs-days.do
우선 년도를 가져오자
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 |