【R】Amazon 商品レビューの抽出

前回は、RでAmazonの売れ筋ランキングから情報を取得する方法を紹介した。

今回は、その続きとして、任意の商品に関して、レビュー情報を取得する方法を紹介したい。

レビューの最初のページは、以下のようになっている。

https://amazon.co.jp/product-reviews/<商品識別番号>

商品識別番号は、書籍の場合は「ISBN」、それ以外は「ASIN」である。
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201889580

商品識別番号の抽出

商品識別番号は、商品詳細ページのURLのdp/XXX/ のXXXの部分である。
前回のランキングデータから抽出する。

ranking_data <- ranking_data %>%
 mutate(
   dp = stringr::str_match(url, "dp/([0-9a-zA-Z]+)/")[,2]
 )

ranking_data$dp

スクリーンショット 2021-02-02 21.23.14

今回は1位の商品についてレビュー情報を抽出する。

レビューページからレイティングとテキストを抽出

idがcm_r-review_list のノードにレビュー情報があるのでその部分を抜き出す。
classがa-icon-altのノードに「5つ星のうちXX」という形でレイティングが入っているので、抽出してレイティング部分だけ抜き出す。
classがreview-textのノードにレビュー本文があるので抽出。余計なスペースなどが入っているのでトリミングする。

review_url <- sprintf("https://amazon.co.jp/product-reviews/%s", ranking_data$dp[1])
review_html <- html_session(current_url, httr::user_agent(UA))

review_node <- review_html %>%
 html_nodes("#cm_cr-review_list") %>%
       html_nodes(".review")
rating <- review_node %>%
 html_nodes(".a-icon-alt") %>%
 html_text()
rating <- as.integer(stringr::str_match(rating, "[^0-9]+([0-9])")[,2])
review_text <- review_node %>%
 html_nodes(".review-text") %>%
 html_text() %>%
 stringi::stri_trim()

レビューページから次のページのURLを抽出

次のページがある場合、linkタグに設定されているのでそこから抽出する。

link_node <- review_html %>%
 html_nodes(xpath = "body/link")
cond <- html_attr(link_node, "rel") == "next"
html_attr(link_node, "href")[cond]

スクリーンショット 2021-02-02 21.28.44

再帰的にレビュー情報を抽出する

ここまでで、レイティング、レビュー本文、次のページのURLが取得出来た。
後は、これを再帰的に実行すれば全てのレビュー情報を抽出出来る。

まず、レビュー情報のデータフレームを返す関数を定義する。

createReviewDF <- function(review_html){
 review_node <- review_html %>%
   html_nodes("#cm_cr-review_list") %>%
   html_nodes(".review")
 rating <- review_node %>%
   html_nodes(".a-icon-alt") %>%
   html_text()
 rating <- as.integer(stringr::str_match(rating, "[^0-9]+([0-9])")[,2])
 
 review_text <- review_node %>%
   html_nodes(".review-text") %>%
   html_text() %>%
 stringi::stri_trim()
 
 tibble(
   rating = rating,
   review_text = review_text
 )
}

「次のページのURL」がなくなるまで繰り返し実行する。

review_url <- sprintf("https://amazon.co.jp/product-reviews/%s", ranking_data$dp[1])
review_html <- html_session(review_url, httr::user_agent(UA))
review_df <- createReviewDF(review_html)

while (T) {
 link_node <- review_html %>%
   html_nodes(xpath = "body/link")
 
 if ("next" %in% html_attr(link_node, "rel")) {
   Sys.sleep(1)
   cond <- html_attr(link_node, "rel") == "next"
   next_url <- html_attr(link_node, "href")[cond]
   review_html <- html_session(next_url, httr::user_agent(UA)) 
 } else {
   break
   
 }
 
 review_df <- review_df %>%
   bind_rows(createReviewDF(review_html))
}
review_df %>%
 mutate(
   review_text_head = stringr::str_sub(review_text, 1, 100)
 ) %>%
 select(rating, review_text_head)
 

スクリーンショット 2021-02-02 21.33.42


この記事が気に入ったらサポートをしてみませんか?