벌써 1월의 절반이 지나간다.

(아니 뭐했다고 1월이 반이나 끝난걸까요?)

패기롭게 시작한 혼공학습단 13기, 열정은 가득하지만 일과 대학원 준비를 병행하며 하니

쉬는시간이 아이스크림 녹듯이 없어졌다. 그래도 나름대로 얻는 성취는 가득하니 즐겁게 하게 되는 느낌이랄까.

 

1주차에서는 데이터 분석에 대한 이야기를 하고, 간단하게 파이썬 라이브러리와 사용을 해보았다.

2주차는 본격적으로 분석에 필요한 데이터를 수집한다. 데이터 수집 방법으로 가장 널리 알려진 'API'라는 것을 통해 데이터를 수집해보자.

1.  API

API(Apllication Programming Interface)는 간단히 말하면, 프로그램 간 소통 방법을 정의한 것이다. 기본적으로 사람과 다르게 컴퓨터는 정해진 규칙에 따라 정보를 주고 받는다. 예를 들면, 기상청의 API를 사용하면 기상청에서 제공하는 날씨 정보를 얻을 수 있다. 한마디로 사용자가 컴퓨터를 통해 정보를 처리하기 위해서는 원하는 정보 처리에 따른 규칙이 필요한데, 그것이 바로 API라고 생각하면 된다.

 

데이터 분석에 필요한 정보를 수집할 때도 API를 사용한다. 왜냐하면 기본적으로 데이터를 수집하기 위해서는 그것이 저장된 데이터베이스에 접근해야하는데, 데이터베이스에는 민감한 개인정보 등 관리가 엄격히 이루어지는 정보들이 있다. 그래서 대부분의 기업 등에서는 데이터베이스의 접근권한이 엄격하고, 함부로 접근할 수 없도록 한다. 또한, 물리적으로 네트워크가 연결되있지 않은 경우 데이터를 수집하기 어려울 수 있다. 그래서 이러한 문제를 해결하고자 API를 통해 데이터를 주고받는다.

2. 웹페이지 통신규약 : HTTP, HTML

 API 방식은 여러가지가 있는데, 그중에서 웹 기반 API를 많이 사용한다. 데이터 수집도 웹 기반 API를 사용하는데, 데이터를 수집하는 방식을 알기 위해서는 우선 웹페이지의 통신 방식을 이해해야 한다. 그 중 HTTP를 알아보자.

더보기

- HTTP(Hyper Text Transfer Protocol)

 

인터넷에서 웹페이지를 전송하는 기본 통신 방법. 웹사이트는 사용자가 웹 브라우저로 웹서버에 데이터를 요청하면 사이트를 운영하는 기업에서는 서버를 통해 해당 웹데이터를 HTML의 형태로 전송한다.  이때, 브라우저가 서버에 데이터를 요청하는 방법이 HTTP이다.

 

- HTML(Hyper Text Markup Language)

웹서버가 보내는 웹데이터의 한 종류. 웹페이지를 위한 표준언어이다. 쉽게 말하면 우리가 흔하게 보는 네이버 등의 모든 사이트는 서버를 통하여 웹사이트를 띄우기 위한 데이터를 보내는데, 이때 전송하는 데이터의 형식이 HTML이라는 것이다.

HTML는 다른말로 마크업 언어라고 부르기도 하는데, 간략하게 문법 구조를 설명하면 '태그(Tag)'라는 것을 사용한다.

3. CSV, JSON, XML

웹페이지를 주로 띄울때 보내는 데이터는 HTML 형식이라는 것은 이해가 된다. 그렇다면, 우리가 분석할 때 필요한 정보가 담긴 데이터도 HTML의 형식으로 주고 받을까?

 

데이터 분석에 필요한 데이터를 주고받을때는 주로 CSV, JSON, XML 이라는 형태로 제공한다. 왜냐하면 HTML의 경우에는 데이터의 구조가 상대적으로 복잡하기 때문이다. 데이터 분석을 하기 위해서는 분석가는 데이터를 수집한 뒤에 필요한 정보만을 추출해야하는데, 추출 하는 과정에서 데이터의 구조가 복잡하다면 데이터 추출과정에서 오류가 발생할 수 있기도 하다. 또한, 구조자체가 복잡하면 분석가가 이를 이해하는 시간도 오래 걸리는 이유도 있다.

 

그렇기 때문에 주로 우리는 CSV, JSON, XML이라는 형태로 서버에서 데이터를 제공한다. 왜냐하면 구조자체가 상대적으로 단순하고, 데이터의 호환성이 좋다.

더보기

- CSV(Comma-Separated Values)

'컴마로 분리된 값들' 단어의 뜻 그대로 CSV 파일 형식은 컴마, 세미콜론, 공백문자 등으로 데이터를 구분해놓은 방법이다. 즉, 텍스트 파일이기 때문에 데이터를 읽고 쓰기 용이한 형태이다. 그러나, 행별로 각 항목(열)의 개수가 맞지않으면 사용할 수 없다는 단점이 존재한다.

 

