You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言rvest爬取Futhead球员数据无法识别表格问题咨询

爬取失败原因
  • 目标站点的球员列表没有使用标准<table>标签渲染,是用自定义div布局实现的列表,所以html_table()完全识别不到内容,返回空列表是正常现象
  • 你写的for循环存在逻辑错误:页码参数写死为page=1,循环10次爬的都是第一页数据,也没有把每页的结果做汇总存储,最后只能拿到最后一次循环的内容。
稳定爬取实现方案(推荐)

直接定位每个球员的条目节点,逐个提取字段,不用处理混乱的字符,准确性更高。完整可运行代码如下:

# 加载依赖包
library(rvest)
library(dplyr)
library(stringr)

# 初始化空数据框存结果
player_df <- data.frame(
  姓名 = character(),
  总评 = integer(),
  位置 = character(),
  pac = integer(),
  sho = integer(),
  pas = integer(),
  dri = integer(),
  def = integer(),
  phy = integer(),
  stringsAsFactors = FALSE
)

# 爬取前10页数据
for(i in 1:10) {
  # 动态拼接页码
  url <- paste0("https://www.futhead.com/22/players/?page=", i, "&level=gold_nif&bin_platform=ps")
  page <- read_html(url)
  
  # 定位所有球员条目节点
  player_items <- page %>% html_nodes(".player-item")
  
  # 逐个提取每个球员的字段
  for (item in player_items) {
    name <- item %>% html_node(".player-name") %>% html_text() %>% str_trim()
    rating <- item %>% html_node(".player-rating") %>% html_text() %>% as.integer()
    position <- item %>% html_node(".player-position") %>% html_text() %>% str_trim()
    # 提取6项属性
    stats <- item %>% html_nodes(".player-stat") %>% html_text() %>% as.integer()
    # 确保属性数量正确再加入数据框
    if(length(stats) == 6) {
      player_df <- rbind(player_df, data.frame(
        姓名 = name,
        总评 = rating,
        位置 = position,
        pac = stats[1],
        sho = stats[2],
        pas = stats[3],
        dri = stats[4],
        def = stats[5],
        phy = stats[6],
        stringsAsFactors = FALSE
      ))
    }
  }
  # 加停顿避免触发反爬
  Sys.sleep(2)
}

# 查看结果
head(player_df)

如果节点类名有变动,你可以用浏览器F12检查对应元素的class属性自行修改即可。

基于你现有字符提取的方案

你拿到的tab是按顺序拼接的球员信息,每9个内容为一组(姓名、总评、位置、pac、sho、pas、dri、def、phy),只要按固定长度切分再转数据框即可,代码如下:

# 先把空内容过滤掉
tab <- tab[tab != " " & tab != ""]
# 每9个元素为一个球员的所有信息
player_num <- length(tab) %/% 9
# 转矩阵再转数据框
player_df <- as.data.frame(matrix(tab, ncol = 9, byrow = TRUE), stringsAsFactors = FALSE)
# 重命名列
colnames(player_df) <- c("姓名", "总评", "位置", "pac", "sho", "pas", "dri", "def", "phy")
# 把数值列转成整数格式
player_df[, c(2,4:9)] <- lapply(player_df[, c(2,4:9)], as.integer)

这个方法的缺点是如果页面内容有异常项,切分的顺序就会错位,准确性不如逐个节点提取的方法。

内容的提问来源于stack exchange,提问作者Wutruvic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:15:04