본문 바로가기

Data Science/Python

정부 API로 josn 파싱하기

*API(Application Programming Interface)

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

 

import csv
import requests
from decouple import config
from datetime import timedelta, datetime
from pprint import pprint

# 정보를 담을 빈 딕셔너리 생성
result = {}

# url을 호출

for i in range(1040):

    # 2020년 12월31일을 기준으로 1주일씩 과거의 데이터
    targetDt = datetime(2020, 12, 31) - timedelta(weeks=i)
    targetDt = targetDt.strftime('%Y%m%d')

    url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json?key=&targetDt={targetDt}'
    
    # 받은 상세정보를 저장
    api_data = requests.get(url).json()

    # 필요한 정보 접근 후 재저장
    movies = api_data.get('boxOfficeResult').get('weeklyBoxOfficeList')
    
    # result 딕셔너리에 넣기
    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')
            }


# result 딕셔너리를 boxoffice.csv을 생성하여 저장
with open('boxoffice_2.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)

 

*Json

속성-값 쌍( attribute–value pairs and array data types (or any other serializable value)) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷

with open('/content/drive/MyDrive/boxoffice_2_0224.csv', newline='', encoding='utf-8') as f:
  reader = csv.DictReader(f)
  movieCd_lists = []
  
  for row in reader:
    movieCd_lists.append(row['movieCd'])

result = {}

for movieCd_list in movieCd_lists:
  movieCd = movieCd_list
  url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json?key=&movieCd={movieCd}'
  
  detail_data = requests.get(url).json()
  movie_infos = detail_data.get('movieInfoResult').get('movieInfo')

  for movie_info in movie_infos:
    result[movieCd_list] = {
        'movieCd': movie_infos.get('movieCd'),
        'movieNm': movie_infos.get('movieNm'),
        'watchGradeNm': movie_infos.get('audits')[0].get('watchGradeNm') if movie_infos.get('audits') else None, 
        'openDt': movie_infos.get('openDt'),
        'showTm': movie_infos.get('showTm'),
        'genres': movie_infos.get('genres')[0].get('genreNm') if movie_infos.get('genres') else None,
        'director': movie_infos.get('directors')[0].get('peopleNm') if movie_infos.get('directors') else None,
        'actor': movie_infos.get('actors')[0].get('peopleNm') if movie_infos.get('actors') else None,
        'companys': movie_infos.get('companys')[0].get('companyNm') if movie_infos.get('companys') else None,
        'nation': movie_infos.get('nations')[0].get('nationNm') if movie_infos.get('nations') else None}
  
  with open('movie_info.csv', 'w', encoding='utf-8', newline='') as f:
    fieldnames = ('movieCd', 'movieNm', 'watchGradeNm', 'openDt', 'showTm', 'genres', 'director', 'actor', 'companys', 'nation')
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    for value in result.values():
        writer.writerow(value)