如何抓取非Table类的网页球员数据表格?以Transfermarkt为例
解决方案
因为目标页面的球员信息采用div布局而非标准table标签,所以不能直接用html_table()提取。以下是调整后的代码,可将数据整理为data frame格式:
步骤1:加载依赖包
需要用到rvest(网页解析)、dplyr(数据处理)和httr(自定义请求头):
library(rvest) library(dplyr) library(httr) library(tidyr) # 用于转宽格式(可选)
步骤2:获取页面内容
添加User-Agent绕过网站反爬机制:
url <- "https://www.transfermarkt.de/mamadou-doucoure/profil/spieler/340480" # 构造带User-Agent的请求 page <- GET(url, user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")) %>% content()
步骤3:提取并整理数据
定位到信息容器,逐行提取标签和对应值,再转换为data frame:
# 定位到包含所有球员基础信息的父容器 info_container <- page %>% html_node('div.row.collapse') # 抓取每个数据项的行元素 data_rows <- info_container %>% html_nodes('div.row') # 遍历行元素,提取标签和值 player_data <- lapply(data_rows, function(row) { label <- row %>% html_node('div.cell-25') %>% html_text(trim = TRUE) value <- row %>% html_node('div.cell-75') %>% html_text(trim = TRUE) tibble(Label = label, Value = value) }) %>% bind_rows() # (可选)转换为宽格式data frame,方便后续分析 player_data_wide <- player_data %>% pivot_wider(names_from = Label, values_from = Value)
说明
- 页面中每个球员信息项都被包裹在
div.row中,左侧div.cell-25是字段名,右侧div.cell-75是对应值,通过分别提取这两个元素的文本实现数据抓取。 - 必须添加User-Agent,否则网站会拦截请求,导致无法获取内容。
player_data是长格式data frame,player_data_wide是宽格式,可根据需求选择使用。
内容的提问来源于stack exchange,提问作者Jalila
相关产品推荐
相关产品推荐

