3월 28일
이전으로
Python
공공 데이터
.csv
제주도 기상
- 제주, 고산, 성산, 서귀포에서 관측
- 2019년 1월 1일부터 12월 31일까지 각 지역의 일별 최저 기온, 최고 기온, 강수량, 상대 습도를 기록
- 새 파일
s14_csv10.py
생성
import usecsv
lines = usecsv.opencsv('jeju_2019.csv', 'UTF-8')
newLines = usecsv.switch(lines)
for line in newLines[:5]:
print(line)
print('-'*3)
# 서귀포시의 1월달의 지점, 일시, 최저 기온 데이터 출력
print(newLines[0][1:4])
for line in newLines:
# 지점명, 일시 2019-01-01에서 월 정보 추출
if line[1] == '서귀포' and line[2][5:7] == '01':
# 지점, 일시, 최저 기온
print(line[1], line[2], line[3])
print('-'*3)
# 서귀포시의 최저 기온 평균
month = 1
sum = 0
num_day = 0
for line in newLines:
# 지점명, 일시, 2019-01-01에서 월 정보 추출; '01'을 1로
if line[1] == '서귀포' and int(line[2][5:7]) == month:
# 최저 기온 누적
sum += line[3]
num_day += 1
avg = sum/num_day
print('%d월의 일 수: %d' % (month,num_day))
print('%d월의 최저 기온 평균: %.1f' % (month,avg))
print('-'*3)
# 8월 지역별 최고 기온
month = 8 # 기준 월
max_jeju = -1000 # 실제 기온 데이터로 대체될 수 있어야하니 확실한 범위 밖 값을 지정
max_sungsan = -1000
max_gosan = -1000
max_suguipo = -1000
for line in newLines:
# 지점명, 일시
if line[1] == '제주' and int(line[2][5:7]) == month:
# 최고 기온
if line[4] > max_jeju:
max_jeju = line[4]
if line[1] == '고산' and int(line[2][5:7]) == month:
if line[4] > max_gosan:
max_gosan = line[4]
if line[1] == '성산' and int(line[2][5:7]) == month:
if line[4] > max_sungsan:
max_sungsan = line[4]
if line[1] == '서귀포' and int(line[2][5:7]) == month:
if line[4] > max_suguipo:
max_suguipo = line[4]
print('%d월 제주 최고 기온: %.1f' % (month, max_jeju))
print('%d월 고산 최고 기온: %.1f' % (month, max_gosan))
print('%d월 성산 최고 기온: %.1f' % (month, max_sungsan))
print('%d월 서귀포 최고 기온: %.1f' % (month, max_suguipo))
- 새 파일
s15_csv11.py
생성
import usecsv
lines = usecsv.opencsv('jeju_2019.csv', 'UTF-8')
newLines = usecsv.switch(lines)
# 가장 비가 많이 오는 월을 산출하기 위해 월별 강수량 누적할 리스트 생성
sum_rain = []
for i in range(0,12):
sum_rain.append(0)
# newLines[0] 항목 제외
for line in newLines[1:]:
# 강수량이 비어 있는 경우 0으로 대입
if not line[5]:
line[5] = 0
# 월별로 강수량 누적
for i in range(0,12):
if int(line[2][5:7]) == i+1:
sum_rain[i] += line[5]
print(sum_rain)
print('-'*3)
# 최대 강수량
max_month_rain = max(sum_rain)
# 월: 인덱스 + 1로 산출
max_month = sum_rain.index(max_month_rain) + 1
print('(1) 최대 강수 월과 강수량: %d월, %.1f mm' % (max_month, max_month_rain))
print('-'*3)
print('(2) 월별 강수량')
for i in range(0,len(sum_rain)):
print('%d월: %.1f mm' % (i+1,sum_rain[i]))
- 새 파일
s16_csv12.py
생성
import usecsv
lines = usecsv.opencsv('jeju_2019.csv', 'UTF-8')
newLines = usecsv.switch(lines)
# 고산 지역의 7월 최저/최고 습도
month = 7 # 기준 월
min_humidity = 1000 # 실제 값으로 대체 가능하도록 확실히 범위 바깥에 있는 값을 지정
max_humidity = -1000
for line in newLines[1:]:
if line[1] == '고산' and int(line[2][5:7]) == month:
# 최저 습도
if line[6] < min_humidity:
min_humidity = line[6]
# 최고 습도
if line[6] > max_humidity:
max_humidity = line[6]
# 고산 지역의 7월 최저, 최고 습도 출력
print('%d월 최저 습도: %.1f' % (month,min_humidity))
print('%d월 최고 습도: %.1f' % (month,max_humidity))
- 새 파일
s17_csv13.py
생성
import usecsv
lines = usecsv.opencsv('jeju_2019.csv', 'UTF-8')
newLines = usecsv.switch(lines)
# 연 강수량을 지역별로 저장할 수 있는 리스트 생성
region = ['제주', '고산', '성산', '서귀포']
total_rain = [0,0,0,0]
for line in newLines[1:]:
# 강수량이 비어 있는 경우 0 대입
if not line[5]:
line[5] = 0
for i in range(0,4):
if line[1] == region[i]:
total_rain[i] += line[5]
# 연 최대 강수량
max_year_rain = max(total_rain)
max_area = region[total_rain.index(max_year_rain)]
print('(1) 연 강수 최대 지역: %s' % max_area)
print('(2) 지역별 강수량')
for i in range(0,4):
print('%s: %.1f mm' % (region[i], total_rain[i]))
웹 크롤링
BeautifulSoup
pip install beautifulsoup4
명언
http://quotes.toscrape.com/
- 새 PyDev 프로젝트
ch10-webcrawling
생성 후 새 파일 s01_crawling.py
생성
# urllib는 웹에서 얻은 데이터를 다루는 파이썬 패키지
import urllib.request as ur
# BeautifulSoup는 웹 문서를 구성하는 HTML과 XML 문서에서 원하는 정보를 쉽게 추출할 수 있는 모듈을 모아놓은 파이썬 패키지
from bs4 import BeautifulSoup as bs
url = 'http://quotes.toscrape.com/'
# 해당 주소의 웹 사이트에 원하는 정보를 요청하여 그 결과를 반환
html = ur.urlopen(url)
print(html)
print('-'*3)
# BeautifulSoup로 자료형 변환하기(html 문자열, html 파서)
soup = bs(ur.urlopen(url).read(), 'html.parser')
print(soup)
- 새 파일
s02_crawling2.py
생성
import urllib.request as ur
from bs4 import BeautifulSoup as bs
soup = bs(ur.urlopen('http://quotes.toscrape.com/').read(), 'html.parser')
print(soup)
print('-'*3)
# find_all()로 원하는 태그만 모아서 리스트 반환
print(soup.find_all('span'))
print('-'*3)
quote = soup.find_all('span')
print(quote[0])
print('-'*3)
# 모든 원소에서 텍스트만 추출
for i in quote:
print(i.text)
print('-'*3)
# 클래스가 quote인 <div>만 모아서 리스트로 반환
print(soup.find_all('div', {'class':'quote'}))
print('-'*3)
print(soup.find_all('div', attrs={'class':'quote'}))
print('-'*3)
# find()는 조건에 일치하는 첫 번째 태그를 반환
print(soup.find('span', {'itemprop':'text'}))
다음으로