如何高效批量从欧洲议会官网提取议员资料并转换为表格格式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计727个文字,预计阅读时间需要3分钟。
使用R语言(rvest包)高效爬取欧洲议会官方网站,提取议员名单,精确获取党派、国籍及所属政党三类信息,并通过矩阵重塑实现自动列对齐与数据框构建。
在实际数据采集任务中,从欧洲议会官网(https://www.php.cn/link/6a51a5ddd3a3e143a1e186948d00b602 HTML 布局,其中议员姓名通常位于 <div class="erpl_title-h4 t-item"> 标签内,而附加信息(党团名称、国籍、国内政党)则统一包裹在 <div class="sln-additional-info"> 容器中,且严格按“党团|国籍|国内政党”三行顺序排列——这为后续结构化解析提供了可靠前提。
以下为完整、可复现的 R 爬虫流程(需提前安装 rvest 和 dplyr):
library(rvest) library(dplyr) url <- "https://www.europarl.europa.eu/meps/it/full-list/all" html <- read_html(url) # 提取议员姓名(每名议员对应一个标题元素) names <- html %>% html_elements("div.erpl_title-h4.t-item") %>% html_text(trim = TRUE) # 提取附加信息文本(返回长度为 3×N 的字符向量) info_raw <- html %>% html_elements(".sln-additional-info") %>% html_text(trim = TRUE) # 关键步骤:将扁平化文本向量重塑为 3 列矩阵(byrow = TRUE 保证按“党团|国家|政党”行序填充) info_matrix <- matrix(info_raw, ncol = 3, byrow = TRUE) colnames(info_matrix) <- c("Group", "Country", "National_Party") # 合并为数据框(推荐用 data.frame 而非 cbind,确保类型安全) df <- data.frame( Name = names, Group = info_matrix[, 1], Country = info_matrix[, 2], National_Party = info_matrix[, 3], stringsAsFactors = FALSE ) # 查看前6行结果 head(df)
⚠️ 注意事项与优化建议:
- 反爬提示:该网站未设强反爬机制,但建议添加 Sys.sleep(0.5) 在请求间作轻量延迟,避免高频访问;
- 容错处理:实际页面可能存在个别议员缺失某项信息(如独立议员无国内政党),此时 html_text() 可能返回空字符串,建议后续用 tidyr::replace_na() 或 dplyr::mutate(across(..., ~ifelse(. == "", NA_character_, .))) 清洗;
- 多语言适配:示例 URL 使用 /it/(意大利语),若需其他语言版本,请同步替换路径(如 /en/),并验证 CSS 选择器是否一致(多数语言版 DOM 结构相同);
- 扩展性:如需补充议员个人主页链接,可额外提取 html_elements(".erpl_list-item a") %>% html_attr("href") 并与姓名一一匹配。
最终生成的 df 是标准的 tidy 数据框,可直接用于分析、导出(write.csv(df, "meps.csv", row.names = FALSE))或接入 Shiny 应用,真正实现“一次采集、多维复用”。
本文共计727个文字,预计阅读时间需要3分钟。
使用R语言(rvest包)高效爬取欧洲议会官方网站,提取议员名单,精确获取党派、国籍及所属政党三类信息,并通过矩阵重塑实现自动列对齐与数据框构建。
在实际数据采集任务中,从欧洲议会官网(https://www.php.cn/link/6a51a5ddd3a3e143a1e186948d00b602 HTML 布局,其中议员姓名通常位于 <div class="erpl_title-h4 t-item"> 标签内,而附加信息(党团名称、国籍、国内政党)则统一包裹在 <div class="sln-additional-info"> 容器中,且严格按“党团|国籍|国内政党”三行顺序排列——这为后续结构化解析提供了可靠前提。
以下为完整、可复现的 R 爬虫流程(需提前安装 rvest 和 dplyr):
library(rvest) library(dplyr) url <- "https://www.europarl.europa.eu/meps/it/full-list/all" html <- read_html(url) # 提取议员姓名(每名议员对应一个标题元素) names <- html %>% html_elements("div.erpl_title-h4.t-item") %>% html_text(trim = TRUE) # 提取附加信息文本(返回长度为 3×N 的字符向量) info_raw <- html %>% html_elements(".sln-additional-info") %>% html_text(trim = TRUE) # 关键步骤:将扁平化文本向量重塑为 3 列矩阵(byrow = TRUE 保证按“党团|国家|政党”行序填充) info_matrix <- matrix(info_raw, ncol = 3, byrow = TRUE) colnames(info_matrix) <- c("Group", "Country", "National_Party") # 合并为数据框(推荐用 data.frame 而非 cbind,确保类型安全) df <- data.frame( Name = names, Group = info_matrix[, 1], Country = info_matrix[, 2], National_Party = info_matrix[, 3], stringsAsFactors = FALSE ) # 查看前6行结果 head(df)
⚠️ 注意事项与优化建议:
- 反爬提示:该网站未设强反爬机制,但建议添加 Sys.sleep(0.5) 在请求间作轻量延迟,避免高频访问;
- 容错处理:实际页面可能存在个别议员缺失某项信息(如独立议员无国内政党),此时 html_text() 可能返回空字符串,建议后续用 tidyr::replace_na() 或 dplyr::mutate(across(..., ~ifelse(. == "", NA_character_, .))) 清洗;
- 多语言适配:示例 URL 使用 /it/(意大利语),若需其他语言版本,请同步替换路径(如 /en/),并验证 CSS 选择器是否一致(多数语言版 DOM 结构相同);
- 扩展性:如需补充议员个人主页链接,可额外提取 html_elements(".erpl_list-item a") %>% html_attr("href") 并与姓名一一匹配。
最终生成的 df 是标准的 tidy 数据框,可直接用于分析、导出(write.csv(df, "meps.csv", row.names = FALSE))或接入 Shiny 应用,真正实现“一次采集、多维复用”。

