ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • R 크롤링 뽐뿌 (ppomppu) GET / POST + Selenium (셀레니움)
    R + Crawling (크롤링) 2020. 2. 23. 14:39

     

    크롤링에 필요한 패키지(package)와 라이브러리(library)는 아래와 같습니다

     

    install.packages(c("dplyr", "httr", "jsonlite", "rJava", "RSelenium", "stringr")

    • library(dplyr)
    • library(httr)
    • library(jsonlite)
    • library(rJava)
    • library(RSelenium)
    • library(stringr)

     

     

    뽐뿌 사이트를 크롤링 하도록 하겠습니다

    검색 키워드는 "갤럭시 폴드"로 하겠습니다

     

    http://www.ppomppu.co.kr/index.php

     

    뽐뿌

    사람이 좋아 함께하는 곳... 뽐뿌! 쇼핑특가, 휴대폰 정보의 중심지

    www.ppomppu.co.kr

     

     

    "갤럭시 폴드"를 검색합시다

     

     

     

    아래와 같은 검색 결과가 나옵니다

    커뮤니티/뉴스 뿐만아니라 전체 게시글을 크롤링하기 위해 <전체> 탭을 누릅시다

     

     

     

     

    바로 2번째 페이지로 가서 F12를 눌러서 정보를 확인합니다

     

    그리고 <Network>탭에서 가장 위 element를 누릅시다

    아래와 같이 정보가 보이지 않으면 F5(새로고침)을 해줍니다

     

     

     

     

    Header - General에서 필요한 정보는 Request URLRequest Method입니다

     

    아래로 내려가 Query String Parameter로 가서 정보를 확인합니다

     

     

     

    URL 정보도 확인합시다

     

    http://www.ppomppu.co.kr/search_bbs.php?search_type=sub_memo&page_no=2&keyword=%B0%B6%B7%B0%BD%C3+%C6%FA%B5%E5&page_size=20&bbs_id=&order_type=date&bbs_cate=1 

     

    "?"Request URLQuery String Parameter를 결합하는 역할을 합니다

     

    이를 분리하고 지금까지 얻은 정보를 종합하여 봅시다

     

     

     

    URL : http://www.ppomppu.co.kr/search_bbs.php 

     

    Query String(추가적 정보) : "&"로 분리

     

    1) search_type = sub_memo           

    2) page_no =2                                                  ## 2번째 페이지입니다

    3) keyword = (unable to decode value)          ## 키워드가 보이지 않지만 크롤링에는 문제없습니다 

    4) bbs_id = 

    5) order_type = date                                        ## 날짜순 정렬입니다 

    6) bbs_cate = 1

     

     

     

    이 정보를 바탕으로 HTTP 요청 및 응답 명령어(code)를 작성합니다

     

     

     

     

     

    #### HTTP 요청 및 응답

     

    첫 번째 페이지를 기준으로 작성해봅시다

    searchword <- "갤럭시 폴드"

     

     

      res_bb <- GET(url = "http://www.ppomppu.co.kr/search_bbs.php", 
                    query = list(search_type = "sub_memo", 
                                 page_no = 1, 
                                 keyword = searchword, 
                                 page_size = "20", 
                                 bbs_id = "",                      ## bbs_id: 에는 정보가 없는데, ""로 처리하면 됩니다
                                 order_type = "date", 
                                 bbs_cate = "1")) 

     

      

     

     

     

    크롤링의 큰 그림을 설명하겠습니다

     

    1) 해당 게시글을 링크를 수집한다 (중요)

    2) 수집한 링크에서 데이터(요소 : Element)를 찾아서 수집한다

     

     

     

     

    좀 더 풀어서 설명하면

     

    1) 1페이지의 링크를 수집

    2) 수집한 링크를 타고 가서 해당 요소를 수집

    3) for문(자동화)으로 검색한 결과 전체 크롤링

     

     

     

    그러면 1)에 따라 링크를 수집합니다

    링크를 수집하기 위해 element를 확인합니다

    F12에서 보이는 제일 왼쪽 위 아이콘(Ctrl + Shift + C)을 클릭하고 게시글 제목을 클릭합니다

     

    위 정보를 바탕으로 링크를 수집해봅시다

     

     

     

     

    ## 링크

    링크_bb <- c()                                                 ## 수집한 링크를 담을 빈 벡터 공간을 만듭니다

     

      링크.tmp <- res_bb %>%  
        read_html() %>% 

        html_nodes("span.title") %>%                ##링크 주소 바로 위에 있는 Element입니다 
        html_nodes("a") %>%                         
        html_attr("href") %>%                            ## href="링크주소"를 긁는 명령어입니다
        unique()                                                     ## 중복되는 링크를 제거해주는 함수입니다

     

    링크_bb <- append(링크_bb, 링크.tmp)

     

     

     

     

     

    뽐뿌는 링크를 수집하는 페이지에서 많은 정보를 크롤링 할 수 있습니다

    먼저 게시글이 어느 포럼에 속해있는지를 수집합니다

     

     

    위 정보를 바탕으로 포럼정보를 수집해봅시다

     

    element를 보시면 p.desc 아래로 포럼 뿐만 아니라, 조회수, 날짜, 공감(like), 비공감(dislike)가 보입니다

    코드를 조금만 바꾸면 되니까 전부 긁어봅시다

     

     

     

     

    ## 포럼

    포럼_bb <- c()                                                     ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다


      포럼.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(1)") %>%                 ## span에서 1번째 element(포럼)를 가져옵니다
        html_text()  
      

     

    if (length(포럼_res) == 0) {
      포럼_bb <- append(포럼_bb, "수동확인")
    } else {
      포럼_bb <- append(포럼_bb, 포럼.tmp)
    }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "포럼_bb" 벡터 공간에 저장합니다 

     

     

    ## 조회수

    조회수_bb <- c()                                                       ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다
       
      조회수.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(2)") %>%                ## span에서 2번째 element(조회수)를 가져옵니다
        html_text()  
       

    if (length(조회수.tmp) == 0) {
      조회수_bb <- append(조회수_bb, "수동확인")
    } else {
      조회수_bb <- append(조회수_bb, 조회수.tmp)
    }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "조회수_bb" 벡터 공간에 저장합니다 

     

     

    ## 날짜

     날짜_bb <- c()                                                      ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다


      날짜.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(3)") %>%            ## span에서 3번째 element(날짜)를 가져옵니다
        html_text()  
       

    if (length(날짜_res) == 0) {
      날짜_bb <- append(날짜_bb, "수동확인")
    } else {
      날짜_bb <- append(날짜_bb, 날짜.tmp)
    }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "날짜_bb" 벡터 공간에 저장합니다 

     

     

    ## 공감

    공감_bb <- c()                                                     ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다


      공감.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(4)") %>%        ## span에서 4번째 element(공감)를 가져옵니다
        html_text()  
       

    if (length(공감_res) == 0) {
      공감_bb <- append(공감_bb, "수동확인")
    } else {
      공감_bb <- append(공감_bb, 공감.tmp)
    ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "공감_bb" 벡터 공간에 저장합니다    

     

     

    ## 비공감

     비공감_bb <- c()                                            ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다

       
      비공감.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(5)") %>%    ## span에서 5번째 element(비공감)를 가져옵니다
        html_text()  
       
    if (length(비공감_res) == 0) {
      비공감_bb <- append(비공감_bb, "수동확인")
    } else {
      비공감_bb <- append(비공감_bb, 비공감.tmp)
     ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "비공감_bb" 벡터 공간에 저장합니다    

      

     

    추가적으로 제목도 수집해봅시다

     

    위 정보를 바탕으로 제목을 수집해봅시다

     

     

     

     

    ## 제목   

      제목.tmp <- res_bb %>%  
        read_html() %>%   
        html_nodes("span.title") %>%  
        html_nodes("a") %>%  
        html_text()  

      if (length(링크.tmp) == 0) { 
        제목_bb <- append(제목_bb, "수동확인") 
      } else { 
        제목_bb <- append(제목_bb, 제목.tmp) 
      }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "제목_bb" 벡터 공간에 저장합니다 

     

     

     

     

     

    마지막으로 댓글 수도 수집해봅시다

    위 정보를 바탕으로 댓글 수를 수집해봅시다

     

     

     

     

    ## 댓글수

    댓글수_bb <- c()                                                       ## 수집한 정보를 담을 빈 벡터 공간을 만듭니다

     

     댓글수_res <- res_bb %>%  
        read_html() %>%  
        html_nodes("small.comment-count") %>% 
        html_text()  
       
      댓글수_bb <- append(댓글수_bb,댓글수_res)          ## 빈 벡터공간에 수집한 정보를 넣습니다
      

    if (length(댓글수_res) == 0) {
      댓글수_bb <- append(댓글수_bb, "수동확인")
    } else {
      댓글수_bb <- append(댓글수_bb, 댓글수_res)
    }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "댓글수_bb" 벡터 공간에 저장합니다 

     

     

     

     

     

    뽐뿌에서는 운좋게 

     

    1) 1페이지의 링크를 수집

    2) 수집한 링크를 타고가서 해당요소를 수집

    3) for문(자동화)으로 검색한 결과 전체 크롤링

     

    1)단계에 상당히 많은 정보를 수집할 수 있었습니다

    그러면 2)단계로 가겠습니다

     

     

     

     

    수집한 링크를 타고가서

    "제목", "작성자", "본문" 그리고 "댓글"까지도 크롤링합시다

    크롤링한 페이지의 링크는 따로 저장하기 위해 "주소"로 저장합니다 

    크롤링 하기로한 element 이름으로 빈 벡터공간을 만듭니다

    작성자_bb <- c() 
    본문_bb <- c() 
    댓글_bb <- c() 
    주소_bb <- c()

     

     

     

     

    ## RSelenium(셀레니움 작동) 

    명령프롬프트를 키고

    1) cd C:\r_selenium
    2) java -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-4.0.0-alpha-1.jar -port 4445를 입력합니다

     

     

    그리고 셀레니움을 작동합니다

    remDr <- remoteDriver(remoteServerAddr="localhost",  
                          port=4445L,  
                          browserName="chrome")


    remDr$open()

    셀레니움으로 정보를 수집하기전에 사전작업 하나를 합시다

     

     

    뽐뿌는 로그인을 하지 않으면 보지 못하는 글이 간혹 있습니다

    셀레니움으로 로그인 하도록 합시다

    네이버계정 기준입니다

     

     

     

    ※ 로그인 - 네이버계정

    element <- remDr$findElement("css", "span.smloginbtnbox > 
                                         a.loginsmbtn") 
    element$clickElement() 


    naver.lg <- remDr$findElement("css", "div.sns_login > 
                                          a:nth-child(3)") 
    naver.lg$clickElement() 


    id <- remDr$findElement("css", value="input#id")  
    id$sendKeysToElement(list("1125mirhan"))  

    Sys.sleep(time = 3)  

    pw <- remDr$findElement("css", value="input#pw")  
    pw$sendKeysToElement(list("zl5slglf"))  


    login <- remDr$findElement("css", value="input.btn_global")  
    login$clickElement() 

    로그인이 되시는 분들도 있고 안되시는 분들도 있을겁니다

    되지 않을 경우에는 그냥 셀레니움이 제어하는 페이지에서 로그인하시면 되겠습니다

     

     

     

     

     

    그러면 사전에 수집한 링크의 첫번째 페이지를 수집합니다

     

    링크_bb[1] = http://www.ppomppu.co.kr/zboard/view.php?id=news_life&no=19719&keyword=%B0%B6%B7%B0%BD%C3+%C6%FA%B5%E5

     

    갤럭시Z플립과 경쟁하는 ‘갤럭시S20 시리즈’ 사전예약 시 다양한 반값 및 사은품 혜택 알려 화제

    [스포츠서울 김종철기자] 삼성전자 갤럭시Z플립과 갤럭시S20 시리즈가 지난 12일 미국 샌프란시스코 언팩

    www.ppomppu.co.kr

     

    remDr$navigate(링크_bb[1])                         ## 링크_bb[1]에 할당된 URL를 탐색합니다
    body <- remDr$getPageSource()[[1]]           ## URL page Source를 가져옵니다
    body <- body %>% read_html()                   ## html를 읽어들입니다

     

     

     

     

     

    우리가 수집한 검색어 결과는 2가지로 나눌수 있습니다

     

    "뉴스"와 나머지 "포럼 글" 등"으로 나눌 수 있는데 페이지 구성이 조금 다릅니다 

    특히 "제목" 구성이 완전히 달라서 링크 수집할 때 제목도 같이 수집하였습니다

    크롤링에는 이처럼 유연한 대응이 필요한 것이 저의 생각입니다 

    그래서 이쪽 공부는 끝이 없다고 느껴집니다 :)

    (어느 학문이든 안그렇겠습니까만...)

     

     

     

    각설하고

    "뉴스"본문댓글로만 구성되어 있지만

    그 외 페이지본문, 댓글 그리고 작성자로 구성 되어있습니다

     

    즉 아래의 명령어를 실행하면 "뉴스" 페이지는

    작성자가 "수동확인"으로 들어갈껍니다

     

     

    작성자를 먼저 수집해봅시다

     

     

    ## 작성자     

        작성자.tmp <- body %>%  
          html_nodes("table.info_bg") %>%  
          html_nodes("td:nth-child(1)") %>%             ## td에서 1번째 element(작성자)를 가져옵니다
          html_nodes("font.view_name") %>%  
          html_text()  
         
        if (length(작성자.tmp) == 0) { 
          작성자_bb <- append(작성자_bb, "수동확인") 
        } else { 
          작성자_bb <- append(작성자_bb, 작성자.tmp) 
        }  ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "작성자_bb" 벡터 공간에 저장합니다 

     

     

    본문을 수집해봅시다

    조금 복잡하지만 어렵지는 않습니다

    아래의 스샷을 보면 "ID"나 "CLASS"가 없습니다;;

    그리고 본문의 일부분 밖에 안보입니다

     

    본문을 온전히 크롤링 하기 위해서는 

    본문의 부분 하나하나를 전부 긁어와야 합니다

    상위 element로 올라가봅시다

     

     

    상위 element에서 "ID"를 찾았습니다

    이 부분을 크롤링하면 하위 카테고리 element를 전부 불러옵니다

    별도의 추가작업 없이 본문 전체를 수집할 수 있습니다

     

     

     

     

    ## 본문

    본문.tmp <- body %>%  
          html_nodes("td.board-contents") %>%  
          html_text()  
         
        if (length(본문.tmp) == 0) { 
          본문_bb <- append(본문_bb, "수동확인") 
        } else { 
          본문_bb <- append(본문_bb, 본문.tmp) 
        } 
    ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "작성자_bb" 벡터 공간에 저장합니다 

     

    댓글을 수집해봅시다



      ## 댓글

     댓글.tmp <- body %>%  
          html_nodes("div.comment_line") %>%  
          html_nodes("div.han") %>%  
          html_text() %>% 
          unique() 

        if (length(댓글_bb) == 0) { 
          댓글_bb <- append(댓글_bb, "수동확인") 
        } else { 
          댓글_bb <- append(댓글_bb, 댓글.tmp) 
        } ## 수집한 정보가 없을경우 "수동확인", 제대로 수집한 경우는 "댓글_bb" 벡터 공간에 저장합니다 

              

     


     ## 주소

    주소_bb <- append(주소_bb, 링크_bb[i])            ## 수집한 링크를 저장합니다

     

     

     

     

     

     

    #### 수집 데이터 전처리

    본문_bb <- gsub("\n", "", 본문_bb)                 
    본문_bb <- gsub("\t", "", 본문_bb) 

    조회수_bb <- gsub("\\D", "", 조회수_bb)          ## \\D은 숫자를 제외한 모든 문자를 선택하는 정규표현식입니다 

    댓글_bb <- gsub("\n", "", 댓글_bb) 
    댓글_bb <- gsub("\t", "", 댓글_bb) 

    포럼_bb <- gsub("\\W","", 포럼_bb)   ## \\W은 알파벳 + 숫자 + _를 제외한 모든 문자를 찾는 정규표현식입니다

     

     

     

     

    #### 수집 데이터 data frame으로 저장 

    bbombbu_갤럭시폴드_본문 <- data.frame(포럼_bb, 제목_bb, 작성자_bb, 조회수_bb, 본문_bb, 공감_bb, 비공감_bb, 댓글수_bb, 주소_bb, 날짜_bb)   
    bbombbu_갤럭시폴드_댓글 <- data.frame(댓글_bb)  

    write.csv(bbombbu_갤럭시폴드_본문, file = "D:/bbombbu_갤럭시폴드_본문.csv", row.names=FALSE) 
    write.csv(bbombbu_갤럭시폴드_댓글, file = "D:/bbombbu_갤럭시폴드_댓글.csv", row.names=FALSE)

     

     

     

     

    #### for문으로 자동화하기(중요!!)

     

    첫 페이지 크롤링을 모두 완료하였습니다

    for문과 tryCatch( )를 사용하여 모든 페이지를 크롤링합니다

    아래의 R명령어로 검색결과 전체를 크롤링 및 전처리, csv로 저장 할 수 있습니다 


    n <- 120 

    searchword <- "갤럭시 폴드" 

    for(i in 1:n){ 
      tryCatch({ 
      res_bb <- GET(url = "http://www.ppomppu.co.kr/search_bbs.php", 
                    query = list(search_type = "sub_memo", 
                                 page_no = i, 
                                 keyword = searchword, 
                                 page_size = "20", 
                                 bbs_id = "", 
                                 order_type = "date", 
                                 bbs_cate = "1")) 
       
       
      cat('현재', i, '페이지 수집 중! 상태코드는', status_code(x = res_bb), '입니다.\n')  
          
       
       
      링크_bb <- c() 
       
      제목_bb <- c() 
      포럼_bb <- c() 
      조회수_bb <- c() 
      날짜_bb <- c() 
      공감_bb <- c() 
      비공감_bb <- c() 
      댓글수_bb <- c() 
       
       
       
      ## 링크 
       
      링크.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("span.title") %>% 
        html_nodes("a") %>% 
        html_attr("href") %>% 
        unique() 
       
      if (length(링크.tmp) == 0) { 
        링크_bb <- append(링크_bb, "수동확인") 
      } else { 
        링크_bb <- append(링크_bb, 링크.tmp) 
      } 
       
       
       
      ## 제목 
       
      제목.tmp <- res_bb %>%  
        read_html() %>%   
        html_nodes("span.title") %>%  
        html_nodes("a") %>%  
        html_text()  

      if (length(링크.tmp) == 0) { 
        제목_bb <- append(제목_bb, "수동확인") 
      } else { 
        제목_bb <- append(제목_bb, 제목.tmp) 
      } 
       
      


      ## 포럼 
       
      포럼.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(1)") %>%  
        html_text()  
       
      if (length(포럼.tmp) == 0) { 
        포럼_bb <- append(포럼_bb, "수동확인") 
      } else { 
        포럼_bb <- append(포럼_bb, 포럼.tmp) 
      } 
       
       
       
      ## 조회수 
       
      조회수.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(2)") %>%  
        html_text()  
       
      if (length(조회수.tmp) == 0) { 
        조회수_bb <- append(조회수_bb, "수동확인") 
      } else { 
        조회수_bb <- append(조회수_bb, 조회수.tmp) 
      } 
      


       
      ## 날짜 
       
      날짜.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(3)") %>%  
        html_text()  
       
      if (length(날짜.tmp) == 0) { 
        날짜_bb <- append(날짜_bb, "수동확인") 
      } else { 
        날짜_bb <- append(날짜_bb, 날짜.tmp) 
      } 
       
       
       
      ## 공감 
       
      공감.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(4)") %>%  
        html_text()  
       
      if (length(공감.tmp) == 0) { 
        공감_bb <- append(공감_bb, "수동확인") 
      } else { 
        공감_bb <- append(공감_bb, 공감.tmp) 
      } 
      


       
      ## 비공감 
       
      비공감.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("p.desc") %>% 
        html_nodes("span:nth-child(5)") %>%  
        html_text()  
       
      if (length(비공감.tmp) == 0) { 
        비공감_bb <- append(비공감_bb, "수동확인") 
      } else { 
        비공감_bb <- append(비공감_bb, 비공감.tmp) 
      } 
       
       
       
      ## 댓글수 
       
      댓글수.tmp <- res_bb %>%  
        read_html() %>%  
        html_nodes("small.comment-count") %>% 
        html_text()  
       
      if (length(댓글수.tmp) == 0) { 
        댓글수_bb <- append(댓글수_bb, "수동확인") 
      } else { 
        댓글수_bb <- append(댓글수_bb, 댓글수.tmp) 
      } 
       
      
       
      Sys.sleep(time = 1)    ## (중요!) 반복되는 작업으로 디도스(DDOS)로 오인 받지 않을려면 반드시 넣습니다!!
       
      }, error = function(e) cat("불러올 수 없습니다!\n"))





     


    ## 명령프롬프트 실행


    #cd C:\r_selenium 
    # java -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-4.0.0-alpha-1.jar -port 4445 

     


    ## RSelenium 

    remDr <- remoteDriver(remoteServerAddr="localhost",  
                          port=4445L,  
                          browserName="chrome") 
    remDr$open() 

     




    ## 로그인 - 네이버계정 

    remDr$navigate(링크_bb[1]) 

    element <- remDr$findElement("css", "span.smloginbtnbox > 
                                         a.loginsmbtn") 
    element$clickElement() 


    naver.lg <- remDr$findElement("css", "div.sns_login > 
                                          a:nth-child(3)") 
    naver.lg$clickElement() 


    id <- remDr$findElement("css", value="input#id")  
    id$sendKeysToElement(list("1125mirhan"))  

    Sys.sleep(time = 3)  

    pw <- remDr$findElement("css", value="input#pw")  
    pw$sendKeysToElement(list("zl5slglf"))  


    login <- remDr$findElement("css", value="input.btn_global")  
    login$clickElement()  



    작성자_bb <- c() 
    본문_bb <- c() 
    댓글_bb <- c() 
    주소_bb <- c() 



    ## for 문 

    for (i in 1:length(링크_bb)){ 
      tryCatch({ 
        remDr$navigate(링크_bb[i]) 
        body <- remDr$getPageSource()[[1]] 
         
        cat('현재', i, '페이지 수집 중! \n')  
         
        body <- body %>% read_html() 
         

        ##작성자 
         
        작성자.tmp <- body %>%  
          html_nodes("table.info_bg") %>%  
          html_nodes("td:nth-child(1)") %>%  
          html_nodes("font.view_name") %>%  
          html_text()  
         
        if (length(작성자.tmp) == 0) { 
          작성자_bb <- append(작성자_bb, "수동확인") 
        } else { 
          작성자_bb <- append(작성자_bb, 작성자.tmp) 
        } 
         
         
         
         
        ##본문 
         
        본문.tmp <- body %>%  
          html_nodes("td.board-contents") %>%  
          html_text()  
         
        if (length(본문.tmp) == 0) { 
          본문_bb <- append(본문_bb, "수동확인") 
        } else { 
          본문_bb <- append(본문_bb, 본문.tmp) 
        } 
         
         
         
        ##댓글 
         
        댓글.tmp <- body %>%  
          html_nodes("div.comment_line") %>%  
          html_nodes("div.han") %>%  
          html_text() %>% 
          unique() 
         
        if (length(댓글_bb) == 0) { 
          댓글_bb <- append(댓글_bb, "수동확인") 
        } else { 
          댓글_bb <- append(댓글_bb, 댓글.tmp) 
        } 
         
         
        ##주소 
         
        주소_bb <- append(주소_bb, 링크_bb[i]) 
         
         
        Sys.sleep(time = 1)    ##(중요!) 반복되는 작업으로 디도스(DDOS)로 오인 받지 않을려면 반드시 넣습니다!!
         
      }, error = function(e) cat("불러올 수 없습니다!\n")) 

     

     


    ## triming 

    본문_bb <- gsub("\n", "", 본문_bb) 
    본문_bb <- gsub("\t", "", 본문_bb) 

    조회수_bb <- gsub("\\D", "", 조회수_bb) 

    댓글_bb <- gsub("\n", "", 댓글_bb) 
    댓글_bb <- gsub("\t", "", 댓글_bb) 


    포럼_bb <- gsub("\\W","", 포럼_bb) 


     

     

    #### 수집 데이터 data frame으로 저장

         
    bbombbu_갤럭시폴드_본문 <- data.frame(포럼_bb, 제목_bb, 작성자_bb, 조회수_bb, 본문_bb, 공감_bb, 비공감_bb, 댓글수_bb, 주소_bb, 날짜_bb)   
    bbombbu_갤럭시폴드_댓글 <- data.frame(댓글_bb)  

    write.csv(bbombbu_갤럭시폴드_본문, file = "D:/bbombbu_갤럭시폴드_본문.csv", row.names=FALSE) 
    write.csv(bbombbu_갤럭시폴드_댓글, file = "D:/bbombbu_갤럭시폴드_댓글.csv", row.names=FALSE)

     

    뽐뿌 : 포럼, 제목, 작성자, 조회수, 본문, 공감, 비공감, 댓글수 , 주소, 날짜
    뽐뿌 : 댓글

     

     

    다음 포스팅은 GET/POST 방식으로만 뽐뿌(ppomppu)를 크롤링 하겠습니다

    댓글

R/Python은 겉치레가 아니야