【问题标题】:Extracting data from more than one page of TripAdvisor results从多页 TripAdvisor 结果中提取数据
【发布时间】:2018-05-12 06:15:45
【问题描述】:

我正在尝试使用 rvest 从跨越多个页面的 TripAdvisor 搜索结果中抓取数据。

这是我的代码:

library(rvest)

starturl <- 'https://www.tripadvisor.co.uk/Search?q=swim+with&uiOrigin=trip_search_Attractions&searchSessionId=CA54193AF19658CB1D983934FB5C86F41511875967385ssid#&ssrc=A&o=0'

swimwith <- read_html(starturl)

swdf <- swimwith %>%
html_nodes('.title span') %>%
html_text() 

它适用于结果的第一页,但我不知道如何从后续页面获取结果。我注意到 url 的末尾表示结果的开始位置,所以我将它从 '0' 更改为 '30' 如下:

url <- sub('A&o=0', paste0('A&o=', '30'), starturl)

webpage <- html_session(url)
swimwith <- read_html(webpage)

swdf2 <- swimwith %>%
html_nodes('.title span') %>%
html_text() 

但是,swdf2 的结果与 swdf 相同,即使 URL 会在网络浏览器中加载结果的第二页。

知道如何从这些后续页面中获取结果吗?

【问题讨论】:

  • 我认为你不会使用 Selenium 过去(即使那样我也不确定它是否会起作用)。
  • 如果您开始一个新的 R 会话并尝试使用 URL:starturl &lt;- 'https://www.tripadvisor.co.uk/Search?q=swim+with&amp;uiOrigin=trip_search_Attractions&amp;searchSessionId=CA54193AF19658CB1D983934FB5C86F41511875967385ssid#&amp;ssrc=A&amp;o=30',会发生什么情况,您会得到第二页吗?
  • 我还应该补充一点,rvest 具有导航网站的功能 follow_link() 和 jump_to() 但它们在这里不起作用,因为链接是 JavaScript 按钮。
  • @Mako212 我刚刚尝试使用第二页链接开始一个新会话,但它仍然从第一页获得结果。
  • @MartinSchmelzer 你是说我需要使用 Selenium?

标签: r web-scraping tripadvisor


【解决方案1】:

方法1)这是一种基于R包RSelenium的方法:

library(RSelenium)

# Note : You have to install chromedriver 
rd <- rsDriver(chromever = "96.0.4664.45", browser = "chrome", port = 4450L) 
remDr <- rd$client
remDr$open()
remDr$navigate("https://www.tripadvisor.co.uk/Search?q=swim+with&uiOrigin=trip_search_Attractions&searchSessionId=CA54193AF19658CB1D983934FB5C86F41511875967385ssid#&ssrc=A&o=0")

remDr$screenshot(display = TRUE, useViewer = TRUE) 

list_Text <- list()

for(i in 1 : 30)
{
  print(i)
  web_Obj <- remDr$findElement("xpath", paste0("//*[@id='BODY_BLOCK_JQUERY_REFLOW']/div[2]/div/div[2]/div/div/div/div/div[1]/div/div[1]/div/div[3]/div/div[1]/div/div[2]/div/div/div[", i, "]"))
  list_Text[[i]] <- web_Obj$getElementText()  
}

注意:你必须安装 chromedriver。

方法 2) 如果您只想提取标题,您可以将网页打印为 PDF,然后从 PDF 中提取文本。这是一个例子:

library(pagedown)
library(pdftools)
chrome_print("https://www.tripadvisor.co.uk/Search?q=swim+with&uiOrigin=trip_search_Attractions&searchSessionId=CA54193AF19658CB1D983934FB5C86F41511875967385ssid#&ssrc=A&o=0",
             "C:\\...\\trip_advisor.pdf")

text <- pdf_text("C:\\...\\trip_advisor.pdf")
text  <- strsplit(text, split = "\r\n")

# The titles are in the variable text ...

【讨论】:

    【解决方案2】:

    我想你想要这样的东西。

    jump <- seq(0, 300, by = 30)
    site <- paste('https://www.tripadvisor.co.uk/Search?q=swim+with&uiOrigin=trip_search_Attractions&searchSessionId=CA54193AF19658CB1D983934FB5C86F41511875967385ssid#&ssrc=A&o=', jump, sep="")
    
    dfList <- lapply
    (site, function(i) 
    {
    
      swimwith <- read_html(i)
    
      swdf <- swimwith %>%
      html_nodes('.title span') %>%
      html_text()
    
    
    }
    )
    
    finaldf <- do.call(rbind, dfList) 
    

    它在我的办公室不起作用,因为防火墙阻止了它,但我认为这应该适合你。

    另外,看看下面的链接。

    https://rpubs.com/ryanthomas/webscraping-with-rvest

    loop across multiple urls in r with rvest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2018-10-31
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多