설치

R 설치

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

R Studio 설치

테스트

# 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)
  • RCurl - Provides functions to allow one to compose general HTTP requests and provides convenient functions to fetch URIs, get & post forms, etc. and process the results returned by the Web server.
  • httr - Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).
  • Many approaches for both reading and creating XML (and HTML) documents (including DTDs), both local and accessible via HTTP or FTP. Also offers access to an 'XPath' “interpreter”.

변수 선언

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"

참조