아래는 내가 파이썬으로 간단하게 TourAPI 호출 테스트를 한 코드이다.
아래 코드를 바꿔가며 TourAPI 데이터를 파이썬으로 다루는 방법들에 대해서 공부해 보았다.
detailCommon1
import requests
import os
from dotenv import load_dotenv
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
pprint는 데이터를 보기 좋게 출력(pretty print)할 때 사용하는 모듈이다
사용전
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
contents = response.text
print(contents)
사용후
import requests
import os
from dotenv import load_dotenv
import pprint
import json
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
contents = response.text
pprint.pprint(contents)
인터넷으로 얻은 JSON 파일을 읽어 파이썬에서 처리할 수 있도록 딕셔너리 자료형으로 만들려면 어떻게 해야 할까?
json
은 JSON 데이터를 쉽게 처리하고자 사용하는 모듈.
JSON 파일을 읽을 때는 json.load(파일 객체)를 사용한다. load() 함수는 읽은 데이터를 딕셔너리 자료형으로 반환한다.
반대로 딕셔너리 자료형을 JSON 파일로 생성할 때는 json.dump(딕셔너리, 파일 객체)를 사용
import requests
import os
from dotenv import load_dotenv
import pprint
import json
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
contents = response.text
# pprint.pprint(contents)
dict = json.loads(contents)
print(dict)
print(type(dict))
참고로 아래와 같은 코드를 실행시키면
import requests
import os
from dotenv import load_dotenv
import pprint
import json
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
contents = response.text
print(contents)
print(type(contents))
# pprint.pprint(contents)
# dict = json.loads(contents)
# print(dict)
# print(type(dict))
아래와 같은 결과가 나온다.
실행결과의 타입을 유의해서 보자!
contents = response.text
print(contents)
위코드의 실행결과는 JSON 형태처럼 생겼지만 실제로는 그냥 문자열이다! 타입결과에서도 알수 있다!
따라서 json.loads(contents)
를 해줌으로 JSON 문자열을 → 파이썬 딕셔너리로 변환해줄 수 있게 된다!
따라서 밑에서 나오는것 처럼 dict['response']['body']['items']['item']
처럼 접근이 가능하게 된다!
사실 response.json()
도 json.loads(contents)
와 같은 역할을 한다!
.json()
메서드가 json.loads(response.text)
를 내부적으로 해준당!
정리하면
response.text
: JSON처럼 보이지만 사실은 그냥 문자열이다!json.loads(response.text)
: 문자열을 파이썬 dict로 변환해 준다!response.json()
: 위 과정을 자동으로 해주는 함수.따라서
response = requests.get(url, params=params)
contents = response.text
dict = json.loads(contents)
print(dict)
위코드와 아래 코드는 동일
response = requests.get(url, params=params)
dict = response.json()
print(dict)
딕셔너리 안에서 딕셔너리를 사용하는 중첩 딕셔너리.
딕셔너리는 값 부분에 다시 딕셔너리가 계속 들어갈 수 있습니다.
딕셔너리 안에 들어있는 딕셔너리에 접근하려면 딕셔너리 뒤에
[ ](대괄호)
를 단계만큼 붙이고 키를 지정해주면 됩니다.
아까전 위 출력을 예쁘게 정리해 보았다
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"contentid": "2674675",
"contenttypeid": "15",
"title": "수원화성의 비밀",
"createdtime": "20201006015851",
"modifiedtime": "20240111152040",
"tel": "031-290-3563",
"telname": "수원문화재단",
"homepage": "<a href=\"https://www.swcf.or.kr/?p=74&viewMode=view&idx=192\" target=\"_blank\" title=\"새창: 홈페이지로 이동\">https://www.swcf.or.kr/</a>",
"booktour": "",
"firstimage": "http://tong.visitkorea.or.kr/cms/resource/74/2674674_image2_1.jpg",
"firstimage2": "http://tong.visitkorea.or.kr/cms/resource/74/2674674_image2_1.jpg",
"cpyrhtDivCd": "Type3",
"addr1": "경기도 수원시 팔달구 행궁로 11",
"addr2": "(남창동)",
"zipcode": "16261",
"mapx": "127.0152812635",
"mapy": "37.2810769133",
"mlevel": "6",
"overview": "스마트폰으로 수원 화성 일원에서 진행하는 방탈출 게임 형식의 콘텐츠로 증강현실 등 다양한 정보통신기술과 역사를 직접 체험할 수 있는 관광 콘텐츠"
}
]
},
"numOfRows": 1,
"pageNo": 1,
"totalCount": 1
}
}
}
위 출력에서 필요한 값만 가져와 보자!
import requests
import os
from dotenv import load_dotenv
import pprint
import json
load_dotenv()
service_key = os.getenv("TOURAPI_SERVICE_KEY")
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
contents = response.text
# pprint.pprint(contents)
dict = json.loads(contents)
body = dict['response']['body']['items']['item']
print(body)
결과