ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 영화오픈API 파싱
    개발노트 2019. 7. 31. 10:41

    API를 받아오기 위해서는 KEY를 발급받아야 합니다.

     

    영화진흥위원회 오픈API

     

    www.kobis.or.kr

    영화진흥위원회 회원가입을 하고 키 발급을 받아줍니다.

     

    KEY는 2개를 만들 수 있고 한 키당 하루에 3000번 KEY사용이 가능합니다.

     

    API를 사용하기에 앞서 어떤 정보를 받아 올 수 있는지 알아야 합니다.

    (아래 링크에서 확인 가능합니다.)

     

     

    원하는 변수를 알았다면 코드를 작성해줍니다.

    XML을 파싱 하는 방법과 Json을 파싱하는 방법이 있습니다.


    XML일별 박스오피스 파싱

    import pandas as pd
    import datetime
    import requests
    
    key1 = '발급받은 키1'
    
    def crawl_data(start_date, end_date, keys =key1) :
        
        final_list = []
        url = 'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json'
    
        
        for single_date in pd.date_range(start_date, end_date) :
        """
        다양성 영화/상업영화를 구분지어 조회할 수 있습니다.
    	“Y” : 다양성 영화 “N” : 상업영화 (default : 전체)
        한국/외국 영화별로 조회할 수 있습니다.
    	“K: : 한국영화 “F” : 외국영화 (default : 전체)
        """
            for multi, rep in zip(["N", "N", "N", "N"], ["", "", "", ""]) :            
                payload={
                #원하는 변수를 넣어줍니다.
                'key' : keys,
                'targetDt' : single_date.strftime('%Y%m%d'),
                'itemPerPage' : '10',
                'multiMovieYn' : multi,
                'repNationCd' : rep,
                'wideAreaCd' : '0105004'
                }
                
                req = requests.get(url, params = payload)
                
                for item in req.json()['boxOfficeResult']['dailyBoxOfficeList'] :
                    temp_list = []
                    key_list = []
                    for key, value in item.items() :
                        key_list.append(key)
                        temp_list.append(value)
                        
                    temp_list.append(single_date)
                    key_list.append('CurrentDate')
                    
                    temp_list.append(multi)
                    key_list.append('multi')
    
                    temp_list.append(rep)
                    key_list.append('Nation')
                    
                    final_list.append(temp_list)
    
        return pd.DataFrame(final_list, columns=key_list)
        
    
    
    movie = crawl_data("20181231", "20190101", keys=key1) #원하는 기간을 설정합니다.
    
    movie.to_csv('movie.txt', mode='a',encoding='utf-8', index=False)
    
    

     

    오픈되어있는 소스를 조금 변형시켰습니다.

    원하는 지역의 일별 박스오피스만 가져오기 위해서 'wideAreaCd' 변수를 추가했습니다.

    지역코드 확인

    오류 없이 심플하게 저장하기 위해 txt 파일로 저장했습니다.

    (.csv로 저장 시 가끔 자잘한 오류가 발생합니다.)

    csv로 파일명만 바꿔주면 됩니다. 만약 글자가 깨진다면

    txt 파일-다른 이름으로 저장-인코딩 형식을 바꿔주면 됩니다.

     

     


    Json일별 박스오피스 파싱

    import requests
    import json
    
    url = 'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=발급받은 키&targetDt=20180220'
    res = requests.get(url)
    text = res.text
    
    d = json.loads(text) 
    
    for b in d['boxOfficeResult']['dailyBoxOfficeList']:
        print(b['rank'], b['rankOldAndNew'], b['movieCd'], b['movieNm'], b['salesAmt'], b['audiCnt'])

     

    출력 결과

    1 OLD 20170561 블랙 팬서 1339810000 171156
    2 OLD 20168250 골든슬럼버 363771900 48097
    3 OLD 20179205 조선명탐정: 흡혈괴마의 비밀 296878400 40315
    4 OLD 20176121 흥부: 글로 세상을 바꾼 자 126100600 16983
    5 OLD 20078561 명탐정 코난:감벽의 관 78434800 11466
    6 OLD 20179985 코코 56664400 7967
    7 OLD 20178672 패딩턴 2 52331600 7861
    8 NEW 20170841 리틀 포레스트 46692700 6846
    9 OLD 20176104 그것만이 내 세상 45505700 6623
    10 OLD 20177946 월요일이 사라졌다 17183800 2449

     

    csv 형식으로 저장하기 위해 코드를 바꿨습니다.

    import requests
    import json
    import pandas as pd
    
    url = 'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=f3caad7be238d2ce27ebb30f3613c461&targetDt=20180220'
    res = requests.get(url)
    text = res.text
    
    d = json.loads(text) 
    movie = []
    for b in d['boxOfficeResult']['dailyBoxOfficeList']:
        movie.append([b['rank'], b['rankOldAndNew'], b['movieCd'], b['movieNm'], b['salesAmt'], b['audiCnt']])   
    
    data = pd.DataFrame(movie)    
    data.to_csv("movie1.txt",mode='w', encoding='utf-8', index=False)

     

    Yeowoolee/Movie-API-crawler

    Movie API crawler. Contribute to Yeowoolee/Movie-API-crawler development by creating an account on GitHub.

    github.com

     

    댓글

Designed by Tistory.