使用rvest和map功能将使用同一url的两个独立网页摘要合并为一个摘要
我已经成功地编写了两个单独的scrape函数,它们可以正常工作,但我想通过了解如何使用purr的map函数将它们组合成一个单独的scrape来继续学习。这两个刮擦甚至来自我称之为“url\u final”的活动页面索引。以下是该索引中的两个活动页面示例:使用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.
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!