R 编程中的网络抓取 (rvest)



我正在尝试抓取所有详细信息(旅客类型,座位类型,航线,飞行日期,座位舒适度,机舱工作人员服务,食品和饮料,机上娱乐,地面服务,Wifi和连接,物有所值(,包括星级

来自航空公司质量网页

https://www.airlinequality.com/airline-reviews/emirates/

未按预期工作

my_url<- c("https://www.airlinequality.com/airline-reviews/emirates/")
review <- function(url){
review<- read_html(url) %>%
html_nodes(".review-value") %>%
html_text%>%
as_tibble()   
}
output <- map_dfr(my_url, review )

只能刮星评级,我需要拥有所有详细信息(例如机舱工作人员服务 - 评级 2,食品和饮料 = 评级 5(

star <- function(url){ 
stars_sq <- read_html(url) %>%
html_nodes(".star") %>%
html_attr("class") %>%
as.factor() %>%
as_tibble()
}
output_star<- map_dfr(my_url, star )

结果的输出应采用表格形式:

栏目: 旅客类型 , 座位类型, 航线, 飞行日期, 座位舒适度....具有星级
:每条评论

这有点复杂,因为您需要将填充/未填充的星星制成表格以获得每个字段的评级。我会使用html_table()来提供帮助,然后重新插入计算出的星值:

require(tibble)
require(purrr)
require(rvest)
my_url <- c("https://www.airlinequality.com/airline-reviews/emirates/")
count_stars_in_cell <- function(cell)
{
html_children(cell) %>% 
html_attr("class")  %>%
equals("star fill") %>% 
which               %>% 
length
}
get_ratings_each_review <- function(review) 
{
review                             %>%
html_nodes(".review-rating-stars") %>%
lapply(count_stars_in_cell)        %>%
unlist
}
all_tables <- read_html(my_url)      %>%
html_nodes("table")
reviews <- lapply(all_tables, html_table)
ratings <- lapply(all_tables, get_ratings_each_review)
for (i in seq_along(reviews))
{
reviews[[i]]$X2[reviews[[i]]$X2 == "12345"] <- ratings[[i]]
}
print(reviews)

这为您提供了一个列表,每个评论都有一个表。这些应该可以直接合并到单个数据框中。

最新更新