데이터 구축 마지막 단계
TODAY
- Kakao API(이미지 검색) + 찾은 image 파일로 저장
- Selenium을 이용한 동적 데이터 Crawling
TOMORROW
- 공공데이터포탈 (www.data.or.kr)
- 데이터 전처리
[KAKAO API(이미지검색)로 이미지 찾고 파일로 저장하기]
이미지 검색을 위한 kakao 데이터에 대한 이해가 선행되어야 함
Tip. 로직 보다는 함수활용에 집중하는 R로 진행 할 예정
이용 패키지 : HTTR
network연결을 통해 서버에 접속해 결과를 받아올 때 일반적으로 많이 사용하는 package
HTTR을 왜 사용할까?
앞서 영화진흥 위원회 Open API 데이터를 추출할 때에는 httr 대신 jasonlite 패키지의 from jason함수를 사용했다.
같은 Open API인데 서로 다른 패키지를 사용하는 이유는 무엇일까?
카카오 데이터는 Authorization을 위해 Header를 입력하는 등 인증서식이 복잡하기 때문이다!
from jason 은 데이터를 가져올 때 데이터 프레임으로 바로 가져오는 특성이 있다.
즉, header 안의 인증 코드를 넣기 위해 from jason 대신 httr을 이용해 jason데이터를 가지고 온 것이다.
단 data frame화 할 때 스텝 하나가 더 추가되는데, 추출한 자료를 content라는 httr의 함수를 사용해야
data frame형태로 가져올 수 있다.
1. Open API의 주소를 찾고 호출한다
kakao는 developer페이지에서 오픈 API를 제공하고 있음
이용법을 참고해서, url을 따오고, request url을 만든 뒤, R에서 이용하기 위해 URL을 한글 인코딩 해준다
2. Open API 이용 권한인 Key를 받는다
- Open API를 사용할 때 거의 대부분 인증절차를 거쳐야 사용할 수 있다.
- 키를 발급 받고 작성한다
3. 서버 호출 방식의 이해 및 활용
클라이언트가 서버쪽 프로그램을 호출할 때 몇 가지 "호출방식"이 있다.
기본적으로 총 4가지의 Rest 타입(모두를 이용하는 타입)
이 중에서도 일반 서버 호출에는 GET과, POST 중 한 가지 방식을 사용한다
(1) Get : 서버 프로그램에 호출 할 때 전달 데이터를 URL 뒤에 붙여 전달 (지금까지 활용한 방식)
- ?key=value
- 단점: 전송 데이터 사이즈에 제한이 있다 (URL의 길이가 유한하므로)
- 이미지, 파일의 대용량 데이터는 서버쪽에 데이터로 전달 할 수 없다 -> Post 또는 다른 방식 이용
(2) Post : 서버 프로그램을 호출할 때 전달 데이터가 request header에 붙어서 전달 된다
- request url뒤에 붙는게 아니라, 다른 방식으로 묶여서 전달 된다. (요청 헤더 안에 데이터를 붙여 전달)
(3) PUT :
(4) DELETE :
- Get 함수를 이용해보기
- get함수에 Header를 붙일방법을 구글링해서 API 입력방법을 확인
[중간정리]
Html/Selector/xPath 과 Open API/JASON
위에서 실습한 방법으로 데이터를 구축할 수 없는 상황이 있다.
그 상황을 설명하기에 앞서
지금까지 실습한 예시를 먼저 정리해 보자
첫 번째 예로, 우리는 네이버 영화 댓글 사이트와 Rotten Tomao를 이용했다.
클라이언트가 request 를 보내고 서버 프로그램이 요청을 받았다.
이어서 서버 프로그램이 html 페이지를 만들어서 클라이언트에게 response로 전달 했다.
그리고 클라이언트는 Selector와 xpath를 이용해서 전달된 Html내에 있는 필요한 Data를 추출했다.
두 번째 작업은 Open API를 이용한 데이터 구축 방식으로, KaKao 이미지 검색과 영화진흥 위원회의 OPEN API를 이용했다.
두 경우 모두 클라이언트(R)이 request를 보내고, 서버프로그램이 해당 요청을 받아 JASON 문자열을 결과값으로 생성하여 response를 전달했다. Jason 문자열이므로 xpath나 selector를 사용할 수 없었으므로, 대신 Data frame으로 결과를 받았다.
[Selenium을 이용한 동적 데이터 Crawling]
위에서 실습한 방법으로 데이터를 구축할 수 없는 상황이 있다.
: Open API를 사용하지 않는(공개되지 않는 API를 사용하는) AJAX 방식의 Web 페이지는
위의 방식으로 데이터를 가져올 수 없다
Why?
Open API가 아니면, 도서검색 프로그램과 같은 프로그램 코드를 공개하지 않는다.
외부사람들이 못 쓰도록 내부에 숨겨져 있기 때문에, 웹페이지만 공개가 되는 구조이다.
이런 웹페이지에는 데이터가 내재되어 있지 않다.
반드시 이용자가 검색을 수행해야 부분적인 결과를 띄울 수 있는 것이다.
따라서, 위에서 이용한 두가지 방식으로 데이터를 확보할 수가 없게 된다.
이런 데이터를 "동적 데이터"라고 한다
동적 데이터를 활용하기 위해서는 Selenium을 이용한다
일반적으로 가져오기 힘든 자료를 자동화 하여 가져올 수 있음
Selenium 사용 준비
- Selenium server grogram을 다운로드한다
서버쪽 자동화 도구로 java파일이다. 처음에 jdk를 깔았기 때문에 바로 설치 가능
브라우저를 제어해주는 역할을 한다.
- Selenium이 Chrome Browser를 자동으로 제어하게 된다
크롬과 함께 사용하기 위해서는 크롬 드라이버를 설치해야 한다
- 이 Chrome driver 프로그램을 selenium이 사용할 수 있도록 path 환경변수에 경로를 설정
크롬드라이버, 버전에 맞는 것을 다운 받아 압축 해제하고 경로를 컴퓨터 속성의 환경변수에 추가해준다.
- Selenium Server 가동 (cmd창)
cd 셀레니윰 파일 저장 주소
Java -jar 파일명 -port 4445
예제: Selenium을 적용해 R로 도서 프로그램 작동시켜보기
Selenium을 R에서 사용할 수 있게 도와주는 package 설치
CMD로 실행한 셀레니움을 거쳐 작동함
1. Selenium을 R에서 사용할 수 있게 도와주는 package 설치
2. 셀레니움을 이용해 자동 서버 접속
# Browser open
remDr$open()
# open 된 browser의 주소를 변경하라
remDr$navigate("http://localhost:8080/bookSearch/index.html")
3. 셀레니움이 키워드 검색 창을 찾아 자동으로 검색하게 만들기
(1) 텍스트 입력창 찾기
inputBox<-remDr$findElement(using="css", "[type=text]")
- 의미: css selector를 이용하여, type이 text인 것을 찾겠다
(2) 찾은 입력상자에 검색어를 넣기
inputBox$sendKeysToElement(list("여행"))
- 의미: 텍스트 입력창인 input box에 여행이란 키워드를 입력하라
- ist로 넣는 이유는 값을 여러 개 넣을 수 있기 때문
(3) 버튼찾기
- btn <-remDr$findElement(using="css",
"[type=button]")
(4) 찾은 버튼에 click event 발생
- btn$clickElement()
4. 셀레니움이 키워드 검색 창을 찾아 자동으로 검색하게 만들기
getwd()
setwd("C:/r_lecture/")
.libPaths("C:/r_lecture/lib")
install.packages("httr")
library(httr)
library(stringr)
#Open API의 주소를 알아야 호출한다
url <- "https://dapi.kakao.com/v2/search/image";
keyword <- "query=아이유";
request_url <- str_c(url,
"?",
keyword);
request_url <- URLencode(request_url)
# Open API 사용을 위한 인증절차
apikey <- "81efb179572cd6483fd49492cdbb66bb"
result <- GET(request_url,
add_headers(
Authorization=paste("KakaoAK",
apikey)))
http_status(result) # 접속상태 결과
result_data <- content(result) # httr패키지가 결과내용을 추출하는 함수
result_data;
View(result_data)
####thumnail 주소 가져오기 ###
for (i in 1:length(result_data$documents)){
req[i] = result_data$documents[[i]]$thumbnail_url
}
#### thumnail 주소로 이미지 컴퓨터에 저장하기
for (i in 1:length(result_data$documents)){
req = result_data$documents[[i]]$thumbnail_url
res = GET(req) # 이미지에 대한 응답
imgData = content(res,"raw")
#결과로 받은 이미지를 raw형태로 추출. binary data
# (동영상, pdf, 이미지) 형태로 얻기위해 반드시 필요
writeBin(imgData,
paste("C:/r_lecture/image/img",
i,
".png"))
# img1.png
}
####header 안의 인증 코드를 넣기 위해 from jason 대신
####httr을 이용해 jason데이터를 가지고 온 것
####from jason 은 데이터를 가져올 때 데이터 프레임으로 바로 가져오는 특성
###httr은 content를 사용해야 data frame형태로 가져올 수 있다.
###############################################################
# Selenium을 이용한 동적 page scraping
# Selenium을 R에서 사용할 수 있게 도와주는 package 설치
install.packages("RSelenium")
library(RSelenium)
# R 프로그램에서 Selenium Server에 점속한 후
# remote driver 객체를 return 받는다
remDr <- remoteDriver(remoteServerAddr ="localhost",
port=4445,
browserName = "chrome")# R셀레니움이 가지고 있는 접속 함수)
remDr
# 접속이 성공하면 remote driver를 이용해서
# chrome brower를 R code로 제어할 수 있다
# Browser open
remDr$open()
# open 된 browser의 주소를 변경하라
remDr$navigate("http://localhost:8080/bookSearch/index.html")
#입력상자를 찾아라
# css selector를 이용하여, type이 text인 것을 찾겠다
inputBox<-remDr$findElement(using="css",
"[type=text]")
#찾은 입력상자에 검색어를 넣기
inputBox$sendKeysToElement(list("여행"))
# list로 넣는 이유는 값을 여러 개 넣을 수 있기 때문
#AJAX호출을 하기 위해 버튼을 먼저 찾아야 한다
btn <-remDr$findElement(using="css",
"[type=button]")
# 찾은 버튼에 click event 발생
btn$clickElement()
# AJAX 호출이 발생해서 출력된 화면에 필요한 내용 추출
li_element <- remDr$findElements(using="css",
"li")
# 이렇게 얻어온 element 각각에 대해 함수를 호출
myList <- sapply(li_element,function(x){
x$getElementText()
})
# sapply : 적용함수. 요소 각각에 대해 함수를 적용한다
# myList : 리스트로 도출됨
myList
for(i in 1:length(myList)){
print(myList[[i]])
}
'데이터사이언스' 카테고리의 다른 글
191101 [데이터조작] Package 함수를 이용한 data frame 조작 (0) | 2019.11.01 |
---|---|
학습 개요 (10월 11월) (0) | 2019.10.31 |
191030 [데이터구축] R을 이용한 Web Crawling (0) | 2019.10.30 |
191029 [데이터구축_준비] AJAX Json 데이터-웹 프로그래밍 (0) | 2019.10.29 |
191028 (3) [데이터구축_준비}JQuery-Method (0) | 2019.10.28 |