R - 网络数据
R - 现代网络数据获取
Section titled “R - 现代网络数据获取”网络是数据的重要来源,数据通常以结构化文件(CSV、JSON)、API 或直接存在于 HTML 页面中。现代 R 提供了一个强大的生态系统,用于以编程方式获取这些数据。虽然存在较旧的方法,但当今的最佳实践围绕着 Tidyverse 展开,它是一系列专为数据科学设计的包。
对于网页抓取和数据检索,关键包包括:
httr: 用于向服务器和 API 发出复杂的 HTTP 请求。rvest: 用于轻松从 HTML 网页中获取(或称“抓取”)数据。jsonlite: 用于处理 JSON 数据,这是现代 API 的标准格式。
设置:安装现代包
Section titled “设置:安装现代包”我们将使用 tidyverse 元包(metapackage),它包含了 rvest 以及 dplyr 和 stringr 等其他基本工具。httr 也常用于更直接的网络交互。
# Tidyverse 是数据科学必不可少的一系列包install.packages("tidyverse")
# httr 是处理 HTTP 请求的标准包install.packages("httr")
# 将包加载到 R 会话中library(rvest)library(dplyr)核心概念:抓取 HTML 表格
Section titled “核心概念:抓取 HTML 表格”一项常见任务是直接从网页中提取表格数据。rvest 包使这变得非常简单。我们将以抓取维基百科页面上的世界人口数据表格作为示例。
示例:抓取和清洗维基百科表格
Section titled “示例:抓取和清洗维基百科表格”这段代码将读取一个 HTML 页面,识别出主要的数据表格,并将其直接转换为一个整洁的 R 数据框(准确地说,是一个 tibble)。
# 1. 定义要抓取页面的 URLurl <- "https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by_population"
# 2. 从 URL 读取 HTML 内容webpage <- read_html(url)
# 3. 定位并提取 HTML 表格# 我们使用 `html_element` 函数和 CSS 选择器来查找第一个维基表格。# 提示:使用 SelectorGadget 浏览器扩展可以轻松找到 CSS 选择器。population_table <- webpage %>% html_element(".wikitable") %>% html_table()
# 4. 检查原始提取的表格cat("--- Raw Table Head ---\n")print(head(population_table))
# 5. 使用 dplyr 清洗数据以进行分析# 列名可能比较混乱,数据类型也需要修正。world_population <- population_table %>% select( # 选择并重命名列以提高清晰度 country_name = `Country / Dependency`, population = Population, percentage_of_world = `% of world`, date = Date ) %>% filter(country_name != "World") %>% mutate( # 移除逗号分隔符并将人口数转换为数字 population = as.numeric(gsub(",", "", population)), # 移除 '%' 符号并将百分比转换为数值 percentage_of_world = as.numeric(gsub("%", "", percentage_of_world)) )
# 6. 验证清洗后的数据cat("\n--- Cleaned Table Head ---\n")print(head(world_population))
cat("\n--- Structure of Cleaned Table ---\n")str(world_population)备选方案:下载文件
Section titled “备选方案:下载文件”如果页面包含指向文件的链接(例如,多个 CSV 文件),您可以调整流程以提取 URL 并下载它们。原始教程的目标 URL 已不再活跃,但现代工作流将如下所示:
# 下载文件的假设示例# library(purrr) # 用于迭代# library(stringr) # 用于字符串匹配## # 1. 读取页面# page_with_links <- read_html("http://example.com/data_repository")## # 2. 获取所有链接 URL# file_urls <- page_with_links %>%# html_elements("a") %>% # 查找所有锚点标签# html_attr("href") # 提取 'href' 属性## # 3. 筛选出你想要的 CSV 文件# csv_links <- file_urls[str_detect(file_urls, "\\.csv$")]## # 4. 创建一个函数来下载单个文件# download_safely <- function(url) {# dest_file <- basename(url)# # 使用 tryCatch 优雅地处理潜在的下载错误# tryCatch({# download.file(url, destfile = dest_file, mode = "wb")# cat("Successfully downloaded:", dest_file, "\n")# }, error = function(e) {# cat("Failed to download:", url, "\nError:", conditionMessage(e), "\n")# })# }## # 5. 将下载函数应用于每个链接# # walk() 是 l_ply() 的现代等效函数# walk(csv_links, download_safely)