Не могу очистить все строки, используя rvest - PullRequest
1 голос
/ 08 июля 2019

Моя цель - очистить все эти данные о бриллиантах от bluenile.com.У меня есть некоторый код, который, кажется, делает это, но он захватывает только первые 61 строку.

Кстати, я использую хромированный плагин " SelectorGadget " для получения 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,]

1 Ответ

2 голосов
/ 08 июля 2019

Данные динамически добавляются через вызов API при прокрутке страницы вниз. Вызов API имеет строку запроса, которая позволяет указать startIndex (начальная строка) и количество результатов на странице (pageSize). Максимальное количество результатов на странице составляет 1000. Возвращаемое значение - json, из которого вы можете извлечь всю необходимую информацию, включая общее количество строк; доступ через ключ countRaw. Таким образом, вы можете сделать запрос на начальные 1000, проанализировать общее количество строк countRaw и выполнить цикл, настраивая параметр строки startIndex, пока не получите все результаты.

Вы можете использовать анализатор json, например jsonlite для обработки ответа json.

Пример вызова конечной точки API для первых 1000 результатов:

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 - это информационный фрейм, содержащий информацию, представляющую основной интерес.

Часть ответа:

enter image description here


Учитывая указанный результат, я ожидал, что смогу сделать что-то вроде (учитывая мой ограниченный опыт 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
  }
}

Однако, похоже, что есть результаты только для первых двух вызовов, то есть начального df из r$results, показанного выше, а затем:

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 результата по сравнению с указанным общим количеством всех бриллиантов; поэтому я думаю, что есть некоторые исследования, связанные с фильтрами.

...