R语言新手求助:如何用rvest包抓取航空安全数据为数据框?
航空安全数据抓取与数据框转换指南(R语言零基础友好)
嘿,作为完全零基础的新手,接到这个项目确实有点头大,但别担心,咱们一步步来,用R语言搞定这个数据抓取和转换的任务,全程都是新手友好的操作~
第一步:安装并加载必要的工具包
首先咱们需要两个核心包:
rvest:专门用来处理网页抓取,语法简单,适合新手dplyr:用来轻松整理数据成数据框,操作直观
打开RStudio(或者R控制台),运行以下代码安装包:
install.packages(c("rvest", "dplyr"))
安装完成后,加载这两个包:
library(rvest) library(dplyr)
第二步:读取目标网页内容
先把目标网站的URL存成变量,然后用read_html()函数读取网页内容:
# 目标网站URL target_url <- "http://aviation-safety.net/database/" # 读取网页内容 web_page <- read_html(target_url)
小提示:如果运行时出现访问失败的提示,可能是网站的反爬机制,可以尝试设置请求头(模拟浏览器访问),代码可以改成:
web_page <- read_html(target_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")
第三步:定位并提取需要的数据
这个网站的核心数据大概率是放在HTML表格里的,咱们先尝试直接提取表格:
# 提取网页中所有表格,fill=TRUE用来处理不规则表格 all_tables <- html_table(web_page, fill = TRUE) # 查看有多少个表格,找到咱们需要的那个(一般第一个就是主数据表格) length(all_tables) # 取出目标表格,赋值给df df <- all_tables[[1]] # 查看表格的列名,确认是否包含「机型」「年份」「国家」「航司」这些字段 colnames(df)
如果表格里的字段和咱们需要的对应上了,那恭喜你,这一步就搞定了!如果不是表格形式(比如数据散在div里),咱们就用CSS选择器来定位元素:
- 打开目标网站,按F12打开浏览器开发者工具
- 用「选择元素」工具点击你需要的字段(比如某一个机型名称),查看右侧的CSS选择器(比如
.data-row .model) - 用以下代码提取对应数据:
# 提取机型数据 models <- web_page %>% html_elements(".data-row .model") %>% # 替换成你找到的机型选择器 html_text() %>% # 提取文本内容 trimws() # 去掉前后空格 # 同理提取年份、国家、航司 years <- web_page %>% html_elements(".data-row .year") %>% # 替换成年份对应的选择器 html_text() %>% trimws() countries <- web_page %>% html_elements(".data-row .country") %>% # 替换成国家对应的选择器 html_text() %>% trimws() airlines <- web_page %>% html_elements(".data-row .airline") %>% # 替换成航司对应的选择器 html_text() %>% trimws()
第四步:把数据整合成数据框
不管是从表格提取的,还是用选择器提取的,最后都要整理成标准的数据框:
- 如果是表格提取的,直接用
df即可,还可以用dplyr清洗:
# 清洗表格数据,比如转换年份为数值型,去掉无用列 cleaned_df <- df %>% mutate(年份 = as.numeric(年份)) %>% # 把年份转成数字格式 select(机型, 年份, 国家, 航司) # 只保留咱们需要的列
- 如果是用选择器提取的向量,就组合成数据框:
# 用tibble(dplyr里的增强版数据框)组合数据 final_df <- tibble( 机型 = models, 年份 = years, 国家 = countries, 航司 = airlines ) # 同样可以做清洗,比如转换年份为数值型 final_df <- final_df %>% mutate(年份 = as.numeric(年份))
第五步:新手必看的注意事项
- 反爬机制:不要短时间内频繁请求网站,最好在多页抓取时加
Sys.sleep(1)(每次请求后暂停1秒),避免被网站封禁IP - 数据清洗:提取的数据可能有空格、缺失值,用
trimws()去空格,na.omit()删除缺失行,mutate()转换数据类型 - 遵守规则:查看网站的
robots.txt(比如访问网站根目录下的robots.txt文件),确认哪些内容可以抓取,不要违反网站的使用条款
内容的提问来源于stack exchange,提问作者B.LIANG
相关产品推荐
相关产品推荐

