crossorigin="anonymous"> [데이터 분석] Chapter 02-1. 데이터 수집하기 (API 사용하기)

프로그래밍/Python & 데이터 분석

[데이터 분석] Chapter 02-1. 데이터 수집하기 (API 사용하기)

Writing coder 2026. 1. 25. 18:04
반응형

❇️ 목적

1. 웹 기반 API로 제공되는 데이터를 가져와 데이터프레임으로 변환 하는 방법을 배우기

2. JSON, XML의 데이터 구조 이해 → dataframe으로 변환 하기

 

  API 란?

 

API 이해

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

API에서 JSON 파일과 파이썬 객체의 변환 및 원리

 

# JSON 형식

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

혼자 공부하는 데이터 분석

JSON 데이터 구조

 

 

 

▶️ 파이썬 객체를 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)

JSON 파일을 데이터프레임으로 변경

 

  파이썬에서 XML 데이터 다루기

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

XML 데이터 구조

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 파일을 파이썬 딕셔너리로 변경

다운 받은 JSON 파일 dictionary로 변환

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 호출에 오류가 나거나 얻은 데이터의 형태가 달라졌을 때 알림을 받을  수 있도록 준비하는 것이 좋습니다.

 

반응형