Python에서 open api를 활용하여 데이터 수집 하는 방법을 알아보고, csv와 json으로 저장 하는 방법을 알아보자
사이트는 영화 진흥 위원회에서 제공하는 데이터를 받아올 예정이다
1. 회원가입
-
위 주소로 접속 후 로그인 버튼을 눌러서 회원 가입을 한다
-
키 발급 받기를 클릭 하고
-
사용목적과 관리명을 임의로 정해준 뒤, 사용url은 http://localhost로 입력
키 발급이 완료되고 발급된 키는 조금 있다가 사용할 예정이다 -
이제 OPEN API를 클릭!
-
주간/주말 박스오피스 클릭 후 REST 방식을 확인
요청 인터페이스를 보면 다른건 default값이 있지만, key와 targetDt는 지정해 주어야 한다
-
내가 리턴 받을 데이터에 대한 설명이다. 조금 있다가 자세하게 살펴보자
-
Json형태로 응답 받을 예정이다
끝으로 마지막 사진의 json부분을 복사해서 사용할 예정이다. 아래 코드의 발급키 부분에 발급받은 키를 넣어주면 된다
2. 영화 데이터 받아오기
import requests
import json
# 발급 받은 키를 변수에 할당
key = "발급 키"
# 조회를 할 날짜를 yyyymmdd 형식으로 지정
date = 20231217
# 세선 생성
session = requests.Session()
# url 생성
url = f"http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={key}&targetDt={date}"
res = session.get(url)
# 응답 받은 데이터를 json 형식으로 movies 변수에 할당
movies = json.loads(res.text)
# 결과 확인
print(movies)
결과를 확인 해보면 딕셔너리(json) 형태로 값을 리턴 받았을 것이다.
3. json 및 csv 형식으로 파일 저장
- csv
# csv로 저장될 파일 이름 지정
fname1 = f"boxOffice_{date}.csv"
# 저 데이터들 중에 순위, 영화 명, 개봉일, 누적 관객 수를 저장
# 필요한 데이터는 "응답 구조" 가 나와있는 부분에서 확인할 수 있다
with open(fname1, "w", encoding="utf-8") as f:
f.write("순위,영화명,개봉일,누적관객\n")
for v in movies["boxOfficeResult"]["dailyBoxOfficeList"]:
f.write(f"{v['rank']},{v['movieNm']},{v['openDt']},{v['audiAcc']}\n")
# json으로 저장될 파일 이름 지정
fname2 = f"boxOffice_{date}.json"
with open(fname2, "w", encoding="utf-8") as f:
json.dump(movies, f, ensure_ascii=False, indent=2)
- Json
import requests
import json
key = "발급 키"
date = 20231217
session = requests.Session()
url = f"http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={key}&targetDt={date}"
res = session.get(url)
movies = json.loads(res.text)
fname1 = f"boxOffice_{date}.csv"
with open(fname1, "w", encoding="utf-8") as f:
f.write("순위,영화명,개봉일,누적관객\n")
for v in movies["boxOfficeResult"]["dailyBoxOfficeList"]:
f.write(f"{v['rank']},{v['movieNm']},{v['openDt']},{v['audiAcc']}\n")
fname2 = f"boxOffice_{date}.json"
with open(fname2, "w", encoding="utf-8") as f:
json.dump(movies, f, ensure_ascii=False, indent=2)
Leave a comment