使用 purrr 包处理 url 中的两个字符以进行抓取
Manipulating two characters in url with purrr package for scraping pupose
我在使用 purrr
包编写抓取函数时遇到困难(第一次)。我想通过更改指定 url 的两个字符来抓取多个页面。以下代码仅适用于一个赛季的足球运动员数据。
page_func <- function(page) {
cat(".")
df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-2017-2018/nach-name/",
page)) %>%
html_nodes("table") %>%
html_table() %>%
as.data.frame() %>%
as.tbl() %>%
select(Speler, Team, Geboren, Lengte, Positie) %>%
add_column(seizoen = "2017-2018")
}
raw_seizoen_17_18 <- map_df(1:11, page_func)
输出:
# A tibble: 541 x 6
Speler Team Geboren Lengte Positie seizoen
<chr> <chr> <chr> <chr> <chr> <chr>
1 Amir Absalem FC Groningen 19.06.1997 ??? VD 2017-2018
2 Asumah Abubakar Willem II 10.05.1997 183 cm AV 2017-2018
3 Ragnar Ache Sparta Rotterdam 28.07.1998 182 cm AV 2017-2018
4 Marouane Afaker SBV Excelsior 09.05.1999 ??? AV 2017-2018
5 Gor Agbaljan Heracles Almelo 25.04.1997 183 cm MV 2017-2018
6 Thomas Agyepong NAC Breda 10.10.1995 168 cm AV 2017-2018
现在我想在一个函数中抓取从 1956-1957
到 2017-2018
的所有季节,但我还不知道如何用 purrr
操作这两个变量。
page_season_func <- function(seizoen, page) {
cat(".")
df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-",
seizoen,
"/nach-name/",
page)) %>%
html_nodes("table") %>%
html_table() %>%
as.data.frame() %>%
as.tbl() %>%
select(Speler, Team, Geboren, Lengte, Positie) %>%
add_column(year = seizoen)
}
seasons <-
1956:2017 %>%
paste(., . + 1, sep = "-")
res <-
cross2(seasons, 1:11) %>%
transpose() %>%
pmap_df(page_season_func)
您可以使用 map2_dfr
和 .id
标签来指定输出中的年份:
page_span <- 1:11
year_span <- 1956:1958
years <- sort(rep(year_span, length(page_span)))
names(years) <- years # need to name years for .id to work
pages <- rep(page_span, length(year_span))
map2_dfr(years, pages, page_season_func, .id="year")
输出:
# A tibble: 6 x 6
year Speler Team Geboren Lengte Positie
<chr> <chr> <chr> <chr> <chr> <chr>
1 1956 Sjeng Adang Roda JC Kerk… 04.07.19… ??? MV
2 1956 Wim Anderiesen jr. AFC Ajax 02.09.19… ??? VD
3 1956 Wim Andriesen AFC Ajax 09.02.19… ??? MV
4 1956 Aad Bak Feyenoord 18.06.19… ??? MV
5 1956 Huub Bisschops Roda JC Kerk… 22.01.19… ??? AV
6 1956 Wim Bleijenberg AFC Ajax 05.11.19… ??? AV
对 page_season_func()
的一些更改:
seizoen2
被创建,这使得来自 y1
的 y1-y2
格式作为输入
无需添加 year
列,现在您可以使用 map2_dfr
的 .id
参数
page_season_func <- function(seizoen, page) {
cat(".")
seizoen2 <- paste(seizoen, seizoen+1, sep="-")
df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-",
seizoen2,
"/nach-name/",
page)) %>%
html_nodes("table") %>%
html_table(fill=TRUE) %>%
as.data.frame() %>%
as.tbl() %>%
select(Speler, Team, Geboren, Lengte, Positie)
}
我在使用 purrr
包编写抓取函数时遇到困难(第一次)。我想通过更改指定 url 的两个字符来抓取多个页面。以下代码仅适用于一个赛季的足球运动员数据。
page_func <- function(page) {
cat(".")
df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-2017-2018/nach-name/",
page)) %>%
html_nodes("table") %>%
html_table() %>%
as.data.frame() %>%
as.tbl() %>%
select(Speler, Team, Geboren, Lengte, Positie) %>%
add_column(seizoen = "2017-2018")
}
raw_seizoen_17_18 <- map_df(1:11, page_func)
输出:
# A tibble: 541 x 6
Speler Team Geboren Lengte Positie seizoen
<chr> <chr> <chr> <chr> <chr> <chr>
1 Amir Absalem FC Groningen 19.06.1997 ??? VD 2017-2018
2 Asumah Abubakar Willem II 10.05.1997 183 cm AV 2017-2018
3 Ragnar Ache Sparta Rotterdam 28.07.1998 182 cm AV 2017-2018
4 Marouane Afaker SBV Excelsior 09.05.1999 ??? AV 2017-2018
5 Gor Agbaljan Heracles Almelo 25.04.1997 183 cm MV 2017-2018
6 Thomas Agyepong NAC Breda 10.10.1995 168 cm AV 2017-2018
现在我想在一个函数中抓取从 1956-1957
到 2017-2018
的所有季节,但我还不知道如何用 purrr
操作这两个变量。
page_season_func <- function(seizoen, page) {
cat(".")
df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-",
seizoen,
"/nach-name/",
page)) %>%
html_nodes("table") %>%
html_table() %>%
as.data.frame() %>%
as.tbl() %>%
select(Speler, Team, Geboren, Lengte, Positie) %>%
add_column(year = seizoen)
}
seasons <-
1956:2017 %>%
paste(., . + 1, sep = "-")
res <-
cross2(seasons, 1:11) %>%
transpose() %>%
pmap_df(page_season_func)
您可以使用 map2_dfr
和 .id
标签来指定输出中的年份:
page_span <- 1:11
year_span <- 1956:1958
years <- sort(rep(year_span, length(page_span)))
names(years) <- years # need to name years for .id to work
pages <- rep(page_span, length(year_span))
map2_dfr(years, pages, page_season_func, .id="year")
输出:
# A tibble: 6 x 6
year Speler Team Geboren Lengte Positie
<chr> <chr> <chr> <chr> <chr> <chr>
1 1956 Sjeng Adang Roda JC Kerk… 04.07.19… ??? MV
2 1956 Wim Anderiesen jr. AFC Ajax 02.09.19… ??? VD
3 1956 Wim Andriesen AFC Ajax 09.02.19… ??? MV
4 1956 Aad Bak Feyenoord 18.06.19… ??? MV
5 1956 Huub Bisschops Roda JC Kerk… 22.01.19… ??? AV
6 1956 Wim Bleijenberg AFC Ajax 05.11.19… ??? AV
对 page_season_func()
的一些更改:
seizoen2
被创建,这使得来自y1
的y1-y2
格式作为输入无需添加
year
列,现在您可以使用map2_dfr
的.id
参数page_season_func <- function(seizoen, page) { cat(".") seizoen2 <- paste(seizoen, seizoen+1, sep="-") df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", seizoen2, "/nach-name/", page)) %>% html_nodes("table") %>% html_table(fill=TRUE) %>% as.data.frame() %>% as.tbl() %>% select(Speler, Team, Geboren, Lengte, Positie) }