如何在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
相关产品推荐
相关产品推荐