- JSON(JavaScript Object Notation)

자바스크립트 언어를 위해 만들어진 데이터 형식. 그러나 현재는 범용성이 높은 데이터로 사용된다. 즉, 자바스크립트 외에도 파이썬등 다양한 환경에서 읽을 수 있다. JSON 파일의 데이터는 key 값과 value값의 한쌍으로 된 paired data 형식이다. 파이썬에서 딕셔너리와 구조가 매우 흡사하다. 그렇기 때문에 파이썬에서는 JSON을 딕셔너리로 변환하여 처리가 가능하다.

 

- XML(eXtensible Markup Language)

HTML 언어의 경우 웹페이지를 표현하는데는 강점을 가지나 구조적이지 못한 단점으로, 데이터를 주고받는 API 에는 효율이 떨어진다. 그렇기 때문에 이를 보완하고자 만들어진 마크업 언어이다. XML 역시 마크업 언어이므로, 태그를 사용한다.

XML데이터 형식은 루트와 엘리먼트로 구분이 되고, 각 루트의 데이터를 엘리멘트로 하여 시작태그와 종료태그 사이에 넣어 구분한다.

 

JSON과 XML이 어떤 형식을 가졌는지 예제를 통해 살펴보자. 

예를 들어 도서명이 "혼자 공부하는 데이터 분석" 이고, 저자가 "박해선", 발행년도가 2022년도라고 하면 이에 대한 데이터는

다음과 같이 각각 표현할 수 있다.

#JSON
{ 
	"name" : "혼자 공부하는 데이터 분석",
	"author" : "박해선"
	"year" : 2022
}

#XML
<book>
	<name>혼자 공부하는 데이터 분석</name>
	<author>박해선</author>
	<year>2022</author>
</book>

 

JSON의 경우 도서명, 저자, 연도를 Key 값으로 하고 이에 해당하는 정보를 value 값으로 하여 paired data 로 표현 할 수 있다. 그리고 XML은 book 이라는 루트 안에 책의 정보를 엘리멘트로 하여 표현하고 있다.

 

 

3. API 사용하기_도서관 정보나루 

파일 형식에 대해서 어느정도 이해를 했으니, 이제 본격적으로 원하는 데이터를 API를 사용하여 수집하는 방법을 알아보자. 일단, API를 사용하기 위해서는 인증키가 필요한데, 도서관 정보나루 사이트를 예시로 알아보겠다.

 

우선 데이터를 API를 통해 요청하려면 인증키를 발급 받아야하는데, 회원가입 후 인증키를 발급 신청을 하면 다음과 같이 개인에게 인증키가 할당된 것을 볼 수 있다.

 

다음 인증키는 원하는 데이터를 수집하기 위해 API를 호출하는 URL에 사용된다. 우리는 인기대출도서의 데이터를 요청할 것이다. 도서관 정보나루 사이트의 [데이터 활용하기]에 들어가면 이를 요청하는 API가 나온다. 이를 호출하는 URL 형식은 다음과 같다.

위 링크에 [발급받은 키] 란에 우리가 앞서 발급받은 인증키를 대신 붙여넣고, 브라우저 주소창에 입력하면 우리가 원하는 데이터가 브라우저에 나타난다. 그런데, 발급받은 키 뒤에 써져있는 것은 어떤 의미를 갖고 있을까? 의미는 다음 표를 통해 알 수 있다.

file:///Users/ho/Downloads/%EB%8F%84%EC%84%9C%EA%B4%80%EC%A0%95%EB%B3%B4%EB%82%98%EB%A3%A8_API_Manual.pdf [도서관 정보나루 API 매뉴얼]

더보기

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

 

1. authKey:

API 호출을 위해 발급받은 인증키.

개인 또는 기관별로 고유하며 반드시 포함해야 함.

2. startDt / endDt:

조회 기간 지정(YYYY-MM-DD 형식).

2022-01-01부터 2022-03-31까지 데이터를 요청.

3. gender:

성별 필터.

1은 남성, 2는 여성.

4. age:

나이 필터.

20은 20대 데이터를 요청.

5. region:

지역 코드.

11;31은 서울(11)과 경기(31) 지역을 의미.

6. addCode:

추가 코드 필터.

0은 사용하지 않음을 의미.

7. kdc:

한국십진분류(KDC) 대분류 코드.

6은 기술과학 분야.

8. pageNo / pageSize:

페이지 번호와 결과 크기 지정.

1페이지, 최대 10건의 데이터를 요청.

 

결과

URL은 2022년 1월 1일부터 3월 31일까지 서울, 경기 지역 20대 남성이 대출한 기술과학(KDC 6) 분야 도서 데이터를 요청. 그 후 한 번에 최대 10건을 반환하며, 1페이지 결과를 제공한다.

인증키 뒤에 붙어있는 문자열을 '쿼리 스트링' 이라고 하는데, 즉 어떤 데이터를 요청할지에 대한 정보를 이를 통해 서버에 전달한다.

 

