Kakao API를 이용한 데이터 수집 및 CSV로 저장하기 [데이터 분석 with R]

안녕하세요. 언제나 휴일에 언휴예요.

데이터 분석을 하기 위해서 분석할 데이터가 있어야겠죠.

현실 세계의 데이터를 프로세스에서 수집하기 제일 적합한 곳이 웹 환경이라 생각합니다.

대량의 규칙적인 형태로 자료를 제공하는 Open API를 이용하는 것도 좋은 방법이겠죠.

이번 강의에서는 Kakao에서 제공하는 도서 검색 REST API를 이용하여 데이터를 수집할 거예요.

카카오 개발자 센터 가입 및 내 애플리케이션 등록하기

수집한 데이터는 CSV로 저장합시다.

Kakao 도서 검색 API 요청 방법 확인하기 (코무)
Kakao API를 이용한 웹 크롤링
수집한 정보를 data.frame으로 변환하기
수집한 정보를 csv 파일에 쓰기 오류 해결하기
수집한 정보를 csv 파일에 쓰기

Kakao 도서 검색 API 요청 방법 확인하기

“카카오 개발자 센터>문서>>Daum 검색>개발 가이드>책 검색” 순으로 선택하세요.

도서 검색을 어떻게 요청하고 결과는 어떠한 형태인지 제공하고 있습니다.

그림 1. 카카오 도서 검색 Request

검색 질의( query)는 필수 요건이고 정렬 방법(sort)이나 결과 수(size), 결과 페이지(page), 검색 필드 제한(target)을 인자로 전달할 수 있다는 것을 알 수 있습니다.

Sample을 보면 요청 방법과 응답 예를 보여주고 있어요.

다음은 “R언어”로 요청하였을 때의 요청 방법입니다.

curl -v -X GET "https://dapi.kakao.com/v3/search/book?target=title" \
--data-urlencode "query=R언어" \
-H "Authorization: KakaoAK 발급받은 REST API 키"

요청할 때 쿼리 문자열 외에 발급받은 REST API 키를 헤더에 추가해야 하는 것을 알 수 있습니다.

쿼리 문자열이란?
    url 주소에 인자를 전달하여 요청하기 위한 문자열
형식
    url주소?인자목록
    인자는 key=value 형태를 지님
    인자와 인자 사이에 &로 구분
예
    url주소:https://dapi.kakao.com/v3/search/book
    인자 목록
        target: title
        query: R언어        
    쿼리문자열: https://dapi.kakao.com/v3/search/book?target=title&query=R언어

다음은 “R언어”로 요청하였을 때의 결과 샘플입니다.

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
  "meta": {
    "is_end": true,
    "pageable_count": 9,
    "total_count": 10
  },
  "documents": [
    {
      "authors": [
        "장기천",
        "강병진"
      ],
      "contents": "이 책은R언어로 짜는 금융프로그래밍 에 대해 다룬 이론서입니다. R언어 및 금융프로그래밍의 기초적이고 전반적인 내용을 학습할 수 있도록 구성했습니다.",
      "datetime": "2015-12-30T00:00:00.000+09:00",
      "isbn": "8997937391 9788997937394",
      "price": 25000,
      "publisher": "서울경제경영",
      "sale_price": 24000,
      "status": "정상판매",
      "thumbnail": "https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F1496529%3Ftimestamp%3D20200509123517",
      "title": "R언어로 짜는 금융프로그래밍",
      "translators": [
        ""
      ],
      "url": "https://search.daum.net/search?w=bookpage&bookId=1496529&q=R%EC%96%B8%EC%96%B4%EB%A1%9C+%EC%A7%9C%EB%8A%94+%EA%B8%88%EC%9C%B5%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D"
    },
    ...
  ]
}

Kakao API를 이용한 웹 크롤링

먼저 쿼리 문자열을 작성할게요.

> site_url = "https://dapi.kakao.com/v3/search/book"
> query = "R언어"
> query = URLencode(iconv(query,to="UTF-8"))
> query_str = sprintf("%s?target=title&query=%s",site_url,query)
> query_str
[1] "https://dapi.kakao.com/v3/search/book?target=title&query=R언어"

발급받은 REST API 키로 인증에 사용할 문자열을 작성하세요.

> kakao_api_key = “발급받은 REST API 키” > auth_key = sprintf(“KakaoAK %s”,kakao_api_key)

웹 요청을 위해 httr 라이브러를 사용할게요.

> library(httr)
> resp = GET(query_str,add_headers("Authorization"=auth_key))
> resp
Response [https://dapi.kakao.com/v3/search/book?target=title&query=R%EC%96%B8%EC%96%B4]
  Date: 2020-05-16 03:05
  Status: 200
  Content-Type: application/json;charset=UTF-8
  Size: 8.7 kB
{"documents":[{"authors":["장기천","강병진"],"contents":"▶ 이 책은R언어로 짜는 금융프로그래밍 ...

수집한 정보를 data.frame으로 변환하기

웹 요청 결과의 형식을 확인해 보면 response 형식임을 알 수 있습니다.

먼저 문자열로 변환합니다.

> class(resp)
[1] "response"
> resp.str = as.character(resp)

jsonlite 라이브러리에 fromJSON 함수를 이용하여 Json 문자열을 변환합니다.

변환 후에 타입을 확인하면 list임을 알 수 있어요.

이를 다시 data.frame으로 변환하세요.

> library(jsonlite)
> d= fromJSON(resp.str)
> class(d)
[1] "list"
> df = data.frame(d)

df의 컬럼 정보를 확인해 보세요.

> for(i in 1:length(df)){
+     print(names(df[i]))
+ }
[1] "documents.authors"
[1] "documents.contents"
[1] "documents.datetime"
[1] "documents.isbn"
[1] "documents.price"
[1] "documents.publisher"
[1] "documents.sale_price"
[1] "documents.status"
[1] "documents.thumbnail"
[1] "documents.title"
[1] "documents.translators"
[1] "documents.url"
[1] "meta.is_end"
[1] "meta.pageable_count"
[1] "meta.total_count"


수집한 정보를 csv 파일에 쓰기 오류 해결하기

df를 write.csv 함수를 호출하여 csv 파일에 기록하세요. 다음처럼 오류가 발생합니다.

Error in write.table(df, “data.csv”, col.names = NA, sep = “,”, dec = “.”, :
‘list’은 ‘EncodeElement’에서 구현되지 않은 유형입니다

matrix로 변환해 보세요.

> df2 = as.matrix(df)

수집한 정보를 csv 파일에 쓰기

matrix로 변환한 df2를 기록하세요.

> write.csv(df2,'data.csv')

이상으로 Kakao API를 이용하여 데이터를 수집하고 CSV 파일로 저장하는 강의를 마칠게요.