使用rvest爬取Airbnb评分及评论数失败,返回character(0)
Airbnb房源评分及评论数爬取失败的解决方法
问题根源
- Airbnb采用动态内容渲染,评分、评论数这类核心数据是通过JavaScript异步加载的,静态
read_html()只能获取页面初始的HTML源码,抓不到动态生成的内容。 - 你使用的CSS选择器(
._17p6nbba、span._s65ijh7)是平台自动生成的动态类名,这类类名会随页面更新频繁变化,很快就会失效。
可行解决方案
方案1:用RSelenium模拟浏览器加载动态内容
RSelenium能模拟真实浏览器的行为,等待页面完全加载后再抓取数据,步骤如下:
- 安装并加载依赖包:
install.packages("RSelenium") library(RSelenium)
- 启动Chrome浏览器驱动(需确保Chrome版本与驱动版本匹配):
driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]]
- 访问目标页面并等待加载完成:
url <- "https://www.airbnb.ae/rooms/585742764031233504?preview_for_ml=true&source_impression_id=p3_1660929108_esIxWS5HCyk890Im" remDr$navigate(url) Sys.sleep(5) # 等待时间可根据网络情况调整
- 用稳定的定位方式抓取数据(这里用XPath基于文本定位,比动态类名可靠):
# 获取平均评分 rating <- remDr$findElement(using = "xpath", value = "//div[contains(following-sibling::div, 'out of 5')]")$getElementText()[[1]] # 获取评论数 review_count <- remDr$findElement(using = "xpath", value = "//span[contains(text(), 'reviews')]")$getElementText()[[1]] # 输出结果 cat("平均评分:", rating, "\n") cat("评论数:", review_count, "\n")
- 关闭浏览器驱动:
remDr$close() driver$server$stop()
方案2:直接调用Airbnb的API接口
Airbnb加载房源数据时会调用后台API,直接请求API比模拟浏览器更高效,步骤如下:
- 打开目标页面,按F12打开开发者工具,切换到「Network」标签后刷新页面。
- 在搜索框输入
review或rating,找到返回房源详情的API请求,复制其URL。 - 在R中用
httr和jsonlite请求并解析数据:
install.packages(c("httr", "jsonlite")) library(httr) library(jsonlite) # 替换为你找到的API地址 api_url <- "替换为实际API URL" response <- GET(api_url) data <- fromJSON(content(response, "text")) # 从JSON结构中提取数据(具体路径需根据API返回调整) average_rating <- data$review_details$average_rating review_count <- data$review_details$total_reviews cat("平均评分:", average_rating, "\n") cat("评论数:", review_count, "\n")
注意事项
- 避免使用动态生成的类名作为选择器,优先用XPath基于文本/固定属性定位,或直接调用API。
- 爬取数据需遵守Airbnb的服务条款,控制请求频率,防止IP被封禁。
内容的提问来源于stack exchange,提问作者shubham tiwari
相关产品推荐
相关产品推荐

