我正在尝试使用rvest和胶水包来抓取多页体育数据。我在嵌套时遇到麻烦,我认为这是因为网站上的表格有两行标题(有些标题是一行,有些是两个)。这是我开始的代码。我检查以确保该网站允许使用python进行抓取,并且一切正常。
library(tidyverse)
library(rvest) # interacting with html and webcontent
library(glue)
刮取选定的一周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
最终,我想构建一个scrape函数,以获取2019年所有周内具有相同列的所有职位,即QB,RB,WR和TE。(最终想添加第三个变量来粘贴{year} ,但需要先获得它。
同样,我认为问题与站点上表格的标题不正确有关,因为某些标题是一行,而其他标题是两行。
答案 0 :(得分:0)
我们可以将第一行作为列名粘贴到原始列,然后删除该行。
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))