使用rvest和map功能将使用同一url的两个独立网页摘要合并为一个摘要

使用rvest和map功能将使用同一url的两个独立网页摘要合并为一个摘要,r,web-scraping,rvest,R,Web Scraping,Rvest,我已经成功地编写了两个单独的scrape函数,它们可以正常工作,但我想通过了解如何使用purr的map函数将它们组合成一个单独的scrape来继续学习。这两个刮擦甚至来自我称之为“url\u final”的活动页面索引。以下是该索引中的两个活动页面示例: https://www.sports-reference.com/cbb/players/ken-tabaka-1.html https://www.sports-reference.com/cbb/players/bobby-adair-1.

我已经成功地编写了两个单独的scrape函数,它们可以正常工作,但我想通过了解如何使用purr的map函数将它们组合成一个单独的scrape来继续学习。这两个刮擦甚至来自我称之为“url\u 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()
                    })
库(rvest)
图书馆(curl)
图书馆(tidyverse)
姓名/年龄%
html_text()%>%
.[[1]] %>%
as.data.frame()
})
这里是第二个使用相同的url索引并从页面上的第一个表中获取季节的片段,注意,您可以从上面的第一个url示例中看到,它包含这个表,但不包含第二个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))
        })
player_seasures%.[1]]
fyr%
选择(1)%>%
mutate(name=str_)extract(string=x,
pattern=“(?您可以尝试:

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)
    })
库(rvest)
图书馆(curl)
图书馆(tidyverse)
url\u最终%tible(文本=)
第二%
html_table()%>%.[1]]%>%
选择(1)%>%
mutate(name=str_)extract(string=x,
pattern=“(?您可以尝试:

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)
    })
库(rvest)
图书馆(curl)
图书馆(tidyverse)
url\u最终%tible(文本=)
第二%
html_table()%>%.[1]]%>%
选择(1)%>%
mutate(name=str_)extract(string=x,

pattern=“(?嗨,Jeff,你想以什么方式组合这两个函数的输出?@Bas理想情况下是数据帧或TIBLE。如果有必要,列表至少也是可以接受的。@Ronak在下面提供了一个答案。一个小提示:使用
html\u节点
,然后用
[[1]]选择第一个元素
,这可以通过使用
html\u node
(单数)来缓解,它会自动选择第一个。嗨,Jeff,下面的答案对我来说很有效,在R4.0.0和
dplyr
1.0.0。我不确定是否需要为此更新任何包。如果仍然不起作用,尝试几件事1)使用
map
代替
map\u-dfr
.2)使用
list(第一,第二)
代替
tibble(第一,第二)
3)同时执行1和2。@RonakShah使用Map而不是Map_dfr成功了!我有95k个URL最终将映射到列表中,但不确定这是否可取,但我认为R应该能够处理它。我不完全确定以后如何将列表中的所有元素合并到数据框中,但我打赌我可以进行研究。一如既往地感谢您。您已经e最好的Ronak!嗨,Jeff,你想以什么方式组合这两个函数的输出?@Bas理想情况下是一个数据帧或TIBLE。如果有必要,列表至少也是可以接受的。@Ronak在下面提供了一个答案。一个小提示:使用
html\u节点
,然后用
[[1]]选择第一个元素
,这可以通过使用
html\u node
(单数)来缓解,它会自动选择第一个。嗨,Jeff,下面的答案对我来说很有效,在R4.0.0和
dplyr
1.0.0。我不确定是否需要为此更新任何包。如果仍然不起作用,尝试几件事1)使用
map
代替
map\u-dfr
.2)使用
list(第一,第二)
代替
tibble(第一,第二)
3)同时执行1和2。@RonakShah使用Map而不是Map_dfr成功了!我有95k个URL最终将映射到列表中,但不确定这是否可取,但我认为R应该能够处理它。我不完全确定以后如何将列表中的所有元素合并到数据框中,但我打赌我可以进行研究。一如既往地感谢您。您已经e最好的Ronak!