Сбор данных с TripAdvisor с помощью R

Я хочу создать сканер, который будет собирать данные с Trip Advisor. В идеале он будет (a) определять ссылки на все места для сканирования, (b) собирать ссылки на все достопримечательности в каждом месте и (c). strong> соберет названия пунктов назначения, даты и рейтинги для всех отзывов. Сейчас я хотел бы сосредоточиться на части (а).

Вот веб-сайт, с которого я начинаю: 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

Если у вас есть какие-либо советы о том, как расширить список популярных направлений или как более разумно пройти другие этапы, дайте мне знать, я буду очень рад услышать от вас.

Спасибо заранее!


person IVR    schedule 18.04.2015    source источник


Ответы (1)


По сути, вы можете попробовать отправить событие клика в <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, мой пример кода может показаться вам не очень красивым, не стесняйтесь предлагать.

person har07    schedule 18.04.2015
comment
спасибо @ har07, это сработало отлично! Как ни странно, иногда это ничего не делает. Это не большая проблема, так как я могу просто спамить эту кнопку, пока она не исчезнет (пока я не получу сообщение об ошибке). Я заметил еще одну странность: используя, например, remDr$findElement(using = 'xpath', '//div[@class="popularCities"]/a'), за которым следует webElem$getElementAttribute("text"), я получаю только первую запись. Еще раз, это не имеет большого значения, поскольку я могу изменить свое выражение xpath на '//div[@class="popularCities"]/a[X]', где X — это число, которое я хочу, но есть ли лучший способ? Большое спасибо! - person IVR; 18.04.2015
comment
@de1pher попробуйте remDr$findElements(...) (обратите внимание на s в конце findElements), чтобы получить несколько элементов, затем используйте цикл for, чтобы получить атрибут text из каждого элемента. Добро пожаловать :) - person har07; 18.04.2015