본문 바로가기
  • 공부한 것들과 여러가지를 기록해요
Python/data

웹 기반 API(JSON, XML)

by 티권 2023. 1. 14.

API란

- Application Programming Interface

- 두 프로그램이 서로 대화하기 위한 방법을 정의한 것

 

웹 브라우저 -> 웹 서버 : 웹 데이터 요청(HTTP)

웹 서버 -> 웹 브라우저 : 웹 데이터 전송(HTML)

: HTTP 프로토콜을 사용해 웹 페이지를 구성하는 HTML 데이터를 주고 받음.

 

HTTP 프로토콜(통신규약)을 사용해 API를 만드는 것이 웹 기반 API

웹 기반 API를 사용하는 방법을 아는 것이 중요.

 

웹 기반 API

프로그램 A -> 프로그램 B : 데이터 요청(HTTP)

프로그램 B -> 프로그램 A : 데이터 전송(CSV, JSON, XML)

: HTML은 구조가 복잡해서 다른 걸 선호, 프로그램 간의 약속대로 전송하는API에서는 적절하지 않음.


JSON

- JavaScript Object Notation

- 웹 기반 API에는 CSV 보다 JSON이나 XML을 많이 사용

- CSV와 마찬가지로 텍스트 파일

- CSV는 행과 열로만 구성(복잡한 데이터 구조 표현 어려움) but JSON이나 XML은 다양한 구조 생성 가능

- HTML이나 XML보다 사람이 읽기 편하고, 파이썬 객체로 쉽게 변환 가능

- 파이썬 딕셔너리 + 리스트 와 비슷

- json 객체 : {"name" : "이름", "author" : ["작가1", "작가2"]} : 키와 값을 콜론으로 연결

- json 배열 : json 객체를 대괄호 안에 나열

 

json.dumps()

: 파이썬 객체를 JSON 문자열로 변환

: json.dumps()는 아스키 문자 외의 다른 문자를 16진수로 출력 -> 한글 안보임

+ ensure_ascii = False : 원래 저장된 문자를 그대로 출력. 한글 보임

 

json.loads()

: JSON 문자열을 파이썬 객체로 변환

 

json.loads()  vs  json.load()

load는 json 파일을 읽어들이는 반면,

loads는 json 형태의 문자열을 읽어들이는 함수

 

 

파이썬 객체를 따옴표로 문자열 취급한 것을 json 문자열으로 생각.

 

 

json 배열은 파이썬 리스트로 변환 됨.

 

웹 기반 API가 사용하는 HTTP 프로토콜은 텍스트 기반이다.

HTTP 프로토콜로 데이터를 전송하려면 객체를 텍스트로 변환해야함 by json.dumps()  -  직렬화

전송 받은 뒤에는 다시 프로그램에서 실행 가능한 객체로 변환 by json.loads()  -  역직렬화

 

json 문자열을 데이터프레임으로 변환하기(pandas)

: read_json()

: DataFrame() : json 문자열을 파이썬 객체(list)로 만들고 DataFrame 클래스 사용

 

json 파일로 저장

: to_json()

+ force_ascii = False : 한글을 그대로 저장


XML

- eXtensible Markup Language

- 텍스트 형식

- HTML과 매우 비슷한 문자 기반의 마크업 언어(text-based markup language)

- 컴퓨터와 사람이 모두 읽고 쓰기 편한 문서 포맷을 위해 고안됨

- element들이 계층 구조를 이루면서 정보를 표현.

- element는 시작 태그와 종료 태그로 감싼다. <year>2023</year>

- 시작 태그와 종료 태그의 이름은 같아야함.

- 부모 element 혹은 부모 node, 자식 element와 혹은 자식 node

 

fromstring()

: XML문자열을 파이썬 객체로 변환

: 반환하는 객체가 단순한 파이썬 객체가 아니라 Element Tree 모듈 아래에 정의된 Element 클래스의 객체

 

book 객체는 가장 먼저 등장하는 부모 엘리먼트인 <book>에 해당함

 

findtext()

: 자식 element 확인하기

: 찾으려는 태그 이름을 넣어주면 해당 element를 찾아 텍스트를 반환함.

: 지정한 태그 이름과 맞는 첫 번째 자식 element의 텍스트를 반환함.

 

 

findall() + for문

: 여러 개의 자식 element 확인하기

: 지정한 태그 이름과 맞는 모든 자식 element를 반환함.

 

 

XML은 fromstring() 함수를 사용하여 부모 element를 얻고, findall() 함수로 자식 엘리멘트에 담긴 텍스트를 추출 한다.

 

XML을 데이터프레임으로 변환하기(pandas)

- read_xml()


API 활용(도서관 정보나루)

제공하는 호출URL 형식 + 발급 받은 키 입력하여 접속

 

 

HTTP GET 방식 : 웹브라우저가 웹서버에 요청할 때 URL로 파라미터 값이나 데이터를 전달하는 방법

호출 URL과 파라미터는 ?로 연결(? 뒤에 연결된 파라미터와 값들을 쿼리 스트링(query string) 이라고 함)

파라미터와 값은 = 로 연결 

파라미터 사이는 & 로 연결

http://data4library.kr/api/loanItemSrch?format=json&startDt=2021-04-01&endDt=2021-04-30&age=20&authKey=f77e652b08b67f19ed06a94c992558075bf7a67928c517528ae47a10639e66f0 

 


파이썬으로 API 호출하기 : requests 패키지

 

 

url을 request.get() 함수에 전달

requests.get() : requests 패키지의 Response 클래스 객체를 반환함

json() : 웹 서버로부터 받은JSON 문자열을 파이썬 객체(dict)로 변환하여 반환

 

 

text() : 텍스트로 반환

content() : 바이트 객체(bytes) 반환, 이미와 같은 바이너리 데이터를 수신할 때 주로 사용

 

 

dict을 판다스 데이터 프레임으로 변경 후 사용

'Python > data' 카테고리의 다른 글

크롤링(Beautiful Soup)  (0) 2023.01.18