代码之家  ›  专栏  ›  技术社区  ›  Tdebeus

使用purr包在url中操作两个字符以抓取pulose

  •  1
  • Tdebeus  · 技术社区  · 8 年前

    我很难用 purrr 包装(第一次)。我想通过更改指定URL的两个字符来刮取多个页面。以下代码仅适用于一个赛季的足球运动员数据。

    page_func <- function(page) {
    
      cat(".")
    
      df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-2017-2018/nach-name/", 
                             page)) %>%
        html_nodes("table") %>%
        html_table() %>%
        as.data.frame() %>%
        as.tbl() %>%
        select(Speler, Team, Geboren, Lengte, Positie) %>%
        add_column(seizoen = "2017-2018")
    
    }
    
    raw_seizoen_17_18 <- map_df(1:11, page_func) 
    

    输出:

    # A tibble: 541 x 6
       Speler           Team             Geboren    Lengte Positie seizoen  
       <chr>            <chr>            <chr>      <chr>  <chr>   <chr>    
     1 Amir Absalem     FC Groningen     19.06.1997 ???    VD      2017-2018
     2 Asumah Abubakar  Willem II        10.05.1997 183 cm AV      2017-2018
     3 Ragnar Ache      Sparta Rotterdam 28.07.1998 182 cm AV      2017-2018
     4 Marouane Afaker  SBV Excelsior    09.05.1999 ???    AV      2017-2018
     5 Gor Agbaljan     Heracles Almelo  25.04.1997 183 cm MV      2017-2018
     6 Thomas Agyepong  NAC Breda        10.10.1995 168 cm AV      2017-2018
    

    现在我想把所有的季节从 1956-1957 直到永远 2017-2018 在一个函数中,但是我还不知道如何用 珀尔 .

    page_season_func <- function(seizoen, page) {
    
      cat(".")
    
      df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", 
                             seizoen, 
                             "/nach-name/", 
                             page)) %>%
        html_nodes("table") %>%
        html_table() %>%
        as.data.frame() %>%
        as.tbl() %>%
        select(Speler, Team, Geboren, Lengte, Positie) %>%
        add_column(year = seizoen)
    
    }
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Aurèle    8 年前
    seasons <- 
      1956:2017 %>% 
      paste(., . + 1, sep = "-")
    
    res <- 
      cross2(seasons, 1:11) %>% 
      transpose() %>% 
      pmap_df(page_season_func)
    
        2
  •  0
  •   andrew_reece    8 年前

    你可以用 map2_dfr ,使用 .id 标记以指定输出中的年份:

    page_span <- 1:11
    year_span <- 1956:1958
    years <- sort(rep(year_span, length(page_span)))
    names(years) <- years # need to name years for .id to work
    pages <- rep(page_span, length(year_span))
    map2_dfr(years, pages, page_season_func, .id="year")
    

    输出:

    # A tibble: 6 x 6
      year  Speler             Team          Geboren   Lengte Positie
      <chr> <chr>              <chr>         <chr>     <chr>  <chr>  
    1 1956  Sjeng Adang        Roda JC Kerk… 04.07.19… ???    MV     
    2 1956  Wim Anderiesen jr. AFC Ajax      02.09.19… ???    VD     
    3 1956  Wim Andriesen      AFC Ajax      09.02.19… ???    MV     
    4 1956  Aad Bak            Feyenoord     18.06.19… ???    MV     
    5 1956  Huub Bisschops     Roda JC Kerk… 22.01.19… ???    AV     
    6 1956  Wim Bleijenberg    AFC Ajax      05.11.19… ???    AV     
    

    一些变化 page_season_func() :

    • seizoen2 创建,这使得 y1-y2 格式来自 y1 作为输入
    • 无需添加 year 列,现在可以使用 地图2 的 身份证 论点

      page_season_func <- function(seizoen, page) {
        cat(".")
        seizoen2 <- paste(seizoen, seizoen+1, sep="-")
        df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", 
                               seizoen2, 
                               "/nach-name/", 
                               page)) %>%
          html_nodes("table") %>%
          html_table(fill=TRUE) %>%
          as.data.frame() %>%
          as.tbl() %>%
          select(Speler, Team, Geboren, Lengte, Positie)
      }