使用 R 从 TripAdvisor 抓取数据

Scraping data from TripAdvisor using R

我想创建一个可以从 Trip Advisor 抓取一些数据的爬虫。理想情况下,它将 (a) 确定要抓取的所有位置的 link, (b) 收集 link 到每个地点的所有景点,并且 (c) 将收集所有评论的目的地名称、日期和评分。 我现在想专注于 (a) 部分。

这是我开始使用的网站: http://www.tripadvisor.co.nz/Tourism-g255104-New_Zealand-Vacations.html

这里有问题:link 给出了前 10 个目的地,如果您随后单击 "See more popular destinations" 它将展开列表。看起来好像它使用 javascript 函数来实现此目的。不幸的是,我不熟悉 javascript,但我认为以下块可能会提供有关其工作原理的线索:

<div class="morePopularCities" onclick="ta.call('ta.servlet.Tourism.showNextChildPage', event, this)">
<img id='lazyload_2067453571_25' height='27' width='27' src='http://e2.tacdn.com/img2/x.gif'/>
See more popular destinations in New Zealand </div>

我发现了一些有用的 R 网络抓取包,例如 rvest、RSelenium、XML、RCurl,但在这些包中,似乎只有 RSelenium 能够解决这个问题,话虽如此,我还是没能解决。

这里是一些相关的代码:

tu = "http://www.tripadvisor.co.nz/Tourism-g255104-New_Zealand-Vacations.html"
RSelenium::startServer()
remDr = RSelenium::remoteDriver(browserName = "internet explorer")
remDr$open()
remDr$navigate(tu)
# remDr$executeScript("JS_FUNCTION")

最后一行在这里应该可以解决问题,但我不确定我需要在这里调用什么函数。

一旦我设法扩展这个列表,我将能够获得每个目的地的 links,就像我解决第 (b) 部分的方法一样,我想我已经解决了这个问题(对于感兴趣的人):

library(rvest)
tu = "http://www.tripadvisor.co.nz/Tourism-g255104-New_Zealand-Vacations.html"
tu = html_session(tu)
tu %>% html_nodes(xpath='//div[@class="popularCities"]/a') %>% html_attr("href")
 [1] "/Tourism-g255122-Queenstown_Otago_Region_South_Island-Vacations.html"                      
 [2] "/Tourism-g255106-Auckland_North_Island-Vacations.html"                                     
 [3] "/Tourism-g255117-Blenheim_Marlborough_Region_South_Island-Vacations.html"                  
 [4] "/Tourism-g255111-Rotorua_Rotorua_District_Bay_of_Plenty_Region_North_Island-Vacations.html"
 [5] "/Tourism-g255678-Nelson_Nelson_Tasman_Region_South_Island-Vacations.html"                  
 [6] "/Tourism-g255113-Taupo_Taupo_District_Waikato_Region_North_Island-Vacations.html"          
 [7] "/Tourism-g255109-Napier_Hawke_s_Bay_Region_North_Island-Vacations.html"                    
 [8] "/Tourism-g612500-Wanaka_Otago_Region_South_Island-Vacations.html"                          
 [9] "/Tourism-g255679-Russell_Bay_of_Islands_Northland_Region_North_Island-Vacations.html"      
[10] "/Tourism-g255114-Tauranga_Bay_of_Plenty_Region_North_Island-Vacations.html"  

至于步骤 (c),我发现了一些有用的 link 可能对此有所帮助: https://github.com/hadley/rvest/blob/master/demo/tripadvisor.R http://notesofdabbler.github.io/201408_hotelReview/scrapeTripAdvisor.html

如果您对如何扩展热门目的地列表或如何以更智能的方式完成其他步骤有任何建议,请告诉我,我非常期待收到您的来信。

非常感谢!

基本上,您可以尝试向 <div class="morePopularCities"> 发送点击事件。像这样:

remDr$navigate(tu)
div <- remDr$findElement("class", "morePopularCities")
div$clickElement()

要展开所有位置,您可以在while 循环中重复上述逻辑。继续点击 <div> 直到没有可用的项目(直到 div 不再出现在页面中):

divs <- remDr$findElements("class", "morePopularCities")
while(length(divs )>0) {
  for(div in divs ){
    div$clickElement()
  }
  divs <- remDr$findElements("class", "morePopularCities")
}

我不是很流利R,你可能会觉得我的代码示例不够漂亮,欢迎提出建议。