[혼공학습단 9기] 혼자 공부하는 데이터분석 with 파이썬 2주차 (1) - API를 사용해서 데이터를 수집해보자!

coshibaken413·2023년 1월 15일
0

혼공학습단 9기

목록 보기
5/20

CHAPTER 2 - 데이터 수집하기

2-1. API 사용하기

핵심 키워드

API HTTP JSON XML

API란

API(Application Programming Interface)는 두 프로그램이 서로 대화하기 위한 방법을 정의한 것이다. 가장 대표적인 API는 웹 기반의 API이다.

웹 페이지를 전송하기 위한 통신 규약:HTTP

우리가 보는 웹 사이트는 웹 페이지를 서비스하기 위해서 웹 서버를 사용한다. 웹 서버는 웹 브라우저와 통신할 때 사용하는 프로토콜로 HTTP를 사용한다.

HTTP는 인터넷에서 웹 페이지를 전송하는 기본 통신 방법이다.

예를 들어 아래 그림을 보면 각각의 클라이언트들은 노트북, 스마트폰, PC를 이용해 웹 페이지를 보고 있다. 여기서 웹 브라우저( ex. 크롬)가 웹 서버에 웹 페이지를 요청하고, 웹 서버는 요청에 맞는 웹 페이지를 웹 브라우저에 전송한다.


https://en.wikipedia.org/wiki/Client–server_model

클라이언트가 HTTP 요청을 하고, 서버가 HTTP 응답을 한다는 것이다. 이 HTTP 프로토콜을 사용해 API를 만드는 것이 웹 기반 API이다.

웹 페이지 문서:HTML

HTML(HyperText Markup Language)은 웹 브라우저가 화면에 표시할 수 있는 문서의 한 종류이자 웹 페이지를 위한 표준 언어이다. 현재 보고있는 웹 페이지의 HTML 내용을 보고 싶다면 크롬 브라우저의 경우 [마우스 오른쪽 버튼] - [페이지 소스 보기] 메뉴를 클릭한다.

그러면 아래와 같은 코드로 시작하는 새 창이 열린다. 굉장히 복잡해 보이지만 HTML은 체계적으로 구성되어 있기 때문에 차근차근 알아보면 구조를 금방 파악할 수 있다.

먼저 맨 위에 있는 <!DOCTYPE>는 마크업 언어용 DTD 태그이다. 

그 아랫 줄에 있는 <html>은 HTML이 작용하는 범위를 지정하는 태그로 위의 DTD를 제외한 전체를 이 태그로 둘러싼다.

<head>는 HTML 문서의 속성 범위를 지정하기 위한 태그이다. 이 태그 안에 타이틀이나 메타 태그 등을 넣는다. 이외의 <title> , <meta> , <script> , <div> 등으로 시작하는 것들도 모두 태그이다.

HTML은 태그에서 시작해서 태그로 끝나는 마크업 언어라고 할 수 있다.

웹 기반 API는 클라이언트가 데이터를 요청하면 웹 브라우저는 HTML이 아닌 파일 형식을 사용해서 데이터를 전송하는 방식으로 동작한다.

HTML은 위에서도 볼 수 있듯이 구조가 비교적 복잡하기 때문에 웹 기반 API에서는 CSV, JSON, XML 같은 파일 형식의 데이터를 사용한다.

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

  1. 파이썬에서 JSON 객체 나타내기

JSON(JavaScript Object Notation)은 원래는 자바스크립트 언어를 위해 만들어졌지만 현재는 범용적인 포맷으로 사용된다. JSON의 구조는 파이썬의 딕셔너리와 리스트를 중첩해 놓은 것과 비슷하다. 예를 들어 “혼자 공부하는 데이터 분석” 이라는 도서명은 JSON 객체로 아래와 같이 나타낸다.

왼쪽의 “name”은 딕셔너리의 키로, 오른쪽의 “혼자 공부하는 데이터 분석”은 값으로 저장된다.

웹 기반 API로 데이터를 전달할 때는 딕셔너리 형식이 아닌 텍스트로 전달해야 한다. 파이썬에서는 json.dumps() 함수를 사용해서 딕셔너리를 JSON 형식에 맞는 문자열로 바꾼다.

기본적으로 json.dumps() 함수는 아스키 문자 외의 다른 문자를 16진수로 출력하기 때문에 한글이 깨져서 보인다. 이때 ensure_ascii 매개변수를 False로 지정하면 원래 저장된 문자를 그대로 출력할 수 있다.

  1. JSON 객체 파이썬에서 사용하기

JSON 문자열을 파이썬에서 사용하기 위해서는 다시 딕셔너리 객체로 변환해야 한다. 이때 json.loads() 함수를 사용한다.

문자열이 딕셔너리로 바뀐 것을 확인할 수 있다.

  1. 복잡한 형식의 JSON 객체 나타내기

이번에는 여러 항목에 있는 JSON 문자열을 json.loads() 함수에 직접 전달해 보자.

여러 개의 JSON 객체를 대괄호 안에 나열하면 하나의 JSON 배열로 나타낼 수 있다.


4. JSON을 데이터프레임으로 변환하기

이번에는 판다스 라이브러리의 read_json() 함수와 DataFrame() 함수를 사용해서 JSON 문자열을 데이터프레임으로 바꿔보자.

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

XML(Extensible Markup Language)은 컴퓨터와 사람이 모두 읽고 쓰기 편한 문서 포맷이다.

XML은 엘리먼트들이 계층 구조를 이루면서 정보를 표현한다. 엘리먼트는 시작 태그와 종료 태그로 감싼다. 태그<> 로 시작해서 </> 기호로 끝난다. 이때 시작 태그와 종료 태그의 이름은 같아야 한다.

