본문 바로가기

R 크롤링

[R] 디아블로3 API(6): 직업별 상위 100위 아이템 히스토그램

반응형

##작성자: 춤추는초코칩

##작성일: 2018-03-24

##작성내용: 직업별 분포 구하기


첫번째날: 디아블로3 개발자 사이트 가입하기

두번재날: 바바리안 랭커 배틀태그, 히어로아이디 수집하기

세번째날: 바바리안 1위 랭커 아이템 확인하기

네번째날: 바바리안 상위 100위 랭커 세팅 분포 확인하기

다섯번째날: 직업별 대균열 순위 분포도


지난 시간에 404 에러 확인하는 함수를 찾지 못해서 잠깐 옆길로 새서 직업별 대균열 순위를 알아 봤습니다.

구글링 결과 R에서 404 에러를 확인하는 방법을 검색해보니 "httr" 라이브러리를 찾았습니다.

https://stackoverflow.com/questions/23139357/how-to-determine-if-a-url-object-in-r-base-package-returns-404-not-found

그리고 기존 명령문을 정리해서 사용자정의 함수로 만들었습니다.


library(rvest)

# 404 error check

library(httr)


## 1. 배틀태그, id 수집 사용자 정의 함수

rank.function <- function(job){

  rank <- paste("https://kr.diablo3.com/ko/rankings/season/13/rift-",job,sep="")

  rank_html <- read_html(rank)

  rank_html <- html_nodes(rank_html,'.battletag')

  rank_href <- html_nodes(rank_html, 'a') %>% html_attr('href')

  job_bt <- matrix(unlist(strsplit(rank_href,"/")),ncol=1000)[4,]

  job_id <- matrix(unlist(strsplit(rank_href,"/")),ncol=1000)[6,]

  job_rank <- cbind(job_bt,job_id)

  return(job_rank)

}


## 1-1. 배틀태그, id 수집

baba_rank <- rank.function(job="barbarian")

cru_rank <- rank.function(job="crusader")

dh_rank <- rank.function(job="dh")

monk_rank <- rank.function(job="monk")

nec_rank <- rank.function(job="necromancer")

wd_rank <- rank.function(job="wd")

wiz_rank <- rank.function(job="wizard")


## 2. 아이템 정보 수집 사용자 정의 함수

item.function <- function(job_rank){

  # 아이템 부위 정보

  item_type <- c("head", "neck", "torso", "shoulders", "legs", "waist", "hands", "bracers", "feet", "leftFinger", "rightFinger", "mainHand", "offHand")

  # 수집할 랭커 순위

  item_name <- matrix(rep("",1300), nrow=100)

  for (i in 1:100) {

    item_url <- paste("https://kr.api.battle.net/d3/profile/",job_rank[i,1],"/hero/",job_rank[i,2],"/items?locale=ko_KR&apikey=geyghwgrgtecgkd33abx3kver8tj3v3p", sep="")

    # 404 에러가 있으면, "Not Found", 없으면 "OK"

    if(http_status(GET(item_url))$reason=="OK"){

      item_url <- read_html(item_url)

      for (j in 1:13){

        item_name[i,j] <- unlist(strsplit(substr(item_url,regexpr(item_type[j],item_url),regexpr(item_type[j],item_url)+100),"\""))[9]

      }

    }

  }

  return(item_name)

}    


이제 신나게 아이템 정보를 수집하면 됩니다. 마음은 신나지만 시간은 오래 걸려요. ㅠ.ㅠ

마음같아서는 1000위를 다 수집하고 싶지만 귀찮아서. ^^;;

## 2-1. 아이템 정보 수집

baba_item <- item.function(baba_rank)

cru_item <- item.function(cru_rank)

dh_item <- item.function(dh_rank)

monk_item <- item.function(monk_rank)

nec_item <- item.function(nec_rank)

wd_item <- item.function(wd_rank)

wiz_item <- item.function(wiz_rank)


## 3. 빈도분석 사용자정의 함수

item_dist.function <- function(job_item){

  head <- table(job_item[,1])

  barplot(head, ylim=c(0,50))

  return(data.frame(head))

}


## 3-1. 빈도분석

par(mfrow = c(2, 2))

item_dist.function(baba_item)

item_dist.function(cru_item)

item_dist.function(dh_item)

item_dist.function(monk_item)

item_dist.function(nec_item)

item_dist.function(wd_item)

item_dist.function(wiz_item)


자 이제 빈도분석결과를 보겠습니다.

야만용사는 레코르 41%, 불멸왕 23%를 차지하고 있으며,

성전사는 아크칸이 압도적인 70%를 차지하고 있습니다.

악마사냥꾼은 부정세트가 49%로 절반가량 차지하고 있으며,

수도사는 조 크린이 73%로 세팅이 하나로 정해져 있네요.

강령술사는 라트마 42%, 역병 46%로 나눠져 있고,

위기의 부두술사는 지옥니 40%, 아라키르 21%, 제람 19%, 비취 17%로 다양한 세팅이 있습니다.

마지막으로 마법사는 탈 라샤 41%, 불새 37%, 비르가 11%입니다.

현인로 파밍 중인 캐릭터가 있어서 정확하다고 말씀드리기 힘들 수도 있습니다만, 나름 의미 있는 자료라 생각됩니다.


막대 그래프로 살펴보겠습니다.

성전사랑 수도사는 하나의 세팅이 앞도적으로 많고, 

강령술사와 마법사는 2개의 세팅으로 나눠진 모습을 보입니다.

야만용사와 부두술사는 다양한 세팅을 즐기는 편인거 같고, 

악마사냥꾼은 부정셋이 보편적인 가운데 어둠셋이 뒤를 따르고 있는 모습이네요.


이제 어느정도 마무리 되었습니다.

물론 좀 더 추가적으로 막대 그래프도 좀 더 다듬고, 아이템 이름도 정리하면 좋겠지만 여기까지 하려고 합니다.

위의 코드를 실행하면 아이템 정보를 많이 가지고 오니까 더 추가적인 분석이 가능합니다.

여기서 좀 더 나아가서 스킬 정보도 가지고 오면 좋을 거 같습니다.


하지만 맨 처음 생각했던 거는 여기까지 입니다.

혹시 좀 더 진행하게 되면 다시 블로그 하겠습니다.

모두 즐겜 하세요. ^^~

반응형