使用Rvest和Glue创建多个页面的Web聚合df

使用Rvest和Glue创建多个页面的Web聚合df,r,web-scraping,rvest,R,Web Scraping,Rvest,我正在从以下网站上的一张表中抓取数据 https://fantasy.nfl.com/research/scoringleaders?position=1&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1 我想创建一个scrape,它需要全部17周,全部四个位置(qb、rb、wr、te),并且需要前4页才能获得前100行(一次一页上只显示25行) 我遇到的问题是,当我试图用每周、职位

我正在从以下网站上的一张表中抓取数据

https://fantasy.nfl.com/research/scoringleaders?position=1&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1
我想创建一个scrape,它需要全部17周,全部四个位置(qb、rb、wr、te),并且需要前4页才能获得前100行(一次一页上只显示25行)

我遇到的问题是,当我试图用每周、职位和页面的所有数据制作一个df时。以下代码适用于周和职位,但不适用于其他嵌套df

scaffold <- tibble(week = weeks,
                   position = list(positions)) %>% tidyr::unnest()
scaffold

tbl_data <- scaffold %>% 
            mutate(data = purrr::map2(week, position, ~scrape_19(.x, .y)[[1]]))
scaffold%tidyr::unnest()
脚手架
待定数据%
突变(data=purrr::map2(周,位置,~scrape_19(.x,.y)[[1]]))

基本上,我需要帮助制作脚手架,并将脚手架转化为包含所有周、位置和页面的最终总数据集。

以下是我的尝试。我不确定是否应该使用
glue()
。见下文

first_name <- c("Fred", "Ana", "Bob")
last_name <- c("JOhnson", "Trump")
glue('My name is {first_name} {last_name}.')

@akrun这就是我想要描述的。你似乎很喜欢问关于删除这个网站的问题。如果您试图用所需的输出尽可能清楚地表达您的问题,这样就可以测试和验证可能的解决方案,从而有效地解决您的问题,这将是非常有帮助的。这真的涉及到刮片部分吗?你只是想用一些变量组合建立一个字符串(URL)列表吗?试着一次只关注一个特定的问题。拿走任何与问题无关的东西。@flick先生我很抱歉,因为我已经尽力澄清了。是的,我正在尝试学习使用rvest和胶水进行刮削,我只是尝试尽可能地详细,以便人们知道我想要了解什么。一天结束时,期望的输出是2019年17周内所有四个职位(qb、rb、wr、te)的前100行(网站上一次页面上仅显示25行)的单个df。到目前为止,有两个拼写错误(和一个警告);'一周“周”和“职位”!='位置'。看来scaffold只是这两者的一个
expand.grid
。最后出现一条错误消息,表明网站需要
{page}
的值,这非常有用。我需要回去逆向工程,你做了什么,以更好地理解我,但我运行了它与前4个网址,因为你在代码中写的,然后再次与前40抽检,它看起来做得很好!既然我是一个新手,而且我真的只是想学习,我应该专注于学习这个httr软件包吗?还有关于刮削的进一步建议吗?非常感谢你!编辑附言。有没有一种方法可以在这里抛出Sys.sleep调用来礼貌地对待主站点?@JeffHenderson不客气。例如,您可以在自定义函数的开头添加
Sys.sleep(3)
<代码>系统睡眠(3);阅读_html(x)%%>%…我想,通过你想尝试的任何东西,你都可以从中学习到刮擦;在作为分隔符的函数中。哇,学了这么多!多谢各位!
scaffold <- tibble(week = weeks,
                   position = list(positions)) %>% tidyr::unnest()
scaffold

tbl_data <- scaffold %>% 
            mutate(data = purrr::map2(week, position, ~scrape_19(.x, .y)[[1]]))
first_name <- c("Fred", "Ana", "Bob")
last_name <- c("JOhnson", "Trump")
glue('My name is {first_name} {last_name}.')
library(httr)
library(rvest)
library(tidyverse)

# Create all URLs.

# Create 4 base URLs
paste("https://fantasy.nfl.com/research/scoringleaders?",
      c("", "offset=26&", "offset=51&", "offset=76&"),
      "position={position}&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek={week}",
      sep = "") -> mytemp

# For each base URL, create 4 URLs. (4 x 4 = 16 URLs)
map(.x = 1:4,
    .f = function(x){gsub(x = mytemp, pattern = "\\{position\\}", replacement = x)}) %>% 
unlist -> mytemp

# For each of the 16 URLs, create 17 URLs
map(.x = 1:17,
    .f = function(x){gsub(x = mytemp, pattern = "\\{week\\}", replacement = x)}) %>% 
unlist -> myurls


# Check if any URLs are invalid
sapply(myurls, url_success) %>% table

# TRUE 
#  272 

# Scrape the tables
map_dfr(.x = myurls[1:4],
        .f = function(x){read_html(x) %>% 
                         html_nodes("table") %>% 
                         html_table() %>% 
                         simplify() %>% 
                         first() %>% 
                         setNames(paste0(colnames(.), as.character(.[1,]))) %>% 
                         slice(-1) %>% 
                         mutate(position = str_extract(string = x, pattern = "(?<=position=)\\d+(?=&)"),
                                week = str_extract(string = x, pattern = "(?<=statWeek=)\\d+"))},
        .id = "url") -> foo


   url Rank                               Player  Opp PassingYds PassingTD PassingInt RushingYds RushingTD ReceivingRec ReceivingYds
1    1    1               Lamar Jackson QB - BAL @MIA        324         5          -          6         -            -            -
2    1    2                Dak Prescott QB - DAL  NYG        405         4          -         12         -            -            -
3    1    3              Deshaun Watson QB - HOU  @NO        268         3          1         40         1            -            -
4    1    4            Matthew Stafford QB - DET @ARI        385         3          -         22         -            -            -
5    1    5              Patrick Mahomes QB - KC @JAX        378         3          -          2         -            -            -

   ReceivingTD RetTD MiscFumTD Misc2PT FumLost FantasyPoints position week
1            -     -         -       -       -         33.56        1    1
2            -     -         -       -       -         33.40        1    1
3            -     -         -       -       -         30.72        1    1
4            -     -         -       -       1         27.60        1    1
5            -     -         -       -       -         27.32        1    1