使用 rvest 和 map 函数将两个使用相同 url 的单独网页抓取合并为一个抓取

Combine two separate webpage scrapes using the same url into one scrape using rvest and map function

我已经成功地编写了两个可以正常工作的单独的 scrape 函数,但我想继续学习,弄清楚如何使用 purrr 的 map 函数将它们组合成一个单独的 scrape。这两个抓取甚至都来自我称之为 "url_final" 的活动页面索引。以下是该索引中的两个活动页面示例:

https://www.sports-reference.com/cbb/players/ken-tabaka-1.html
https://www.sports-reference.com/cbb/players/bobby-adair-1.html

我正在抓取球员的名字、身高和他们打球的赛季(从 table 中提取的赛季数据并获取第一列的所有内容)你会在第二列中注意到 link 没有 table。这种情况很少见,但我把它作为一个例子,因为这需要我使用另一位了不起的 SO 大师提供给我的 try catch 函数。

这是使用大索引 "url_final" 作为 .x 的第一个单独的抓取函数:

library(rvest)
library(curl)
library(tidyverse)

name_age <- map_dfr(.x = url_final,
                .f = function(x){Sys.sleep(.3); cat(1); 

 player <- read_html(curl(x, handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>% 
  html_nodes("#meta :nth-child(1)") %>%
  html_text() %>%
  .[[1]] %>%
   as.data.frame()
                    })

这是第二次抓取,使用相同的 url 索引并从页面上的第一个 table 获取季节,注意,您可以从第一个 url 示例中看到上面包含这个 table 但不包含第二个 URL.

player_seasons <- map_dfr(.x = url_final,
          .f = function(x){Sys.sleep(.3); cat(1); 
             tryCatch({
             fyr <- read_html(curl::curl(x, 
                  handle = curl::new_handle("useragent" = "Mozilla/5.0"))) %>%
                  html_table() %>% .[[1]] 

           fyr <- fyr %>%
                   select(1) %>%
                   mutate(name = str_extract(string = x, 
                     pattern = "(?<=cbb/players/).*?(?=-\d\.html)"))
           }, error = function(e) message('Skipping url', x))
        })

我尝试将这两个合并为一个地图函数,但没有成功。我猜解决方案很简单。我想找到一种方法将所有数据映射为单个 df。

重要提示

在大多数情况下,每个球员都会被淘汰多个赛季,我想这可能就是我在解决这个问题时遇到问题的原因。理想情况下,我只需要 table 显示的最近一年。例如,我提供的第一个 URL 示例(Ken Tabaka 个人资料页面)我真的只对保留“1970/71”感兴趣 1969-70 不需要,无论如何都会在以后过滤掉。

谢谢大家!

你可以试试:

library(rvest)
library(curl)
library(tidyverse)

url_final <- c('https://www.sports-reference.com/cbb/players/ken-tabaka-1.html',
               'https://www.sports-reference.com/cbb/players/bobby-adair-1.html')


temp <- map_dfr(.x = url_final,
    .f = function(x){Sys.sleep(.3); cat(1);       
    webpage <- read_html(curl(x, handle = new_handle("useragent"="Mozilla/5.0"))) 

      first <- webpage %>% html_nodes("#meta :nth-child(1)") %>%
        html_text() %>% .[[1]] %>% tibble(text = .)
      second <- tryCatch({webpage %>% 
                  html_table() %>% .[[1]] %>%
                  select(1) %>%
                   mutate(name = str_extract(string = x, 
                          pattern = "(?<=cbb/players/).*?(?=-\d\.html)"))
      }, error = function(e) 
            {message('Skipping url', x);return(tibble(Season = NA, name = NA))})
      tibble(first, second)
    })

因为我们不能有长度不等的数据帧,所以在发生异常时添加一个带有 NA 的空标题。此外,您还可以考虑在最终输出中添加 URL 或某些唯一键作为列,以准确识别哪一行来自何处​​。