【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
今回は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]
再帰的にレビュー情報を抽出する
ここまでで、レイティング、レビュー本文、次のページの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)
この記事が気に入ったらサポートをしてみませんか?