✅혼자 공부하는 데이터 분석 with 파이썬
진도 : Chapter 02
실습파일 : Library.ipynb
✅Chapter 02 데이터 수집하기 (1)
API / HTTP / JSON / XML
HTTP - Hyper Text Transfer Protocol
: 웹사이트는 웹 페이지를 서비스하기 위해 웹 서버 소프트웨어를 사용한다. (ex) NGINX, Apache) 이러한 웹 서버 프로그램이 웹 브라우저와 통신할 때 사용하는 Protocol(통신 규약)을 HTTP라 한다.
=> 서버에 데이터 요청하는 통신규약!
HTML - Hyper Text Markup Language
: 웹 페이지를 구성하는 데이터. 웹 브라우저가 화면의 표시할 수 있는 문서종류. 웹 페이지 표준 언어. markup언어(tag 사용)
=> 서버로부터 전달받은 웹 데이터!
[Web Software Program Operation Flow]
web server <----HTTP(웹 데이터요청)----- web browser
-----HTML(웹 데이터전송)---->
[Web기반 API Operation Flow]
Program A <------HTTP(데이터요청)------- Program B
---CSV, JSON, XML(데이터전송)-->
[파이썬에서 JSON 데이터 다루기] - JavaScript Object Notation
JSON
-객체 형태 {"키" : "값"}
-파이썬 딕셔너리와 유사
-key를 출력하면 value를 반환한다.
웹 기반 API 동작
: HTTP는 텍스트 기반이라, 데이터를 전송하려면 변환이 필요
1)파이썬 객체 -> JSON 문자열 변환하여 전송 #직렬화
2)JSON 문자열 -> 파이썬 객체로 변환하여 사용 #역직렬화
# 파이썬 -> JSON (문자열text) 변환 : json.dumps()
import json
d_str = json.dumps(d, ensure_ascii=False)
#ensure_ascii=False : 아스키 문자 외의 것(한글)도 그대로 출력.
해당 매개변수 지정하지 않으면 ascii 문자 외의 다른 문자를 16진수로 출력하여 한글이 제대로 보이지 않음.
print(type(d_str))
-> 결과는 <class 'str'> 으로 잘 변환되었다.
# JSON (문자열text) -> 파이썬 변환 : json.loads()
d2 = json.loads(d_str)
print(d2['name']) #key값 입력 -> value값 출력
print(type(d2))
-> 결과는 <class 'dict'> 로 잘 변환되었다.
#세겹따옴표를 사용하여 긴 문자열을 줄바꿈하여 입력
d4_str = """
[
{"name":"혼자 공부하는 데이터 분석", "author":["박해선","HD"], "year":2024},
{"name":"혼자 공부하는 머신러닝+딥러닝", "author":["박해선","HD"], "year":2024}
]
"""
d4 = json.loads(d4_str)
print(d4[0]['author'][1])
> HD
# JSON -> DataFrame 변환 : read_json()
import pandas as pd
pd.read_json(d4_str)
[파이썬에서 XML 데이터 다루기] - eXtensible Markup Language
HTML은 웹 페이지 표현하기는 좋은데, 구조적이지 못하여 API에는 적절하지 않음.
XML은 컴퓨터와 사람이 모두 읽고 쓰기 편한 문서 포맷을 위해 고안됨.
xml_str = """
#루트, 부모 (노드,엘리먼트)
<book>
#자식들 (tab으로 들여쓰기 된 부분들)
#엘리먼트를 시작태그, 종료 태그가 감싸는 구조
#엘리먼트들이 계층 구조를 이루면서 정보르 표현
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
"""
# XML -> 파이썬(element class 객체) 변환 : fromstring()
import xml.etree.ElementTree as et
book = et.fromstring(xml_str)
print(type(book))
> <class 'xml.etree.ElementTree.Element'>
print(book.tag)
book
# 자식 엘리먼트 확인 : findtext() 메서드
# 우선 부모 엘리먼트인 book객체를 리스트로 변환하여, 자식엘리먼트 구하기
book_childs = list(book)
> 각각의 엘리먼트 이름이 출력됨 - name, author, year
# 각각 엘리먼트 이름으로 변수 할당 : 자식.text
# name, author, year = book_childs
> print(name.text)
> 혼자 공부하는 데이터 분석
# 자식 엘리먼트 자동 텍스트 반환(순서상관X): 부모.findtext(자식)
name = book.findtext('name')
> print(name)
> 혼자 공부하는 데이터 분석
# 여러 개의 자식 엘리먼트 확인 : findall(), for문
# <books> 안에 두 개의 <book> 엘리먼트를 찾아보자.
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()
✅실습하기
1) API로 20대가 가장 좋아하는 도서 찾기
(!)도서관 정보나루 가입하기
https://www.data4library.kr/apiUtilization
API를 호출하는 URL 작성
공개 API를 사용하려면 호출 URL이 필요하다.
API 호출
사이트에서 인증키 발급을 신청하고, API 키 발급이 완료되면 authKey= 파라미터에 값을 붙여넣는다.
https://www.data4library.kr/api/loanItemSrch?format=json&startDt=2021-04-01&endDt=2021-04-30&age=20&authKey='API값을_여기에_붙여넣기'
=> API가 JSON 형태의 값을 반환해줌. (format=json)
HTTP GET 방식 : 호출추소+?+쿼리스트링
호출 URL ? 파라미터1 = 파라미터값1 & 파라미터2 = 파라미터값2HTTP POST 방식 : 호출추소+POST
긴 데이터를 보내야 할 때 사용한다.
HTTP 프로토콜 안에 있는 별도의 공간에 데이터를 실어 보내기 때문에 길이 제약이 없다. URL만 봐서는 어떤 데이터를 전달했는지 알 수 없다.
2) 파이썬으로 API 호출 : requests 패키지
HTTP 프로토콜은 텍스트 기반이므로 파이썬 객체로 바로 받을 수 없다. 직렬화를 통해 JSON 문자열(text)로 변환해서 받아야한다.
import requests
url = https://www.data4library.kr/api/loanItemSrch?format=json&startDt=2021-04-01&endDt=2021-04-30&age=20&authKey='API값을_여기에_붙여넣기'
# URL을 전달 (format=json)
r = requests.get(url)
# 역직렬화 (JSON -> 파이썬) : 변수.json()
data = r.json()
books = [i['doc'] for i in data['response']['request']['docs']]
books_df = pd.DataFrame(books)
books_df
books_df.to_json('20s_best_book.json', force_ascii=False)