Translate

2019年11月29日金曜日

◆「R」のコードの例です:楽天市場のワイヤレスイヤホンの商品レビューを全項目スクレイピングする場合

 楽天市場の商品レビュー(イヤホンで、6項目の評価がある場合)をスクレイピングする「R」のコードの例です。商品ページによって、「太字」の部分を書き換えて利用します。レビューのテキスト本文など、全項目のデータを取得できます。

 「.revRvwUserDisp」の属性で読み込まれるデータが広範囲過ぎるので、読み込んだ後で、不要な部分を削る処理をしています。

 デザインとか携帯性といった6項目の評価は、結局それぞれの評価の数字だけを残す形にしています。

 もっとよりよいスクレイピング方法があると思いますが、力量不足で対応できていません。もっとシンプルに、簡単に取り込める方法がないかどうかを模索中です。

いずれにしても、「R」のコードでデータを処理する方法では、Excelなどを一切利用せずに、データ取得、前処理、分析、グラフ作成まで一気通貫でできるのがいいです。


【Rのコード例】

url_txt <- "https://review.rakuten.co.jp/item/1/300683_10000223/"
pages_num <- 14
get_r_reviews  <- NULL
df_reviews   <- NULL
for(i in seq(1, pages_num, by = 1)) {
  url <- paste0(url_txt,i,'.','1/')
  page <- read_html(url)

  get_r_reviews <- page %>%
    html_nodes ('.hreview')  %>% 
    map_df(~list( name = html_nodes(.x, '.reviewer') %>%
                    html_text(.,trim = FALSE) %>%
                    {if(length(.) == 0) NA else .},
                  title = html_nodes(.x, '.summary') %>%
                    html_text(.,trim = FALSE) %>%
                    {if(length(.) == 0) NA else .},
                  stars = html_nodes(.x, '.value') %>%
                    html_text() %>%
                    {if(length(.) == 0) NA else .},
                  date = html_nodes(.x, '.dtreviewed') %>%
                    html_text() %>%
                    {if(length(.) == 0) NA else .},
                  reviews = html_nodes(.x, '.description') %>%
                    html_text(.,trim = FALSE) ,
                  helpful = html_nodes(.x, '.revEntryAnsNum') %>%
                    html_text(.,trim = FALSE) %>%
                    {if(length(.) == 0) NA else .} ,
                  age_sex = html_nodes(.x, '.revUserFaceDtlTxt') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(., "購入者|レビュー投稿.*|.*件","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  sex = html_nodes(.x, '.revUserFaceDtlTxt') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(., "購入者|レビュー投稿.*|.*件|.*代|以上","") %>%
                    str_replace_all(., "レビュー投稿.*","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  age = html_nodes(.x, '.revUserFaceDtlTxt') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(., "購入者|レビュー投稿|.*件|男性|女性","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  posts = html_nodes(.x, '.revUserFaceDtlTxt') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(., ".*代.*|購入者|レビュー投稿|件","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  デザイン = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン:|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感.*|音質.*|商品を使う人.*|購入した回数.*|商品の使いみち.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  携帯性 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性:|音漏れ防止.*|外音遮断性.*|フィット感.*|音質.*|商品を使う人.*|購入した回数.*|商品の使いみち.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  音漏れ防止 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止:|外音遮断性.*|フィット感.*|音質.*|商品を使う人.*|購入した回数.*|商品の使いみち:.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  外音遮断性 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性:|フィット感.*|音質.*|商品を使う人.*|購入した回数.*|商品の使いみち.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  フィット感 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感:|音質.*|商品を使う人.*|購入した回数.*|商品の使いみち.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  音質 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感.*|音質:|商品を使う人.*|購入した回数.*|商品の使いみち.*","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  usage1 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感.*|音質.*|トップス.*|商品を使う人.*|購入した回数.*|商品の使いみち:","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                  usage2 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感.*|音質.*|トップス.*|商品の使いみち.*|購入した回数.*|商品を使う人:","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                    str_replace_all(., " ","") %>%
                    str_trim(., side = "both") ,
                 usage3 = html_nodes(.x, '.revRvwUserDisp') %>%
                    html_text(.,trim = FALSE) %>%
                    str_replace_all(.,"デザイン.*|携帯性.*|音漏れ防止.*|外音遮断性.*|フィット感.*|音質.*|トップス.*|商品の使いみち.*|商品を使う人.*|購入した回数:","") %>%
                    str_replace_all(., "&nbsp;","") %>%
                   str_replace_all(., " ","") %>%
                   str_trim(., side = "both")
         ))

    df_reviews <- rbind(df_reviews, get_r_reviews)

    print(i)
 
    Sys.sleep(5)
}

write.csv(df_reviews,"rakuten_reviewsbose.csv")

df_r <- read.csv("rakuten_reviewsbose.csv",header = TRUE, na.strings=c("","NA"))

view(df_r)
----------------------------------------------------

---------------------------------------------------



0 件のコメント:

コメントを投稿