使用 rvest 从 meta 和按钮标签中抓取信息

Scrape information from meta and button tags with rvest

我正在尝试从葡萄酒卖家的页面上抓取平均用户评分(满分 5 星)和评分数量。我们的 5 个平均星数似乎在 button 标签中,而评分数在 meta 标签中。
这是 HTML:

<div class="bv_avgRating_component_container notranslate">
    <button
      type="button"
      class="bv_avgRating"
      aria-expanded="false"
      aria-label="average rating value is 4.5 of 5."
      id="avg-rating-button"
      role="link"
      itemprop="ratingValue"
    >
      4.5
    </button>
  </div>
  <div class="bv_numReviews_component_container">
    <meta itemprop="reviewCount" content="95" />
   &nbsp;
   <button
      type="button"
      class="bv_numReviews_text"
      aria-label="Read 95 Reviews"
      aria-expanded="false"
      id="num-reviews-button"
      role="link"
    >
      (95)
    </button>
  </div>

我尝试过的:

library(tidyverse)
library(rvest)

x <- "/wine/red-wine/cabernet-sauvignon/amici-cabernet-sauvignon-napa/p/20095750?s=918&igrules=true"
ratings <- read_html(paste0("https://www.totalwine.com", x)) %>% 
  html_nodes(xpath = '//meta[@itemprop="reviewCount"]') %>% 
  html_attr('content') #returns character(empty)

ratings <- read_html(paste0("https://www.totalwine.com", x)) %>% 
  html_nodes("meta") %>% 
  html_attr("content") #returns chr [1:33]

ratings <- read_html(paste0("https://www.totalwine.com", x)) %>% 
  html_nodes("div meta") %>% 
  html_attr("content") #returns chr [1:21]

ratings <- read_html(paste0("https://www.totalwine.com", x)) %>% 
  html_nodes("meta[itemprop=reviewCount]") %>% 
  html_attr("content") #returns character(empty)

归根结底,我要提取的两个点是 4.5content="95"

打开 Dev Tool 的网络选项卡并重新加载页面,您会看到此页面从 https://www.totalwine.com/product/api/product/product-detail/v1/getProduct/20095750-1?shoppingMethod=INSTORE_PICKUP&state=US-CA&storeId=918(这是一个 JSON 文件)加载数据: 通过此获取您想要的评分和评论数:

data <- jsonlite::fromJSON("https://www.totalwine.com/product/api/product/product-detail/v1/getProduct/20095750-1?shoppingMethod=INSTORE_PICKUP&state=US-CA&storeId=918")
rating <- data$customerAverageRating
reviews_count <- data$customerReviewsCount

更新: 如果您是 web-scraping 领域的新手,您可能想知道为什么我根本不使用 rvest。问题是,此页面使用 JS 生成内容,rvest 无法处理 JS,它只读取 JS 加载前的 HTML。