위의 XML 예시에서 가장 상위 엘리먼트인 birds부모 엘리먼트 또는 부모 노드이다. 하위에 있는 owl id 엘리먼트는 birds 엘리먼트의 자식 엘리먼트라고 한다. owl id 하위에 있는 species, name, regionowl id 엘리먼트의 자식 엘리먼트다.

  1. XML을 파이썬 객체로 변환하기

파이썬의 xml 패키지의 fromstring() 함수를 사용해 XML 문자열을 파이썬 객체로 변환한다.

  1. 자식 엘리먼트 확인하기

fromstring() 함수가 반환하는 객체는 파이썬 객체가 아닌 Element 클래스의 객체이기 때문에 book에 대한 정보를 확인하기 위해서는 먼저 book의 자식 엘리먼트를 구한 다음, 각각의 자식 엘리먼트에 담긴 텍스트를 읽어와야 한다.

findtext() 메서드를 사용하면 해당되는 자식 엘리먼트를 탐색해서 자동으로 텍스트를 반환할 수 있다.

동일한 이름을 가진 여러 개의 자식 엘리먼트를 찾을 때는 findall() 메서드와 for문 을 같이 사용하면 편리하다.

API로 20대가 가장 좋아하는 도서 찾기

  1. API를 호출하는 URL 작성하기

공개 API를 사용하려면 호출 URL이 필요하다. 여기에서는 도서관 정보나루의 API를 사용한다. 호출 URL의 형식은 http로 시작하고, 발급받은 키, 파라미터로 구성된다. 알고 싶은 정보를 파라미터 값으로 지정한다.

[3. 인기대출도서 조회] 항목의 호출 URL 형식에서 데이터분석에 필요한 것들은 다음과 같다.

  • 호출 URL
http://data4library.kr/api/loanItemSrch?authKey=[발급받은키]&startDt=2022-01-01&endDt=2022-03-31&
gender=1&age=20&region=11;31&addCode=0&kdc=6&pageNo=1&pageSize=10
  • 파라미터
    • format: 지정하지 않으면 XML로 반환된다. 여기에서는 JSON 문서로 지정한다.
    • startDt: 검색 시작 일자, 2021년 4월 1일로 지정한다.
    • endDt: 검색 종료 일자, 2021년 4월 30일로 지정한다.
    • age: 연령대, 20으로 지정해서 20대 대출 도서를 조회한다.
    • autoKey: 인증키, 정보나루 사이트에서 인증키를 신청해서 받아야 한다.
  1. API 인증키 발급하기
http://data4library.kr/api/loanItemSrch?format=json&startDt=2022-04-01&endDt=2022-04-30&
age=20&authKey=[발급받은키]

위의 [발급받은키] 에 도서관 정보나루 사이트에서 받은 인증키를 붙여넣기하면 해당 API가 반환한 정보를 확인할 수 있다.

도서관 정보나루의 마이페이지의 인증상태가 ‘승인 대기 중’이라면 위와 같은 화면이 뜨고,

‘승인 완료(사용중)’ 이 되면 아래와 같은 화면을 확인할 수 있다. 이 API가 반환한 값은 JSON 형태이다. 여기서 대출 횟수를 나타내는 키는 loan_count 라는 것을 확인할 수 있다.

3. 파이썬으로 API 호출하기: requasts 패키지

공개 API에서 데이터를 자동으로 호출하려면 requests 패키지를 사용한다.

requests.get() 함수에 위의 url을 전달하고, json() 메서드로 웹 서버로부터 받은 JSON 문자열을 파이썬 객체로 변환하여 반환한다.

  1. 필요한 정보만 추출 & 데이터프레임으로 보기 좋게 만들기

위 JSON 데이터를 확인해보면 실제 도서 정보는 response > docs > doc 키에 매핑된 딕셔너리에 들어있다.

따라서 doc 키에 들어있는 도서 정보를 추출하기 위해서는 data['response']['docs'] 리스트를 순회해야 한다.

우리가 필요한 도서 정보에 대한 리스트가 잘 추출되었다. 이 리스트를 데이터프레임으로 변환하면 최종 결과는 아래와 같다.


더 알아보기

직렬화(serialization)과 역직렬화(deserialization)

HTTP 프로토콜로 데이터를 전송하기 위해서는 먼저 객체를 텍스트로 변환해야 한다. 이렇게 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환하는 것을 직렬화라고 하고, 직렬화된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것을 역직렬화라고 한다. 파이썬에서는 json.dumps() 를 사용해 JSON 데이터를 직렬화하고, json.loads() 로 역직렬화한다.

XML을 판다스 데이터프레임으로 변환하기

read_xml() 함수를 사용하면 XML을 데이터프레임으로 변환할 수 있다. (판다스 1.3.0 버전부터 사용 가능)

HTTP GET과 HTTP POST

웹 브라우저가 웹 서버에 요청을 할 때 URL로 파라미터 값이나 데이터를 전달할 수 있다. 이를 GET 방식이라고 한다. ? 뒤에 연결된 파라미터와 값들은 쿼리스트링이다.

웹에 보낼 수 있는 최대 URL 길이는 2000자 이내이다. 만약 이보다 긴 데이터를 보내야 하는 경우는 HTTP POST 방식을 사용한다. 이 방식은 URL 뒤에 파라미터나 값을 보내지 않고 HTTP 프로토콜 안에 있는 별도의 공간에 데이터를 실어 보내기 때문에 길이 제약이 없다.

profile
프론트엔드 기술면접 공부중

0개의 댓글