[혼공분석] 2주차_Ch.02_데이터 수집하기 (1)

JIN A·2024년 1월 14일
0

✅혼자 공부하는 데이터 분석 with 파이썬
진도 : Chapter 02

실습파일 : Library.ipynb


✅Chapter 02 데이터 수집하기 (1)
API / HTTP / JSON / XML

  • API - Application Programming Interface
    : 웹사이트나 다른 팀의 협조 없이도 가장 편리하게 데이터를 수집할 수 있는 방법. 데이터베이스에 직접 접근하기 힘든 경우 (접근권한 문제/민감 개인정보 포함/네트워크 물리적 분리 등), 인증된 URL을 사용하여 필요한 데이터에 접근하는 방식.
    프로그램 사이의 대화 방식을 결정한다. 애플리케이션 간의 통신을 위해서는, 다양한 API 중 HTTP 프로토콜을 사용하는 웹 기반의 API가 주로 사용된다.
  • 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

HTTP GET 방식 : 호출추소+?+쿼리스트링
호출 URL ? 파라미터1 = 파라미터값1 & 파라미터2 = 파라미터값2

HTTP POST 방식 : 호출추소+POST
긴 데이터를 보내야 할 때 사용한다.
HTTP 프로토콜 안에 있는 별도의 공간에 데이터를 실어 보내기 때문에 길이 제약이 없다. URL만 봐서는 어떤 데이터를 전달했는지 알 수 없다.


2) 파이썬으로 API 호출 : requests 패키지
HTTP 프로토콜은 텍스트 기반이므로 파이썬 객체로 바로 받을 수 없다. 직렬화를 통해 JSON 문자열(text)로 변환해서 받아야한다.

  • 파이썬에서 data 받기
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()
  • 원하는 데이터 추출
    -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)
profile
CHEER UP :)

0개의 댓글