请求评审Skytrax网站Rvest爬虫代码及星级评分转数值方法
阿联酋航空Skytrax评论爬虫代码评审与星级评分转换方案
一、现有代码问题与优化建议
原代码存在选择器冗余、数据污染的问题,导致抓取的字段长度不一致、包含无效内容,以下是针对性优化:
- 移除冗余选择器
.grippy-host
这个类是页面的拖拽交互元素,不属于评论数据,所有包含它的选择器都会混入无关文本,导致数据混乱。优化后各字段选择器:
library(rvest) library(dplyr) link <- "https://www.airlinequality.com/airline-reviews/emirates/page/1/sortby=post_date%3ADesc&pagesize=100" page <- read_html(link) # 乘客姓名:精准选择用户状态区的姓名 pax_name <- page %>% html_nodes(".userStatusWrapper span") %>% html_text() # 评论日期:直接取time标签的文本 date <- page %>% html_nodes("time") %>% html_text() # 整体评分:取.rating-10下的数值 pax_rating <- page %>% html_nodes(".rating-10 .value") %>% html_text() # 旅客类型:精准匹配.type_of_traveller的兄弟元素 traveller_type <- page %>% html_nodes(".type_of_traveller + .review-value") %>% html_text() # 行程验证状态:取评论头部的em标签 trip_verified <- page %>% html_nodes(".review-header em") %>% html_text() # 机组服务评分:保留星级节点后续处理 crew_service <- page %>% html_nodes(".cabin_staff_service + .stars") # 是否推荐:修复选择器(原t.recommended错误,应为.recommended) pax_recommended <- page %>% html_nodes(".recommended + .review-value") %>% html_text() # 餐饮评分、地面服务评分:保留星级节点后续处理 food_drinks <- page %>% html_nodes(".food_and_beverages + .stars") ground_service <- page %>% html_nodes(".ground_service + .stars") # 旅行舱位 travel_class <- page %>% html_nodes(".cabin_flown + .review-value") %>% html_text()
- 字段长度一致性处理
部分评论可能缺失某些字段(如未填写舱位、无地面服务评分),建议用purrr::map配合ifelse处理空值,确保所有字段长度相同,避免数据框创建失败。
二、星级评分转换为数值的方法
Skytrax的星级通过<span class="star fill"></span>表示已填充的星级,未填充的为<span class="star"></span>,可以通过统计每个星级容器下的fill类数量获取数值:
通用转换函数
# 定义星级转换函数:输入stars节点,返回数值评分 star_to_num <- function(star_node) { star_node %>% html_nodes(".star.fill") %>% length() %>% as.numeric() } # 批量转换各星级字段 crew_service_num <- sapply(crew_service, star_to_num) food_drinks_num <- sapply(food_drinks, star_to_num) ground_service_num <- sapply(ground_service, star_to_num)
整合到数据框
将转换后的数值字段替换原字段,创建最终数据框:
emirates_reviews <- data.frame( pax_name, date, pax_rating = as.numeric(pax_rating), traveller_type, trip_verified, crew_service = crew_service_num, pax_recommended, food_drinks = food_drinks_num, ground_service = ground_service_num, travel_class, stringsAsFactors = FALSE )
额外技术建议
- 分页爬取:如果需要爬取多页评论,可通过循环修改链接中的
page/1为page/2、page/3,并添加延迟(Sys.sleep(2))避免触发反爬机制。 - 异常处理:添加
tryCatch捕获页面加载失败的情况,避免程序中断。 - 数据清洗:对日期字段用
lubridate::dmy转换为日期格式,对pax_recommended转换为布尔值(pax_recommended == "Yes")。
内容的提问来源于stack exchange,提问作者Vee28
相关产品推荐
相关产品推荐

