使用R从TripAdvisor搜索数据

时间:2015-04-18 05:46:01

标签: r xpath rselenium

我想创建一个可以从Trip Advisor中抓取一些数据的抓取工具。理想情况下,它会 (a)标识要抓取的所有位置的链接, (b)收集每个地点所有景点的链接 (c)会收集所有评论的目的地名称,日期和评分。 我现在想集中讨论(a)部分。

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

这里有问题:该链接提供了前10个目的地,如果您再点击“查看更多热门目的地”,它将展开列表。它似乎使用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")

最后一行应该在这里诀窍,但我不确定我需要在这里调用什么函数。

一旦我设法扩展此列表,我将能够以与解决(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),我发现了一些可能有用的有用链接: https://github.com/hadley/rvest/blob/master/demo/tripadvisor.R http://notesofdabbler.github.io/201408_hotelReview/scrapeTripAdvisor.html

如果您有关于如何扩展顶级目的地列表或如何以更智能的方式完成其他步骤的任何提示,请告诉我,我真的很想收到您的回复。

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

基本上,您可以尝试向<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,你可能会发现我的代码示例并不漂亮,请随时提出建议。