我设法组成了两个单独的抓取函数,这些函数正常工作,但是我想通过使用purrr的map函数弄清楚如何将它们组合为一个单独的抓取函数来继续我的学习。这两个片段甚至都来自我称为“ url_final”的活动页面的索引。这是该索引中活动页面的两个样本:
https://www.sports-reference.com/cbb/players/ken-tabaka-1.html
https://www.sports-reference.com/cbb/players/bobby-adair-1.html
我正在抓取玩家的姓名,身高和所玩的季节(从表格中提取季节数据并占据第一列的全部内容)。您会在第二个链接中注意到没有表格。这是一种罕见的情况,但我以它为例,因为这使我不得不使用另一个出色的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()
})
这是第二个使用相同网址索引的抓取,并从页面上第一个表格获取季节,注意,您可以从上面的第一个网址示例中看到它包含此表,但没有第二个网址。
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))
})
我曾尝试将这两者合并为一个map函数,但无济于事。我猜该解决方案很简单。我想找到一种将所有数据映射为单个df的方法。
重要提示
[在大多数情况下,每位球员将被淘汰多个赛季,我想这可能就是为什么我在解决这个问题时会遇到问题。理想地,我只需要该表显示的最近年份。例如,我提供的第一个URL示例(肯塔巴卡个人资料页)我真的只对保持“ 1970/71” 1969-70感兴趣,因此以后无论如何都会将其过滤掉。
谢谢大家!