반응형

     정보

    • 업무명     : R을 이용한 학술연구정보서비스 크롤링 및 클라우드 시각화

    • 작성자     : 이상호

    • 작성일     : 2020-11-10

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • 안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.

    • 다년간 축적된 경험 (기상학 학술 보고서 및 국/영문 학술 논문 게재, 블로그 운영, IT 회사 웹 개발 담당) 및 노하우를 바탕으로 개개인에게 맞춤형 솔루션을 수행할 수 있습니다.

    • 특히 재능 플랫폼 (크몽, 오투잡, 해피캠퍼스, 레포트 월드)에서 누구보다도 경쟁력 있는 가격으로 양질의 서비스를 제공하고 있습니다.

      • 아스키 형식의 텍스트 (text) 파일부터 과학자료 형식 (HDF, H5, NetCDF, Grib, Grb) 및 Data Base (DB) 자료까지 다양한 형태의 자료를 이용하여 수집, 전처리, 분석, 시각화해 드립니다.

      • 또한 웹 사이트에 대한 정보를 이용한 웹 크롤링 및 그에 따른 엑셀 및 DB 구축도 가능합니다.

      • 아울러 기초 통계 (빈도분포, Prired t-test, Wilcoxn 등)에서 지도/비지도 학습을 통한 회귀모형 구축에 이르기 까지 효율적인 통계 정보를 제공합니다.

      • 최근 대한민국의 후속위성인 천리안위성 2A호 웹 서비스 서브시스템 및 환경위성 2B호 통합 자료처리 서브시스템에 대한 웹 개발을 수행하였습니다.

    • 그리고 해솔 블로그에서는 다양한 기상학/천문학 정보와 더불어 사무 자동화/프로그래밍 언어를 소개하오니 방문 부탁드립니다.

    • 좋은 하루 보내세요.

     

    [재능플랫폼] 오투잡

     

    [IT개발 - 응용프로그래밍] 통계 분석, 데이터 분석, 시각화를 성실하게 해 드립니다. - 재능마켓 �

    판매가격:10,000원, [소개] - 데이터산업진흥원 데이터 가공 공급기업 선정 - 정보통신산업 진흥원 데이터 가공 공급기업 선정 - 다년간 축적된 경험 노하우를 바탕으로 개개인에게 맞춤형 솔루션�

    www.otwojob.com

     

    [재능플랫폼] 크몽

     

    데이터수집, 파싱, 크롤링 해 드립니다. | 50,000원부터 시작 가능한 총 평점 0점의 IT·프로그래밍,

    0개 총 작업 개수 완료한 총 평점 0점인 shlee1990의 IT·프로그래밍, 데이터분석·리포트, 데이터 마이닝·크롤링 서비스를 0개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터분석·리포트, 데

    kmong.com

     

     요청

    [세부 사항]

    • 학술연구정보서비스 접속

    • 키워드 검색에 따른 세부 정보 크롤링 (번호, 논문, URL, 저자, 주제어)

    • 주제어를 이용한 워드 클라우드 시각화

     

     완료

    [사용 OS]

    • Windows 10

     

    [사용 언어]

    • R v4.0.2

     

    [소스 코드]

    #===============================================================================================
    # Routine : Main R program
    #
    # Purpose : 재능상품 (크몽, 오투잡)
    #
    # Author : 해솔
    #
    # Revisions: V1.0 May 28, 2020 First release (MS. 해솔)
    #===============================================================================================
    
    library(RSelenium)
    library(rvest)
    library(stringr)
    library(tidyverse)
    library(data.table)
    library(foreach)
    library(httr)
    library(webdriver)
    library(seleniumPipes)
    library(readxl)
    library(foreach)
    library(ggwordcloud)
    library(wordcloud2)
    library(htmlwidgets)
    library(webshot)
    library(xlsx)
    
    # options(add.error.underscore=FALSE)
    
    setWindowTab = function(remDr, windowId) {
      qpath = sprintf("%s/session/%s/window", remDr$serverURL, remDr$sessionInfo[["id"]])
      remDr$queryRD(qpath, "POST", qdata = list(handle = windowId))
    }
    
    getXpathText = function(xpath) {
      remDr$getPageSource()[[1]] %>%
        read_html() %>%
        rvest::html_nodes(xpath = xpath) %>%
        rvest::html_text() %>%
        str_replace_all(pattern = "\n", replacement = " ") %>%
        str_replace_all(pattern = "[\\^]", replacement = " ") %>%
        str_replace_all(pattern = "\"", replacement = " ") %>%
        str_replace_all(pattern = "\\s+", replacement = " ") %>%
        str_trim(side = "both")
    }
    
    getCssText = function(css) {
      remDr$getPageSource()[[1]] %>%
        read_html() %>%
        rvest::html_nodes(css = css) %>%
        rvest::html_text() %>%
        str_replace_all(pattern = "\n", replacement = " ") %>%
        str_replace_all(pattern = "[\\^]", replacement = " ") %>%
        str_replace_all(pattern = "\"", replacement = " ") %>%
        str_replace_all(pattern = "\\s+", replacement = " ") %>%
        str_trim(side = "both")
    }
    
    
    remDr = remoteDriver(
      remoteServerAddr = "localhost"
      , port = 5002L
      , browserName = "chrome"
    )
    
    
    # 크롬 열기
    remDr$open()
    
    # 학술연구정보서비스 접속
    remDr$navigate("http://www.riss.kr/index.do")
    
    getHandle = remDr$getWindowHandles()
    setWindowTab(remDr, getHandle[[1]])
    
    searchVal = "SW 검색"
    
    remDr$executeScript(paste0("$('#query').val('", searchVal, "')"))
    
    # 검색 버튼
    remDr$findElement(using = "xpath", value = '//*[@id="fullpage"]/div[1]/div/div/div[1]/div/div[2]/form/fieldset/div[1]/div/button')$clickElement()
    
    
    # 학위논문 메뉴 이동
    remDr$findElement(using = "xpath", value = '//*[@id="tabMenu"]/div/ul/li[2]/a/span')$clickElement()
    
    
    # 목록 1000개씩 출력
    remDr$executeScript(paste0("$('#sortSelect2_top option:checked').val(1000);"))
    
    # 재조회
    remDr$executeScript("orderSearch('re_a_kor');")
    
    # 학위논문에 대한 논문 목록
    getPaper = getXpathText('//*[@id="divContent"]/div[2]/div/div[2]/div[2]/ul/li[*]/div[2]/p[1]/a')
    
    # 학위논문에 대한 논문 Url 목록
    getHref = remDr$getPageSource()[[1]] %>%
      read_html() %>%
      rvest::html_nodes(xpath = '//*[@id="divContent"]/div[2]/div/div[2]/div[2]/ul/li[*]/div[2]/p[1]/a') %>%
      rvest::html_attr("href")
    
    dataL1 = data.frame()
    
    foreach::foreach(i = 1:length(getPaper), .combine = c) %do% {
      getDetailPage = paste0("http://www.riss.kr/", getHref[i])
      remDr$navigate(getDetailPage)
    
      Sys.sleep(2)
    
      getWriter = getXpathText('//*[@id="soptionview"]/div/div[1]/div[2]/div[1]/ul/li[1]/div/p/a')[1]
      # 키워드 검색
      getTagInst = getCssText('div p .instituteInfo')
    
      getKeyword = data.frame(주제어 = getTagInst) %>%
        dplyr::filter(주제어 != getWriter)
    
      if (nrow(getKeyword) == 1) {
        getKeyword = stringr::str_split(getKeyword, ",") %>%
          unlist()
      }
    
      data = data.frame(
        "번호" = i
        , "논문" = getPaper[i]
        , "url" = getHref[i]
        , "저자" = getWriter
        , "주제어" = getKeyword
      )
    
      dataL1 = dplyr::bind_rows(dataL1, data)
    }
    
    
    dataL2 = dataL1 %>%
      dplyr::group_by(주제어) %>%
      dplyr::summarise(freq = n()) %>%
      dplyr::arrange(desc(freq)) %>%
      as.data.frame()
    
    ggplot(dataL2, aes(label = 주제어, color = 주제어)) +
      geom_text_wordcloud() +
      theme_minimal()
    
    fig = wordcloud2(data = dataL2)
    
    # html로 내보내기
    saveWidget(fig, "fig.html", selfcontained = FALSE)
    
    # 내보낸 html 페이지로부터 png 형태로 불러와서 저장
    webshot::webshot("fig.html", "Keyword.png", vwidth = 775, vheight = 550, delay = 10)
    
    # 출력
    xlsx::write.xlsx2(dataL1, file = "OUTPUT/o2job/Keyword.xlsx", sheetName = "키워드", append = TRUE, row.names = FALSE, col.names = TRUE)
    
    xlsx::write.xlsx2(dataL2, file = "OUTPUT/o2job/Keyword.xlsx", sheetName = "빈도분석", append = TRUE, row.names = FALSE, col.names = TRUE)

     

    [결과물]

    • 크롤링 결과

     

    Keyword.xlsx
    0.01MB

     

    • 워드 클라우드

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기