使用 Rvest 动态抓取内容,其中 URL 的 3 个部分正在动态变化
Dynamically scrape content with Rvest where 3 parts of URL are dynamically changing
我正在尝试从 transfermarkt 抓取球员的内容,其中各个球队的 url 几乎相同,但 url 的 3 个部分正在动态变化。
我正在抓取我已经收集的 5 年数据:但这仅适用于一个团队,我想对所有团队都这样做。
# make a target url with the relevant year
url_base <- 'https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=%d'
map_df(2017:2021, function(i) {
# simple but effective progress indicator
cat(".")
pg <- read_html(sprintf(url_base, i))
data.frame(name=html_text(html_nodes(pg, ".hauptlink a , #yw1_c1")),
date_of_birth=html_text(html_nodes(pg, ".posrela+ .zentriert , .sort-link")),
market_value=html_text(html_nodes(pg, ".rechts")),
season=i,
stringsAsFactors=FALSE)
}) -> asSquad
每个团队 URL 的示例:
就目前而言,我已经能够抓取一个团队 5 年了,但是当 URL 的 3 个部分正在发生变化时,我该如何抓取它,并且每个团队都一次完成,请问?
拜托,欢迎任何建议!谢谢!
类似于:
library(rvest)
teams <- c("as-trencin", "slovan-bratislava")
var2 <- c("7918", "540")
years <- 2017:2018
all <- data.frame()
for (i in 1:length(teams)){
for (year in years) {
url <- paste0("https://www.transfermarkt.com/", teams[i], "/kader/verein/", var2[i],"/plus/1/galerie/0?saison_id=", year)
print(url)
# do.The.Scraping, saveToDataFrame, rBindToMainDataFrame
pg <- read_html(sprintf(url))
asSquad <- data.frame(
name=stringi::stri_trim(html_text(html_nodes(pg, ".hauptlink a , #yw1_c1"))),
date_of_birth=html_text(html_nodes(pg, ".posrela+ .zentriert , .sort-link")),
market_value=html_text(html_nodes(pg, ".rechts")),
season=year,
stringsAsFactors=FALSE)
asSquad <-asSquad[-1,]
all <- rbind(all, asSquad)
}
}
#> [1] "https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=2017"
#> [1] "https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=2018"
#> [1] "https://www.transfermarkt.com/slovan-bratislava/kader/verein/540/plus/1/galerie/0?saison_id=2017"
#> [1] "https://www.transfermarkt.com/slovan-bratislava/kader/verein/540/plus/1/galerie/0?saison_id=2018"
如果 var2
对于同一个 team
不同,则添加另一个循环。
格热戈日
我正在尝试从 transfermarkt 抓取球员的内容,其中各个球队的 url 几乎相同,但 url 的 3 个部分正在动态变化。
我正在抓取我已经收集的 5 年数据:但这仅适用于一个团队,我想对所有团队都这样做。
# make a target url with the relevant year
url_base <- 'https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=%d'
map_df(2017:2021, function(i) {
# simple but effective progress indicator
cat(".")
pg <- read_html(sprintf(url_base, i))
data.frame(name=html_text(html_nodes(pg, ".hauptlink a , #yw1_c1")),
date_of_birth=html_text(html_nodes(pg, ".posrela+ .zentriert , .sort-link")),
market_value=html_text(html_nodes(pg, ".rechts")),
season=i,
stringsAsFactors=FALSE)
}) -> asSquad
每个团队 URL 的示例:
就目前而言,我已经能够抓取一个团队 5 年了,但是当 URL 的 3 个部分正在发生变化时,我该如何抓取它,并且每个团队都一次完成,请问?
拜托,欢迎任何建议!谢谢!
类似于:
library(rvest)
teams <- c("as-trencin", "slovan-bratislava")
var2 <- c("7918", "540")
years <- 2017:2018
all <- data.frame()
for (i in 1:length(teams)){
for (year in years) {
url <- paste0("https://www.transfermarkt.com/", teams[i], "/kader/verein/", var2[i],"/plus/1/galerie/0?saison_id=", year)
print(url)
# do.The.Scraping, saveToDataFrame, rBindToMainDataFrame
pg <- read_html(sprintf(url))
asSquad <- data.frame(
name=stringi::stri_trim(html_text(html_nodes(pg, ".hauptlink a , #yw1_c1"))),
date_of_birth=html_text(html_nodes(pg, ".posrela+ .zentriert , .sort-link")),
market_value=html_text(html_nodes(pg, ".rechts")),
season=year,
stringsAsFactors=FALSE)
asSquad <-asSquad[-1,]
all <- rbind(all, asSquad)
}
}
#> [1] "https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=2017"
#> [1] "https://www.transfermarkt.com/as-trencin/kader/verein/7918/plus/1/galerie/0?saison_id=2018"
#> [1] "https://www.transfermarkt.com/slovan-bratislava/kader/verein/540/plus/1/galerie/0?saison_id=2017"
#> [1] "https://www.transfermarkt.com/slovan-bratislava/kader/verein/540/plus/1/galerie/0?saison_id=2018"
如果 var2
对于同一个 team
不同,则添加另一个循环。
格热戈日