❇️ 목적
1. 웹 기반 API로 제공되는 데이터를 가져와 데이터프레임으로 변환 하는 방법을 배우기
2. JSON, XML의 데이터 구조 이해 → dataframe으로 변환 하기
✅ API 란?

✅ 파이썬에서 JSON 데이터 다루기

# JSON 형식
d = {"name": "혼자 공부하는 데이터 분석"} # json 파일은 키와 값을 모두 "" 로 감싼다.
print(d['name'])
혼자 공부하는 데이터 분석

▶️ 파이썬 객체를 JSON 문자열로 변환하기
- json.dumps(): 파이썬 객체를 JSON 문자열로 변환
- JSON (JavaScript Object Notation) 포맷은 파이썬 딕셔너리와 호환이 잘 됨.
- 웹 기반 API로 데이터를 전달 할 때는 파이썬 딕셔너리가 아닌 텍스트로 전달해야 함.
- ensure ascii = False: 원래 저장 된 문자를 그대로 출력하도록 함.
- ensure ascii = True: 문자 이외에 다른 문자를 16진수로 보이게 함.
import json
d_str = json.dumps(d, ensure_ascii = False)
print(d_str)
{"name": "혼자 공부하는 데이터 분석"}
# 데이터 타입 확인
print(type(d_str))
<class 'str'>
▶️ JSON 문자열을 파이썬 객체로 변환하기
- json.loads(): 파이썬 프로그램에 사용하기 위해 파이썬 딕셔너리로 바꾸는 함수
- Serialization (직렬화): 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환 하는 것
- Deserialization (역직렬화): 직렬화 된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것
- 문자열로 바꾸어 파이썬 객체로 전달함.
- 이는 HTTP 프로토콜이 텍스트 기반이기 때문임.
# 웹 기반 API에서 전달 되는 데이터가 json 문자열이라면
# 다음과 같이 파이썬 객체로 변환하여 프로그램에서 사용
d2 = json.loads(d_str)
print(d2['name'])
혼자 공부하는 데이터 분석
print(type(d2))
<class 'dict'>
▶️ 복잡한 구조를 JSON 문자열 & 파이썬 객체로 전달 가능
# 복잡한 구조 1. 딕셔너리
d3 = json.loads('{"name": "혼자 공부하는 데이터 분석", "author": "박해선", \
"year": 2022}')
print(d3['name'])
print(d3['author'])
print(d3['year'])
혼자 공부하는 데이터 분석
박해선
2022
# 복잡한 구조 2. 딕셔너리 내 리스트
d3 = json.loads('{"name": "혼자 공부하는 데이터 분석", "author": ["박해선", "홍길동"], \
"year": 2022}')
print(d3['author'][1])
홍길동
# 복잡한 구조 3. 딕셔너리 2개 연결
d4_str = """
[
{"name":혼자 공부하는 데이터 분석,"author":"박해선","year"2020},
{"name"혼자 공부하는 머신러닝+딥러닝:,"author":"박해선","year"2022}
]
"""
d4 = json.loads(d4_str)
print(d4[0]['name'])
혼자 공부하는 데이터 분석
▶️ JSON 문자열을 데이터프레임으로 변환하기
import pandas as pd
pd.read_json(d4_str) # pd.DataFrame(d4)으로도 가능
/tmp/ipython-input-709318057.py:3: FutureWarning: Passing literal json to 'read_json' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.
pd.read_json(d4_str)

✅ 파이썬에서 XML 데이터 다루기
- fromstring(): 파이썬 문자열을 XML로 변환
- fromstring 함수가 반환하는 객체는 단순한 python 객체가 아님.
- ElementTree 모듈 아래에 정의된 Element class의 객체임.
- tag: 속성을 출력하면 엘리먼트 이름을 쉽게 확인 가능

