안녕하세요. 언제나 휴일에 언휴예요.
데이터 분석을 하기 위해서 분석할 데이터가 있어야겠죠.
현실 세계의 데이터를 프로세스에서 수집하기 제일 적합한 곳이 웹 환경이라 생각합니다.
대량의 규칙적인 형태로 자료를 제공하는 Open API를 이용하는 것도 좋은 방법이겠죠.
이번 강의에서는 Kakao에서 제공하는 도서 검색 REST API를 이용하여 데이터를 수집할 거예요.
수집한 데이터는 CSV로 저장합시다.
1 2 3 4 5 |
Kakao 도서 검색 API 요청 방법 확인하기 (코무) Kakao API를 이용한 웹 크롤링 수집한 정보를 data.frame으로 변환하기 수집한 정보를 csv 파일에 쓰기 오류 해결하기 수집한 정보를 csv 파일에 쓰기 |
Kakao 도서 검색 API 요청 방법 확인하기
“카카오 개발자 센터>문서>>Daum 검색>개발 가이드>책 검색” 순으로 선택하세요.
도서 검색을 어떻게 요청하고 결과는 어떠한 형태인지 제공하고 있습니다.

검색 질의( query)는 필수 요건이고 정렬 방법(sort)이나 결과 수(size), 결과 페이지(page), 검색 필드 제한(target)을 인자로 전달할 수 있다는 것을 알 수 있습니다.
Sample을 보면 요청 방법과 응답 예를 보여주고 있어요.
다음은 “R언어”로 요청하였을 때의 요청 방법입니다.
1 2 3 |
curl -v -X GET "https://dapi.kakao.com/v3/search/book?target=title" \ --data-urlencode "query=R언어" \ -H "Authorization: KakaoAK 발급받은 REST API 키" |
요청할 때 쿼리 문자열 외에 발급받은 REST API 키를 헤더에 추가해야 하는 것을 알 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
쿼리 문자열이란? 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언어”로 요청하였을 때의 결과 샘플입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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를 이용한 웹 크롤링
먼저 쿼리 문자열을 작성할게요.
1 2 3 4 5 6 |
> 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 라이브러를 사용할게요.
1 2 3 4 5 6 7 8 9 |
> 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 형식임을 알 수 있습니다.
먼저 문자열로 변환합니다.
1 2 3 |
> class(resp) [1] "response" > resp.str = as.character(resp) |
jsonlite 라이브러리에 fromJSON 함수를 이용하여 Json 문자열을 변환합니다.
변환 후에 타입을 확인하면 list임을 알 수 있어요.
이를 다시 data.frame으로 변환하세요.
1 2 3 4 5 |
> library(jsonlite) > d= fromJSON(resp.str) > class(d) [1] "list" > df = data.frame(d) |
df의 컬럼 정보를 확인해 보세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
> 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로 변환해 보세요.
1 |
> df2 = as.matrix(df) |
수집한 정보를 csv 파일에 쓰기
matrix로 변환한 df2를 기록하세요.
1 |
> write.csv(df2,'data.csv') |
이상으로 Kakao API를 이용하여 데이터를 수집하고 CSV 파일로 저장하는 강의를 마칠게요.