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

问题描述 投票:0回答:1

我设法组成了两个单独的抓取函数,这些函数正常工作,但是我想通过使用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感兴趣,因此以后无论如何都会将其过滤掉。

谢谢大家!

r web-scraping rvest
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.