- 프로그램이 서로 대화하기 위한 방법을 정의한 것
- 웹기반 API는 웹 서버와 웹 브라우저가 대화하는 방식과 비슷하다.
- HTTP 프로토콜을 사용하지만 HTML을 주고받는 것이 아니라 일반적으로 CSV, JSON, XML 같은 파일을 사용한다.
- 보통 웹기반 API에서는 CSV보다 JSNO, XML을 많이 사용한다.
- CSV는 각 행마다 항목의 개수가 정확하게 맞지 않으면 읽을 수가 없기 떄문이다.
json_obj = {"name" : "혼자 공부하는 데이터 분석"} # Json에서는 key, value 값을 큰따옴표로 감싸줘야 한다.
print(json_obj['name']) # 파이썬에서는 문자열을 쓸 때 작은 따옴표, 큰 따옴표 모두 사용이 가능하지만 주로 작은 따옴표를 사용한다.
import json
json_str = json.dumps(json_obj, ensure_ascii=False)
print(json_str)
출력: {"name": "혼자 공부하는 데이터 분석"}
출력: {"name": "\ud63c\uc790 \uacf5\ubd80\ud558\ub294 \ub370\uc774\ud130 \ubd84\uc11d"}
💡 파이썬 객체를 바로 전송하지 않고 문자열로 바꾸어 전송하는 이유
- 웹 기반 API가 사용하는 HTTP 프로토콜이 텍스트 기반이기 떄문.
- 직렬화(serialization): 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환하는 것 (json.dumps())
- 역직렬화(deserialization): 직렬화된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것 (json.loads())
import json
json_obj2 = json.loads(json_str)
print(json_obj2['name'])
print(type(json_obj2))
출력: 혼자 공부하는 데이터 분석
출력: <class 'dict'>
{
"name" : "혼자 공부하는 데이터 분석",
"autor" : "박해선",
"year" : 2022
}
{
"name" : "혼자 공부하는 데이터 분석",
"autor" : ["박해선", "홍길동"],
"year" : 2022
}
[
{
"name" : "혼자 공부하는 데이터 분석",
"author" : ["박해선", "홍길동"],
"year" : 2022
},
{
"name" : "혼자 공부하는 머신러닝 + 딥러닝",
"author" : "박해선",
"year" : 2022
}
]
import pandas as pd
json_str = '''[
{
"name" : "혼자 공부하는 데이터 분석",
"author" : ["박해선", "홍길동"],
"year" : 2022
},
{
"name" : "혼자 공부하는 머신러닝 + 딥러닝",
"author" : "박해선",
"year" : 2022
}
]'''
pd.read_json(json_str) # json_str은 json 문자열
import pandas as pd
import json
json_str = '''[
{
"name" : "혼자 공부하는 데이터 분석",
"author" : ["박해선", "홍길동"],
"year" : 2022
},
{
"name" : "혼자 공부하는 머신러닝 + 딥러닝",
"author" : "박해선",
"year" : 2022
}
]'''
dict = json.loads(json_str)
pd.DataFrame(dict) # dict는 Json 문자열을 파이썬 객체로 변환한 객체
💡 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.
- read_json() 함수를 호출할 때 다음과 같은 오류가 발생한다.
- 위 오류는 FutureWarning으로 앞으로 코드가 변경될 가능성을 알려주는 오류이다.
- read_json() 함수에 json 문자열을 그대로 넘기는 방식이 더 이상 지원되지 않을 예정이기 떄문에 StringIO 객체로 감싸서 Json 문자열을 읽어야 한다.
💡 StringIO
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
import xml.eTree.ElementTree as et
x_str = '''
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
'''
book = et.fromstring(x_str) # 가장 먼저 등장하는 부모 엘리먼트 <book>을 가져온다.
print(book.tag) # 현재 객체의 엘리먼트 이름을 확인할 수 있다.
book_childs = list(book) # book 객체를 리스트로 변환하여 자식 엘리먼트를 구함.
name, author, year = book_childs # 리스트의 각 항목을 name, author, year 변수에 할당
print(name.text) # name 엘리먼트의 text를 출력
print(author.text) # author 엘리먼트의 text를 출력
print(year.text) # year 엘리먼트의 text를 출력
name = book.findtext('name')
author = book.findtext('author')
year = book.findtext('year')
print(name)
print(author)
print(year)
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()
import pandas as pd
import xml.eTree.ElementTree as et
x_str = '''
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
'''
pd.read_xml(x_str) # json_str은 json 문자열
💡 HTTP GET 방식
- 웹 브라우저가 웹 서버에 요청을 할 때 URL로 파라미터 값이나 데이터를 전달할 수 있다. (GET 방식)
- ? 문자 뒤에 연결된 파라미터 값들은 쿼리 스트링(query string)이라고 한다.
- 웹 브라우저와 웹 서버 모두 URL 길이에 제한을 두고 있는데 보통 2000자 이내면 안전한 길이다.
- 만약 2,000자 이상의 데이터를 보내야 하는 경우에는 POST 방식을 사용한다.
- POST 방식은 URL 뒤에 파라미터나 데이터를 붙이지 않기 때문에 길이 제약 없이 보낼 수 있다.
- 하지만, POST 방식은 URL만 봐서는 어떤 데이터를 전달했는지 알 수 없다.
파이썬에서 URL을 호출하여 데이터를 받는 방법은 여러가지가 있지만 requests 패키지가 대표적이다.
HTTP GET
💡 Json이 아닌 원본 데이터를 받기 위해서는?
- 반환 객체 Response의 text => 응답으로 받은 원본 텍스트를 담고 있다.
- 반환 객체 Response의 content => 응답받은 데이터를 바이트 객체로 담고 있다.
판다스 패키지의 to_json() 메서드를 통해 데이터 프레임을 JSON으로 변환하여 저장할 수 있다.