Table of Contents

설치

R 설치

https://cran.r-project.org/bin/windows/base/
위 링크에서 “Download R 3.2.3 for Windows” 다운로드

R Studio 설치

https://www.rstudio.com/products/rstudio/download/

테스트

# web crawling
library(RCurl)
library(httr)
library(XML)

# 연도별 곡
songs <- data.frame()
fail <- c()
for(year in c(1964:2014)) {
  print(year)
  url <- paste("http://www.melon.com/chart/age/list.htm?chartType=YE&chartGenre=KPOP&chartDate=", year, sep = "");
  doc <- htmlParse(url, encoding="UTF-8")
  titleNo <- xpathSApply(doc, "//tr[@class='lst50']/td[1]//input", xmlGetAttr, "value")
  
  lyricsList <- c()
  for(no in titleNo) {
    print(no)

    lyricsUrl <- paste("http://www.melon.com/song/popup/lyricPrint.htm?songId=", no, sep="")
    response <- GET(lyricsUrl)
    if(response$status_code != 200) { #fail
      fail <- c(fail, no)
      print(paste("가사 정보 조회 실패 : ", no))
      lyrics <- ""
    } else{
      lyricsDoc <- htmlParse(response, encoding="UTF-8")
      lyrics <- xpathSApply(lyricsDoc, "//div[@class='box_lyric_text']", xmlValue)
      lyrics <- gsub("[\r\n\t]", " ", lyrics) # line break를 지워주자.  
    }
    
    lyricsList <- c(lyricsList, lyrics)
  }
  
  songs.temp <- data.frame(year=year, no=titleNo, lyrics=lyricsList)
  songs <- rbind(songs, songs.temp)
}

songs$no <- as.integer(songs$no)
songs$lyrics <- as.character(songs$lyrics)

# 시각화를 해보자
library(KoNLP) # konlp 라이브러리를 사용한다. 
library(wordcloud)
library(RColorBrewer)

useSejongDic()
for(year in list(c(1964,1974), c(1975, 1984), c(1985, 1994), c(1995, 2004), c(2005, 2014))) {
  year.start <- year[1]
  year.end <- year[2]
  songs.year <- subset(songs, year > year.start & year <= year.end);
  nouns <- sapply(songs.year$lyrics, extractNoun, USE.NAMES=F)  
  wordcount <- table(unlist(nouns))
  pal <- brewer.pal(12, "Set3")
  pal <- pal[-c(1:2)]
  wordcloud(names(wordcount),freq=wordcount,scale=c(6,0.3),min.freq=25,random.order=T,rot.per=.1,colors=pal)
}

라이브러리

library(RCurl)
library(httr)
library(XML)

변수 선언

songs <- data.frame()
fail <- c()

songs라는 빈 데이터프레임과 fail이라는 비어있는 벡터 변수를 선언

첫번째 루프

for(year in c(1964:2014)) {
  print(year)
  url <- paste("http://www.melon.com/chart/age/list.htm?chartType=YE&chartGenre=KPOP&chartDate=", year, sep = "");
  doc <- htmlParse(url, encoding="UTF-8")
  titleNo <- xpathSApply(doc, "//tr[@class='lst50']/td[1]//input", xmlGetAttr, "value")
}

각 라인 별로 설명하면 아래와 같다.

for(year in c(1964:2014)) 

1964 부터 2014까지 year 변수에 값을 저장하여 루프를 돈다.

print(year)

year에 저장된 값을 출력

url <- paste("http://www.melon.com/chart/age/list.htm?chartType=YE&chartGenre=KPOP&chartDate=", year, sep = "");

“http~“로 시작하는 문자열 뒤에 year라는 변수의 값을 붙여 url 변수에 문자열을 저장한다는 의미이다. sep는 문자열을 붙일 때 이어 붙일 문자로 단순히 ”” 만 사용하였으므로 추가 문자는 없다. year 값이 2016이라면 위 문자열은 다음과 같이 만들어진다.

"http://www.melon.com/chart/age/list.htm?chartType=YE&chartGenre=KPOP&chartDate=2015"
doc <- htmlParse(url, encoding="UTF-8")

url에 있는 html 문서를 UTF-8 문자형으로 끌어와 doc에 저장

paste

R 언어는 문자열을 합치기 위해 paste() 함수를 사용 할 수 있다. 다음 예를 보자.

root_path <- "/home/wslee/doc"
game_dir <- "games"
game_name <- "witcher"
game_path <- paste(root_path, game_dir, sep="/")
game_path <- paste(root_path, game_name, sep="/")
print(game_path)

위와 같이 실행하면 아래와 같은 결과를 얻을 수 있다.

[1] "/home/wslee/doc/games/witcher"

참조