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)
----------------------------------------------------

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



2019年11月23日土曜日

◆インフルエンザの流行が始まったようです:今年は流行の始まりが早いようです

インフルエンザの定点観測データ(観測地点当たりの数の推移):第45週まで
国立感染症研究所のホームページに、インフルエンザの流行についての週ごとのデータがあります。毎年、第36週(8月末~9月初旬)から翌年の第35週までの1年間が「インフルエンザシーズン」とされていて、「2019-2020年シーズン」は、2019年9月2日から2020年8月30日までです。
「IDWR 2019年第44号」に「<注目すべき感染症>インフルエンザ」というリポートがありました。今年の流行の始まりが早いことがリポートされています。
国立感染症研究所のホームページから週ごとのデータをダウンロードして、グラフを作成してみました。
2019年の第45週(11/4~11/10)では、「全国的な流行開始の通常の指標である1.00」を超えていて、ここ数年と比べて19年は流行の始まりが早い様子がうかがえます。
第45週のデータ(2009年~2019年)です。2009年は秋から流行が見られ、かなり他の年との違いが大きかったことがわかります。
2018年、2019年の1月、2月ごろは数が多かったようです。2009年からグラフ化すると、線が多くて見づらいため、2015年からのデータのグラフも作成しています。
36週から45週についてスケールを変えてみると、2019年の第45週では1を超えていて、ここ数年と比べて19年は流行の始まりが早ようです。
なお、第37週、第38週で1を超えていたのは、沖縄県での数が多かったからのようです。

第46週の都道府県別の「定点当たり観測数」によって、都道府県を塗り分けてみました。「4以上、3以上、2以上、1以上、1未満」の5段階で塗り分けています。

2019年の第46週時点で、「警報レベル」になった都道府県はありません。詳細は、国立感染症研究所のページ(https://nesid4g.mhlw.go.jp/Hasseidoko/Levelmap/flu/new_jmap.html)で確認してください。
----------------------------------------------------

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