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
相关产品推荐
相关产品推荐

