You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言使用rvest爬虫前指定入住退房日期?

嗨,这个问题我太熟悉了!TripAdvisor的房价动态性很强,我来帮你拆解原因和解决办法:

为什么会拿到不同的房价?

TripAdvisor的酒店页面默认会自动切换展示不同日期组合的房价,比如最近的周末、周中,或者根据请求的会话状态(比如Cookie)展示不同的日期选项。你每次用read_html()请求页面时,服务器没有收到明确的日期指令,就会随机/按规则返回不同日期对应的房价,这就是你得到$189、$199、$259不同结果的原因。

怎么程序化指定日期爬取?

有两种靠谱的方法,从简单到复杂:

方法1:直接在URL中添加日期参数(优先尝试)

TripAdvisor支持通过URL查询参数直接指定入住和退房日期,格式是YYYY-MM-DD。只要把参数拼到原URL后面,就能固定爬取对应日期的房价:

library(rvest)

# 自定义你要爬取的日期
checkin <- "2024-05-29"
checkout <- "2024-05-30"

# 构造带日期参数的完整URL
base_url <- "https://www.tripadvisor.com/Hotel_Review-g60971-d75749-Reviews-Little_America_Hotel_Flagstaff-Flagstaff_Arizona.html"
target_url <- paste0(base_url, "?checkin=", checkin, "&checkout=", checkout)

# 请求页面并提取价格(这里加上html_text()直接拿到价格文本,更直观)
page <- read_html(target_url)
price <- html_nodes(page, ".bb_price_text") %>% html_text()
cat("指定日期的房价:", price, "\n")

这个方法不需要模拟浏览器,速度快,大部分情况下都能生效。

方法2:用RSelenium模拟浏览器选择日期(应对动态加载场景)

如果URL参数方法不生效(比如TripAdvisor做了参数校验),就需要模拟真实浏览器的操作,手动选择日期后再爬取:

library(RSelenium)
library(rvest)

# 启动Chrome浏览器驱动(需要提前安装ChromeDriver,确保版本和浏览器匹配)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 打开酒店页面
remDr$navigate("https://www.tripadvisor.com/Hotel_Review-g60971-d75749-Reviews-Little_America_Hotel_Flagstaff-Flagstaff_Arizona.html")

# 点击日期选择框(元素选择器可能需要根据页面更新调整,这里用常见的选择器示例)
date_input <- remDr$findElement(using = "css selector", ".date-picker-trigger")
date_input$clickElement()

# 选择入住日期(替换成你需要的日期,data-date属性是YYYY-MM-DD格式)
checkin_btn <- remDr$findElement(using = "css selector", ".calendar-day[data-date='2024-05-29']")
checkin_btn$clickElement()

# 选择退房日期
checkout_btn <- remDr$findElement(using = "css selector", ".calendar-day[data-date='2024-05-30']")
checkout_btn$clickElement()

# 等待页面加载房价(给2秒缓冲时间)
Sys.sleep(2)

# 获取页面源码并解析价格
page_source <- remDr$getPageSource()[[1]]
page <- read_html(page_source)
price <- html_nodes(page, ".bb_price_text") %>% html_text()
cat("指定日期的房价:", price, "\n")

# 关闭浏览器和驱动
remDr$close()
driver$server$stop()

小提示

  • 记得定期检查页面的CSS选择器(比如.bb_price_text、.calendar-day),TripAdvisor可能会更新页面结构,导致选择器失效。
  • 如果爬取频率高,建议添加Sys.sleep()间隔,避免被网站封禁IP。

内容的提问来源于stack exchange,提问作者s. pia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:17