使用R与rvest爬取TripAdvisor“What to expect”文本遇阻求助
解决TripAdvisor页面“What to expect”文本提取问题
问题原因
TripAdvisor的“What to expect”板块是通过JavaScript动态渲染的,rvest的read_html()只能获取页面初始的静态HTML,无法加载JS生成的内容,所以你之前用各种CSS选择器都找不到目标元素。
可行方案
方案一:用playwright模拟浏览器加载动态内容
playwright可以模拟真实浏览器行为,完整加载页面的动态内容,步骤如下:
- 安装依赖包:
install.packages("playwright") playwright::install_browsers()
- 编写提取代码:
library(playwright) library(rvest) # 启动无头浏览器(headless=FALSE可显示浏览器窗口) browser <- playwright$chromium$launch(headless = TRUE) page <- browser$new_page() # 访问目标页面 page$goto("https://www.tripadvisor.com/AttractionProductReview-g60750-d12086300-San_Diego_Whale_Watching_Cruise-San_Diego_California.html") # 等待目标板块加载完成,确保元素已渲染 page$wait_for_selector("div[data-test-target='what-to-expect']") # 获取完整页面HTML full_html <- page$content() webpage <- read_html(full_html) # 提取“What to expect”板块文本 what_to_expect_text <- webpage %>% html_node("div[data-test-target='what-to-expect']") %>% html_text(trim = TRUE) print(what_to_expect_text) # 关闭浏览器 browser$close()
方案二:直接调用页面API接口(更高效)
TripAdvisor会通过AJAX请求加载动态内容,你可以通过浏览器开发者工具抓包找到对应的API接口,直接请求获取数据,无需模拟浏览器:
抓包步骤:打开浏览器F12→切换到Network标签→筛选XHR请求,找到加载“What to expect”数据的POST请求(通常是
/data/graphql/ids),复制请求参数和头信息。示例代码(参数需根据实际抓包结果调整):
library(httr2) library(jsonlite) # 构造API请求 api_req <- request("https://www.tripadvisor.com/data/graphql/ids") %>% req_headers( "Content-Type" = "application/json", "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) %>% req_body_json(list( queryId = "7103567709691533000", # 该ID可能随页面更新变化,需抓包确认 variables = list( locationId = "60750", productId = "12086300" ) )) # 发送请求并解析数据 resp <- req_perform(api_req) result_data <- resp_body_json(resp) # 提取目标文本 what_to_expect_text <- result_data$data$productDetailPage$whatToExpect$text print(what_to_expect_text)
注意:API的queryId和参数可能会被TripAdvisor更新,每次使用前需重新抓包确认最新值。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

