使用R的rvest与SelectorGadget爬取Kaggle数据遇character(0)错误求助
问题分析
你遇到的character(0)结果,是因为Kaggle的数据集预览表格属于动态加载内容——read_html()只能抓取页面初始的静态HTML代码,但表格数据是页面加载完成后通过JavaScript渲染出来的,静态代码里根本没有你指定的.bPYkVN元素,自然匹配不到内容。
解决方案
针对新手,推荐两种方案,优先选第一种(更高效可靠):
方案1:直接下载数据集CSV(推荐)
Kaggle数据集本身提供直接下载入口,比爬取页面预览更稳定,步骤如下:
- 先在Kaggle账号设置中生成API密钥(账号设置→API→Create New Token),下载
kaggle.json文件 - 用
kaggle包下载并读取数据,代码示例:
# 安装并加载依赖包 install.packages("kaggle") library(kaggle) library(readr) # 配置API密钥(替换为你的kaggle.json文件路径) kaggle_api_config(path = "~/Downloads/kaggle.json") # 下载数据集并解压 kaggle_dataset_download_files( dataset = "jacouchs/marketing-budget-and-actual-sales-dataset", path = "./kaggle_data", unzip = TRUE ) # 读取CSV并拆分变量 sales_data <- read_csv("./kaggle_data/marketing_budget_and_actual_sales.csv") marketing_budget <- sales_data$Marketing_Budget actual_sales <- sales_data$Actual_Sales # 查看结果 head(marketing_budget) head(actual_sales)
方案2:用RSelenium爬取动态页面(适合必须爬预览的场景)
如果一定要抓取页面上的预览表格,需要用能处理JavaScript的动态爬虫工具,比如RSelenium:
# 安装并加载依赖包 install.packages("RSelenium") library(RSelenium) library(rvest) library(dplyr) # 启动Chrome驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remote_driver <- driver[["client"]] # 打开目标页面并等待加载完成 remote_driver$navigate("https://www.kaggle.com/datasets/jacouchs/marketing-budget-and-actual-sales-dataset") Sys.sleep(5) # 根据网络情况调整等待时间 # 获取包含动态内容的页面源码 page_source <- remote_driver$getPageSource()[[1]] page <- read_html(page_source) # 提取表格数据(注意:Kaggle页面类名可能会变动,需重新用SelectorGadget确认) table_cells <- page %>% html_nodes(".sc-cPuPxo.gWpXHw") %>% html_text() # 拆分数据到两个变量(按奇偶位置拆分对应两列) marketing_budget <- table_cells[seq(1, length(table_cells), 2)] actual_sales <- table_cells[seq(2, length(table_cells), 2)] # 关闭驱动 remote_driver$close() driver$server$stop()
注意事项
- Kaggle页面的CSS类名(比如你之前用的
.bPYkVN)会不定期更新,用SelectorGadget选元素后要确认当前页面的类名是否有效 - 直接下载数据集是最稳定的方式,爬取页面预览容易受页面结构变动影响
- 使用Kaggle API时,要确保
kaggle.json路径正确,且不要泄露密钥
内容的提问来源于stack exchange,提问作者Remzi Efe Açıkel
相关产品推荐
相关产品推荐

