【问题标题】:Can't scrape all the rows using rvest无法使用 rvest 刮掉所有行
【发布时间】:2019-11-18 05:41:09
【问题描述】:

我的目标是从 bluenile.com 抓取所有这些钻石数据。我有一些似乎正在这样做的代码,但它只抓取前 61 行。

顺便说一句,我正在使用“SelectorGadget”chrome 插件来获取 CSS 选择器。如果我向下滚动一点,突出显示停止。和网站有关吗?

library('rvest')

le_url <- "https://www.bluenile.com/diamonds/round-cut?track=DiaSearchRDmodrn"
webpage <- read_html(le_url)

shape_data_html <- html_nodes(webpage,'.shape')
price_data_html <- html_nodes(webpage,'.price')
carat_data_html <- html_nodes(webpage,'.carat')
cut_data_html <- html_nodes(webpage,'.cut')
color_data_html <- html_nodes(webpage,'.color')
clarity_data_html <- html_nodes(webpage,'.clarity')

#Converting data to text
shape_data <- html_text(shape_data_html)
price_data <- html_text(price_data_html)
carat_data <- html_text(carat_data_html)
cut_data <- html_text(cut_data_html)
color_data <- html_text(color_data_html)
clarity_data <- html_text(clarity_data_html)

# make a data.frame
le_mat <- cbind(shape_data, price_data, carat_data, cut_data, color_data, clarity_data)
le_df <- le_mat[-1,]
colnames(le_df) <- le_mat[1,]

【问题讨论】:

    标签: css r web-scraping css-selectors rvest


    【解决方案1】:

    当您向下滚动页面时,数据会通过 API 调用动态添加。 API 调用有一个查询字符串,允许您指定startIndex(起始行)和每页的结果数(pageSize)。每页最大结果似乎是 1000。返回是 json,您可以从中提取所需的所有信息,包括总行数;通过countRaw 的密钥访问。因此,您可以请求初始 1000,解析出总行数 countRaw,然后执行循环,调整行 startIndex 参数,直到获得所有结果。

    您可以使用 json 解析器,例如jsonlite 来处理 json 响应。

    前 1000 个结果的示例 API 端点调用:

    https://www.bluenile.com/api/public/diamond-search-grid/v2?startIndex=0&pageSize=1000&_=1562612289615&sortDirection=asc&sortColumn=default&shape=RD&hasVisualization=true&isFiltersExpanded=false&astorFilterActive=false&country=USA&language=en-us&currency=USD&productSet=BN&skus=

    library(jsonlite)
    
    url <- 'https://www.bluenile.com/api/public/diamond-search-grid/v2?startIndex=0&pageSize=1000&_=1562612289615&sortDirection=asc&sortColumn=default&shape=RD&hasVisualization=true&isFiltersExpanded=false&astorFilterActive=false&country=USA&language=en-us&currency=USD&productSet=BN&skus='
    r <-  jsonlite::fromJSON(url)
    print(r$countRaw)
    

    您会从每次调用中获得一个包含 8 个元素的列表。 r$results 是一个包含主要关注信息的数据框。

    部分回复:


    鉴于指示的结果计数,我期望我可以做类似的事情(记住我有限的 R 经验):

    total <- r$countRaw
    url2 <- 'https://www.bluenile.com/api/public/diamond-search-grid/v2?startIndex=placeholder&pageSize=1000&_=1562612289615&sortDirection=asc&sortColumn=default&shape=RD&hasVisualization=true&isFiltersExpanded=false&astorFilterActive=false&country=USA&language=en-us&currency=USD&productSet=BN&skus='
    if(total > 1000){
      for(i in seq(1000, total + 1, by = 1000)){
        newUrl <- gsub("placeholder", i , url2)
        newdf <- jsonlite::fromJSON(newUrl)$results
        # do something with df e.g. merge
      }
    }
    

    但是,似乎只有前两个调用的结果,即上面显示的 r$results 的初始 df 然后:

    url2 <- 'https://www.bluenile.com/api/public/diamond-search-grid/v2?startIndex=1000&pageSize=1000&_=1562612289615&sortDirection=asc&sortColumn=default&shape=RD&hasVisualization=true&isFiltersExpanded=false&astorFilterActive=false&country=USA&language=en-us&currency=USD&productSet=BN&skus='
    r <-  jsonlite::fromJSON(url2)
    df2 <- r$results
    

    使用 css 选择器 .row 搜索页面会产生 1002 个结果,而不是指示的所有钻石总数;所以,我认为围绕过滤器需要进行一些探索。

    【讨论】:

    • 是的,网址出了点问题,因为我很快就收到了 HTTP 400 错误。
    猜你喜欢
    • 2016-05-29
    • 2015-09-10
    • 1970-01-01
    • 2015-04-15
    • 2020-04-14
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多