Выскабливание пакетами Rvest и Glue специально для R - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь очистить несколько страниц спортивных данных, используя пакеты rvest и glue. У меня проблемы с вложенностью, и я думаю, что это потому, что таблица на сайте имеет двухстрочный заголовок (некоторые заголовки - одна строка, некоторые - две). Вот код, с которого я начал. Я проверил, чтобы убедиться, что на сайте разрешено очищать с помощью python и всего хорошего.

library(tidyverse) 
library(rvest) # interacting with html and webcontent
library(glue)

Веб-страница: https://fantasy.nfl.com/research/scoringleaders?position=1&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1

Функция очистки выбранной недели 1:17 и позиция 1: 4:

salary_scrape_19 <- function(week, position) {

Sys.sleep(3)  

cat(".")

url <- glue("https://fantasy.nfl.com/research/scoringleaders?position={position}&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek={week}")
read_html(url) %>% 
    html_nodes("table") %>% 
    html_table() %>%
    purrr::flatten_df() %>% 
    #set_names(need to clean headers before I can set this)
}

scraped_df <- scaffold %>% 
mutate(data = map2(week, position, ~salary_scrape_19(.x, .y))) 

scraped_df

В конечном итоге я хочу построить функцию очистки, чтобы получить все позиции с одинаковыми столбцами, такими как QB, RB, WR и TE, за все недели 2019. (хочу добавить третью переменную для склеивания {год} в конце концов, но сначала нужно получить это.

Опять же, я думаю, что проблема связана с шаткими заголовками таблицы на сайте, так как некоторые один ряд, а остальные заголовки - два ряда.

1 Ответ

0 голосов
/ 15 февраля 2020

Мы можем вставить первую строку как имена столбцов в исходные столбцы, а затем удалить эту строку.

library(tidyverse)
library(rvest)

salary_scrape_19 <- function(week, position) {

  url <- glue::glue("https://fantasy.nfl.com/research/scoringleaders?position={position}&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek={week}")
  read_html(url) %>% 
    html_nodes("table") %>% 
    html_table() %>%
    .[[1]] %>%
    set_names(paste0(names(.), .[1, ])) %>%
    slice(-1) 
}

Затем мы можем использовать map2 для очистки данных для различных week и position.

Примерить пример данных

scaffold <- data.frame(week = c(1, 2), position = c(1, 2))
scraped_df <- scaffold %>% mutate(data = map2(week, position, salary_scrape_19))
...