使用 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 的示例:

https://www.transfermarkt.com/**as-trencin**/kader/verein/**7918**/plus/1/galerie/0?saison_id=**2017**

https://www.transfermarkt.com/**slovan-bratislava**/kader/verein/**540**/plus/1/galerie/0?saison_id=**2019**

就目前而言,我已经能够抓取一个团队 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 不同,则添加另一个循环。

格热戈日