使用Rvest抓取PSA球星卡评级数据并整理为数据框的技术问询
解决PSA球星卡评级数据抓取问题的可行方案
核心思路
该页面的评级数据并非标准HTML表格结构,而是通过自定义类的<div>元素渲染,因此html_table()无法直接提取。我们需要通过定位特定CSS选择器抓取每个球员的姓名和对应评级数据,再整理成Data Frame。
具体实现步骤
- 加载所需R包
library(rvest) library(dplyr) library(httr)
- 获取页面内容(添加User-Agent避免反爬拦截)
url <- "https://www.psacard.com/pop/basketball-cards/1986/fleer/36766" 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")) %>% read_html()
- 定位所有球员数据行
页面中每个球员的评级数据都包裹在类为pop-grid-row的<div>中,先抓取所有这类元素:
player_rows <- page %>% html_elements(".pop-grid-row")
- 编写函数提取单条球员数据
遍历每一行,分别提取球员姓名和1-10级的评级数值:
extract_player_data <- function(row) { # 提取球员姓名 player_name <- row %>% html_element(".pop-grid-col.player") %>% html_text2() # 提取1-10级的评级数量,转换为整数 grade_values <- sapply(1:10, function(grade_num) { row %>% html_element(paste0(".pop-grid-col.grade-", grade_num)) %>% html_text2() %>% as.integer() }) # 组合成数据框行 data.frame( Player = player_name, Grade_1 = grade_values[1], Grade_2 = grade_values[2], Grade_3 = grade_values[3], Grade_4 = grade_values[4], Grade_5 = grade_values[5], Grade_6 = grade_values[6], Grade_7 = grade_values[7], Grade_8 = grade_values[8], Grade_9 = grade_values[9], Grade_10 = grade_values[10] ) }
- 批量提取并整理成Data Frame
player_grade_df <- bind_rows(lapply(player_rows, extract_player_data))
注意事项
- 如果页面CSS类名发生变化,需要调整
html_elements和html_element中的选择器(可通过浏览器开发者工具查看最新结构) - 若遇到缺失值,
as.integer()会将其转为NA,可根据需求用dplyr::coalesce()替换为0 - 频繁请求可能触发反爬机制,建议添加适当的延迟(如
Sys.sleep(1))
内容的提问来源于stack exchange,提问作者Jeff Henderson
相关产品推荐
相关产品推荐

