์ฃผ์ด์ง ๋ช ์ธ์๋ฅผ ํด๊ฒฐํ๋ผ!
์ต๊ทผ 50์ฃผ๊ฐ ๋ฐ์ดํฐ ์ค์ ์ฃผ๊ฐ ๋ฐ์ค์คํผ์ค TOP10๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค. ํด๋น ๋ฐ์ดํฐ๋ ํฅํ ํํ์ ์๋น์ค์ ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ ํ ๋ชฉ๋ก์ผ๋ก ์ฌ์ฉ๋ ์์ ์
๋๋ค.
๐ผ ํ์ ์ฌํญ
- python
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ - requests
- API - ์ํ์งํฅ์์ํ ์คํ API - http://www.kobis.or.kr/kobisopenapi/homepg/main/main.do
๐ผ ๋ช ์ธ์์ ํ์์ฌํญ
- ์ต๊ทผ 50์ฃผ๊ฐ ๋ฐ์ดํฐ๊ฐ ํ์
- ์ฃผ๊ฐ ๋ฐ์ค์คํผ์ค TOP10๋ฐ์ดํฐ๋ฅผ ์์ง
๐ผ ๋ช ์ธ์์ ์๊ตฌ์ฌํญ
- ์ฃผ๊ฐ(์~์ผ)๊น์ง ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
- ์กฐํ ๊ธฐ๊ฐ์ ์ด 50์ฃผ์ด๋ฉฐ, ๊ธฐ์ค์ผ(๋ง์ง๋ง ์ผ์)์ 2019๋
7์ 13์ผ์
๋๋ค.
- ๋ค์์ฑ ํ/์์
ํ๋ฅผ ๋ชจ๋ ํฌํจํ์ฌ์ผ ํฉ๋๋ค.
- ํ๊ตญ/์ธ๊ตญ ํ๋ฅผ ๋ชจ๋ ํฌํจํ์ฌ์ผ ํฉ๋๋ค.
- ๋ชจ๋ ์์ง์ญ์ ํฌํจํ์ฌ์ผ ํฉ๋๋ค.
๐ผ ๋ช ์ธ์์ ๊ฒฐ๊ณผ
- ์์ง๋ ๋ฐ์ดํฐ์์ `์ํ ๋ํ์ฝ๋`, `์ํ๋ช
`, `ํด๋น์ผ ๋์ ๊ด๊ฐ์`๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- `ํด๋น์ผ ๋์ ๊ด๊ฐ์`๋ ์ค๋ณต์ ์ต์ ์ ๋ณด๋ฅผ ๋ฐํ์ฌ์ผ ํฉ๋๋ค.
- `boxoffice.csv` ์ ์ ์ฅํฉ๋๋ค.
๐ผ 01.py ์์ฝ
- ์ํ๊ณผ์ - API์ url๋ฅผ ๋ถ๋ฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผํจ : requests๋ฅผ ์ ์ ํ ํ์ฉํ์ - ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ dict ํํ๋ก ์ ์ฅ. : .get()๊ณผ ๋ฐ๋ณต๋ฌธ ๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์. - dict์ ์๋ฃ๋ฅผ .csv์ ์ ์ฅํจ. : with open() ํจ์๋ฅผ ํ์ฉํ์.
- ์ฃผ์์ฌํญ
- dictionary์ ๋ฆฌ์คํธ์์ ๊ด๊ณ๋ฅผ ๊ณ ๋ คํดํํจ.
- jason ํํ์ ์๋ฃ์ dictionary๋ก ๋์ด์๋์ง, ๋ฆฌ์คํธ๋ก ๋์ด์๋์ง ๊ตฌ๋ณํด์ผํจ.
import csv
import json
import requests
from datetime import datetime, timedelta
from decouple import config
from pprint import pprint
result = {}
for i in range(50):
token = config('MOIVE_KOBIS_TOKEN')
targetDt = datetime(2019,7,13) - timedelta(weeks=i)
targetDt = targetDt.strftime('%Y%m%d')
api_url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json?weekGb=0&key={token}&targetDt={targetDt}'
api_data = requests.get(api_url).json()
movies = api_data.get('boxOfficeResult').get('weeklyBoxOfficeList')
for movie in movies:
code = movie.get('movieCd')
if code not in result:
result[code] = {
'movieCd': movie.get('movieCd'),
'movieNm': movie.get('movieNm'),
'audiAcc': movie.get('audiAcc')
}
with open('boxoffice.csv', 'w', encoding='utf-8',newline='') as f:
fieldnames = ('movieCd', 'movieNm', 'audiAcc')
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for value in result.values():
#print(value)
writer.writerow(value)
import csv
import json
import requests
from datetime import datetime, timedelta
from decouple import config
from pprint import pprint
- `import csv `: csvํ์ผ ์์ฑ์ ํ์
- `import jason `: url์ ํด๋น๋๋ ์๋ฃ๊ฐ jason์ dict ํํ๋ก ์ ์ฅํจ.
- `import requests `: python์ธ์ด๊ฐ ๋ค๋ฅธ ์ธ์ด์ ์ํตํ ์ ์๊ฒ ํจ.
- `import datetime `: ํ์ฌ์๊ฐ ๊ณ์ฐ์ ํ์.
- `import config`: token๊ฐ์ ์จ๊ธฐ๊ธฐ์ํด ํ์
for i in range(50):
token = config('MOIVE_KOBIS_TOKEN')
targetDt = datetime(2019,7,13) - timedelta(weeks=i)
targetDt = targetDt.strftime('%Y%m%d')
- for๊ตฌ๋ฌธ์ 50์ฃผ๊ฐ์ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํจ
- targetDt๋ ์๋ฃ์ ํ์ํ 20190713์ ํํ๋ก ๋ณํํ๊ธฐ ์ํ.
api_url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json?weekGb=0&key={token}&targetDt={targetDt}'
api_data = requests.get(api_url).json()
movies = api_data.get('boxOfficeResult').get('weeklyBoxOfficeList')
- ์ํ์งํฅ์์ํ ์คํ API์์ ํ์ํ ์๋ฃ ๊ฐ์ ธ์ค๊ธฐ
for movie in movies:
code = movie.get('movieCd')
if code not in result:
result[code] = {
'movieCd': movie.get('movieCd'),
'movieNm': movie.get('movieNm'),
'audiAcc': movie.get('audiAcc')
}
- for ๊ตฌ๋ฌธ์ ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ฅผ result๋ผ๋ ์๋ก์ด dict์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
with open('boxoffice.csv', 'w', encoding='utf-8',newline='') as f:
fieldnames = ('movieCd', 'movieNm', 'audiAcc')
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for value in result.values():
#print(value)
writer.writerow(value)
- boxoffice.csv์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ํ์.
๐ผ ๋ช ์ธ์์ ๊ฒฐ๊ณผ
- ์์ ์์ง๋ ๋ฐ์ดํฐ์์
์ํ ๋ํ์ฝ๋
๋ฅผ ๋ถ๋ฌ์ ์ํ๋ณ๋ก์ํ ๋ํ์ฝ๋
,์ํ๋ช (๊ตญ๋ฌธ)
,์ํ๋ช (์๋ฌธ)
,์ํ๋ช (์๋ฌธ)
,๊ด๋๋ฑ๊ธ
,๊ฐ๋ด์ฐ๋
,์์์๊ฐ
,์ฅ๋ฅด
,๊ฐ๋ ๋ช
์ ๊ธฐ๋กํฉ๋๋ค. movie.csv
์ ์ ์ฅํฉ๋๋ค.
๐ผ 02.py ์์ฝ
- ์ํ๊ณผ์
boxoffice.csv
์ ํ์ผ์ ์ ์ฅ๋์ํ๋ํ์ฝ๋
๋ฅผ ๊ฐ์ ธ์ค์. :with open() ํจ์ ํ์ฉํ์.- ์๋ก์ด
url
์์ ํ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์. ์ํ๋ํ์ฝ๋
์ ์ผ์นํ๋ dict ํํ๋ก ์ ์ฅ. : .get()๊ณผ ๋ฐ๋ณต๋ฌธ ๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์.- dict์ ์๋ฃ๋ฅผ .csv์ ์ ์ฅํจ. : with open() ํจ์๋ฅผ ํ์ฉํ์.
- ์ฃผ์์ฌํญ
url
์๋ฃ์์ dictionary์ ๋น์ด์๋ ์๋ฃ๋ก ์ธํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.list has out of range
์ค๋ฅ๋ฐ์ : if ๋ฌธ ํ์ฉ.
- ์๋ฃ๊ฐ ๋ฐฉ๋ํด์ง์๋ก ํ๋ก๊ทธ๋จ ์๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ค. (1๋ถ์ ๋์์)
- ์ฝ๋๋ฅผ ํ์ธํ ๋์ ํ์ํ ๋ถ๋ถ๋ง ๋ณด์ผ ์ ์๋๋ก ์ฝ๋ฉํ์ฌ, ์คํ๊ณผ ์ทจ์๋ฅผ ๋ฐ๋ณตํ์.
import csv
import json
import requests
from datetime import datetime, timedelta
from decouple import config
from pprint import pprint
result = []
with open('boxoffice.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
code = row.get('movieCd')
result.append(code)
result2 = {}
for code2 in result:
token = config('MOIVE_KOBIS_TOKEN')
info_url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json?key={token}&movieCd={code2}'
api_info_data = requests.get(info_url).json()
movie_info = api_info_data.get('movieInfoResult').get('movieInfo')
result2[code2] = {
'movieCd': movie_info.get('movieCd'),
'movieNm': movie_info.get('movieNm'),
'movieNmEn': movie_info.get('movieNmEn'),
'movieNmOg': movie_info.get('movieNmOg'),
'openDt': movie_info.get('openDt'),
'showTm': movie_info.get('showTm'),
'watchGradeNm': movie_info.get('audits')[0].get('watchGradeNm') if movie_info.get('audits') else None,
'genreNm': movie_info.get('genres')[0].get('genreNm') if movie_info.get('genres') else None,
'directors': movie_info.get('directors')[0].get('peopleNm') if movie_info.get('directors') else None
}
#pprint(result2)
with open('movies.csv', 'w', encoding='utf-8',newline='') as f:
fieldnames = ('movieCd', 'movieNm', 'movieNmEn', 'movieNmOg', 'watchGradeNm', 'openDt', 'showTm', 'genreNm', 'directors')
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for value in result2.values():
#print(value)
writer.writerow(value)