x_str = """
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
"""
import xml.etree.ElementTree as et
book = et.fromstring(x_str)
print(type(book))
<class 'xml.etree.ElementTree.Element'>
print(book.tag)
book
▶️ 자식 엘리먼트 확인
- findtext(): XML 리스트내의 자식엘리먼트 탐색
# XML 파일을 python list로 변경
book_childs = list(book)
print(book_childs)
[<Element 'name' at 0x7d0260f5e430>, <Element 'author' at 0x7d0260f5e480>, <Element 'year' at 0x7d0260f5e520>]
# 자식 엘리먼트를 순서대로 받아서 텍스트 출력
# 위 출력대로 자식 엘리먼트가 구성되어 있지 않을수도 있음
# 아래 처럼 findtext 사용 권장
name, author, year = book_childs
print(name.text)
print(author.text)
print(year.text)
혼자 공부하는 데이터 분석
박해선
2022
# findtext를 사용해서 자식 엘리먼트 사용
name = book.findtext('name')
author = book.findtext('author')
year = book.findtext('year')
print(name)
print(author)
print(year)
혼자 공부하는 데이터 분석
박해선
2022
# 두가지 book을 자식 엘리먼트를 갖는 XML 구조
x2_str = """
<books>
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
<book>
<name>혼자 공부하는 머신러닝 + 딥러닝</name>
<author>박해선</author>
<year>2020</year>
</book>
</books>
"""
# 문자열로 변경
books = et.fromstring(x2_str)
print(books)
print(type(books))
<class 'xml.etree.ElementTree.Element'>
# 부모 엘리먼트 확인
print(books.tag)
books
# XML 문자열을 list로 변경
books_child = list(books)
print(books_child)
[<Element 'book' at 0x7d0260ee9e90>, <Element 'book' at 0x7d0260eea750>]
▶️ 특정 이름을 갖는 자식 엘리먼트를 골라 안의 키를 출력
- findall() 함수 사용
for book in books.findall('book'):
name = book.findtext('name')
author = book.findtext('author')
year = book.findtext('year')
print(name)
print(author)
print(year)
print()
혼자 공부하는 데이터 분석
박해선
2022
혼자 공부하는 머신러닝 + 딥러닝
박해선
2020
▶️ XML을 판다스 dataframe으로 바꾸는 방법
import pandas as pd
pd.read_xml(x2_str)
/tmp/ipython-input-1172478832.py:3: FutureWarning: Passing literal xml to 'read_xml' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.
pd.read_xml(x2_str)

✅ 파이썬으로 API 호출하기: requests 패키지
웹 브라우저를 사용하지 않고 공개 API에서 JSON 데이터를 자동으로 추출하는 프로그램 만들기
# API 인증키를 넣은 호출 URL을 변수에 저장
import requests
url = "http://data4library.kr/api/loanItemSrch?format=json&stargtDt= \
2021-04-01&endDt=2021-04-30&age=20&authKey=09fad5c7e...........
▶️ requests.get(): API 호출의 결과를 담고 있는 requests 패키지의 Response 클래스 객체
r = requests.get(url)
▶️ json(): 웹 서버로부터 받은 JSON 문자열을 파이썬 객체로 변환하여 반환
data = r.json()
print(data)
- r.text: 원본 텍스트
- r.content: 응답 받은 데이터를 파이썬 바이트 객체 (bytes)로 제공, 이미지와 같은 binary 데이터를 수신할 때 유용하게 사용
- r.status_code: HTTP 상태 코드를 담고 있음.
- 404: 파일을 찾을 수 없음.
- 200: 정상 응답
▶️ JSON 파일을 파이썬 딕셔너리로 변경

books = []
for d in data['response']['docs']:
books.append(d['doc'])
⏹️ JSON 파일을 리스트 내포 (List comprehension)로 변경도 가능
books = [d['doc'], for d in data['response']['docs']]
▶️ books data를 dataframe으로 변경
books_df = pd.DataFrame(books)
books_df
▶️ to_json(): json 형태의 딕셔너리를 저장
books_df.to_json('20s_best_book.json')
🧑🏻🏫 저자의 말
👍 파이썬 프로그래머들은 웹에 있는 데이터를 가져오기 위해 requests 패키지를 정말 많이 사용
👍 인터넷에서 얻을 수 있는 데이터는 모두 제각각의 형태를 띄기 때문에 자신의 작업에 맞게 가공하려면 API 매뉴얼이나 예시를 잘 살펴보고, 코드를 작성하는데 어느정도 시간을 투자해야 한다고 합니다.
👍 데이터 수집 프로그램을 작성하여 정기적으로 데이터를 가져오려면 API 호출에 오류가 나거나 얻은 데이터의 형태가 달라졌을 때 알림을 받을 수 있도록 준비하는 것이 좋습니다.
'프로그래밍 > Python & 데이터 분석' 카테고리의 다른 글
| [데이터 분석] Chapter 01-3. 데이터 다운로드 및 인코딩 (0) | 2026.01.24 |
|---|