【R】Amazon 売れ筋ランキングの情報を取得する

RでAmazonの売れ筋ランキングの情報を取得する方法を紹介する。

URLの構造

URLは、以下のような構造になっているので、取得したいカテゴリを実際にアクセスして確認する。
1ページにつき50件となっており、50位以降を取得したい場合は、pgでページ数を指定する。

https://www.amazon.co.jp/gp/bestsellers/<カテゴリ>/?pg=<ページ>

例えば、本-ビジネス・経済のURLは、下記のように作成する。

category <- "books/466282"
pg <- 1
url <- sprintf("https://www.amazon.co.jp/gp/bestsellers/%s/?pg=%s", category, pg)

次に、作成したURLからHTMLを取得する。
スクレイピングには、{rvest}パッケージを利用する。

library(tidyverse)
library(rvest) 

UserAgentを設定してランキングページの情報を抽出。

UA <- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
res <- html_session(url, httr::user_agent(UA))

HTMLの構造を確認しながら、下記の情報を取得する。

・ランク
・商品名
・URL
・金額
・サムネイル
・レビュー
・レビューの件数

ランクの抽出

ranks <- res %>%
 html_nodes(".zg-badge-text") %>%
 html_text()

商品名の抽出

item_names <- res %>%
 html_nodes(".p13n-sc-truncate") %>%
 html_text() %>%
 stringi::stri_trim()

詳細ページのリンクの抽出

item_node <- res %>%
       html_nodes(".a-list-item")
urls <- sapply(item_node, function(x){
 a <- x %>% html_nodes(".a-link-normal") %>%
   html_attr("href")
 a[1]
})
urls <- sprintf("https://www.amazon.co.jp%s", urls)

金額の抽出

1商品に対して、下限と上限の金額が存在するケースがあるため「 - 」で結合する。

prices <- sapply(item_node, function(x){
 paste(x %>% html_nodes(".p13n-sc-price") %>% html_text(), collapse = " - ")
})

サムネイルの抽出

thumbnails <- res %>%
 html_nodes(".a-spacing-small") %>%
 html_children() %>%
 html_attr("src")

レビューの抽出

5つ星のうちXXとなっているので、削除して数字に変換する。

review_scores <- sapply(item_node, function(x){
 a <- x %>%
   html_nodes(".a-icon-alt") %>%
   html_text()
 ifelse(is_empty(a), NA, a)
})
review_scores <- as.numeric(gsub("5つ星のうち", "", review_scores))

レビュー件数の抽出

「,」を削除して数字に変換する。

review_nums <- sapply(item_node, function(x){
 a <- x %>%
   html_nodes(".a-icon-row") %>%
   html_nodes(".a-size-small") %>%
   html_text()
 ifelse(is_empty(a), NA, a)
})
review_nums <- as.numeric(gsub(",", "", review_nums))

ランキングのデータフレームを作成

ranking_data <- tibble(
 rank = ranks,
 item_name = item_names,
 price = prices,
 url = urls,
 thumbnail = thumbnails,
 review_score = review_scores,
 review_num = review_nums
)
ranking_data

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


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