이제 호출 URL의 구조를 이해했으니 직접 데이터를 호출해보자.

파이썬에서 API를 사용하기 위해 지원하는 라이브러리가 있는데, 대표적으로 requests 패키지가 있다. 이를 사용하여 호출해보자.

import requests

url = "http://data4library.kr/api/loanItemSrch?authKey=[발급키 입력]&age=20&startDt=2021-04-01&endDt=2021-04-30&format=json"
r = requests.get(url)
data = r.json()
data
더보기

[출력결과] *일부만 발췌

{'response': {'request': {'startDt': '2021-04-01',
   'endDt': '2021-04-30',
   'age': '20',
   'pageNo': 1,
   'pageSize': 200},
  'resultNum': 200,
  'numFound': 5000,
  'docs': [{'doc': {'no': 1,
     'ranking': '1',
     'bookname': '우리가 빛의 속도로 갈 수 없다면 :김초엽 소설 ',
     'authors': '지은이: 김초엽',
     'publisher': '허블',
     'publication_year': '2019',
     'isbn13': '9791190090018',
     'addition_symbol': '03810',
     'vol': '',
     'class_no': '813.7',
     'class_nm': '문학 > 한국문학 > 소설',
     'loan_count': '492',
     'bookImageURL': 'https://image.aladin.co.kr/product/19359/16/cover/s972635417_1.jpg',
     'bookDtlUrl': 'https://data4library.kr/bookV?seq=5430429'}},
   {'doc': {'no': 2,
     'ranking': '2',
     'bookname': '달러구트 꿈 백화점 :이미예 장편소설',
     'authors': '지은이: 이미예',
     'publisher': '팩토리나인',
     'publication_year': '2020',

JSON파일 형태로 데이터가 잘 요청된 것을 확인 할 수 있다. 불러온 데이터는 그대로 사용하기 보다는 주로 데이터프레임의 형태 등 정보를 한눈에 알아보기 쉬운 형태로 자료의 구조를 변환한다. 

import pandas as pd

books = [d['doc'] for d in data["response"]["docs"]]
books_df = pd.DataFrame(books)

books_df
더보기
[출력결과]

4. 웹 스크래핑

우리는 API를 활용하여 데이터를 수집하는 방법을 배웠다. 하지만 만약, 수집하고자 하는데이터가 API가 없다면 어떻게 수집을 해야할까? 그런 경우에는 우리는 "웹 스크래핑" 이라는 방식을 통해 데이터를 수집한다. 말 그대로 웹사이트에서 표시한 정보를 긁어온다는 뜻이다.

대표적으로 뷰티풀수프 'BeautifulSoup" 라이브러리가 웹크롤링을 하는 것에 사용된다. 하지만 이를 사용하기 위해서는 어느정도 우리는 웹페이지에 대한 분석지식을 가지고 있어야한다. 즉, HTML에 대한 이해도가 필요하다는 것이다. 왜냐하면 이를 사용하기 위해서는 우리가 원하는 정보가 어디있는지 찾아야하며, 해당하는 정보가 어느 태그에 있는지 알아야한다.

 

더보기

[웹스크래핑 시 주의사항]

 

웹스크래핑을 하기 전, 우리는 항상 체크해야하는 주의사항이 몇가지가 있다.

 

1. 웹스크래핑이 가능한 사이트인지 확인

: 기본적으로 사이트들은 스크래핑이 가능한 페이지를 명시한 파일을 가지고 있다. 대표적으로 robots.txt 파일인데, 해당 파일은 웹스크래핑을 사용해도 되는 페이지 주소를 명시하고 있다. 즉, 이외의 페이지는 스크래핑을 할 수 없다는 소리이다.

 

2. HTML 태그를 특정할 수 있는지 확인

:우리가 필요한 정보가 담긴 태그를 알 수 없다면, 웹스크래핑을 사용하기 어렵다. 예를 들어 페이지를 HTML이 아닌 자바스크립트를 사용하는 경우가 있다. 그런 경우에는 고급 도구인 셀레니움(Selenium)과 같은 라이브러리를 활용해야한다.

 

5. [ 2주차 숙제 ] _ 확인문제 1번(p. 150)

1. 다음과 같은 데이터 프레임 df가 있을 때, loc 메서드의 결과가 다른 하나는 무엇인가요? 

  col1 col2
0 a 1
1 b 2
2 c 3

 

① df.loc[[0,1,2], ['col1', 'col2']]

② df.loc[0:2, 'col1':'col2']

③ df.loc[:2, [True, True]]

④ df.loc[::2, ['col1', 'col2']]

 

다른 세개는 출력값으로 예시의 데이터프레임 그대로 출력한다. 그러나, ④의 경우, 행데이터를 슬라이싱 하는 과정에서 첫행부터 마지막행까지 하나씩 건너뛰어서 출력하므로, 0번 행과 2번 행만을 출력한다.

 

 

 

+ Recent posts