Study Web Development

3월 28일

이전으로

Python

공공 데이터

.csv

제주도 기상
  1. 새 파일 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))
  1. 새 파일 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]))
  1. 새 파일 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))
  1. 새 파일 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/

  1. 새 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)
  1. 새 파일 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'}))

다음으로