2015-04-18 13 views
8

Chcę utworzyć przeszukiwacz, który usunie niektóre dane z Trip Advisor. Idealnie będzie (a) zidentyfikować linki do wszystkich lokalizacjach pełzać, (b) zbierać linki do wszystkich atrakcji w każdym miejscu i (c) zbierze przeznaczenia nazwy, daty i oceny wszystkie recenzje. Chciałbym skupić się na części (a) na razie.Skrecanie danych z witryny TripAdvisor przy użyciu R

Oto strona Zaczynam mecz: http://www.tripadvisor.co.nz/Tourism-g255104-New_Zealand-Vacations.html

Nie ma problemu tutaj: link daje 10 najpopularniejszych miejsc na początek, a jeśli potem kliknij „Zobacz więcej popularnych miejsc” będzie rozwiń listę. Wygląda na to, że używa do tego funkcji javascript. Niestety, nie jestem zaznajomiony z javascript, ale myślę, że następujący fragment może dać wskazówki na temat jak to działa:

<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> 

Znalazłem kilka przydatnych pakietów webscraping dla badań, takich jak rvest, RSelenium, XML , RCurl, ale z tych, tylko RSelenium wydaje się być w stanie rozwiązać ten problem, po tym jak powiedziałem, wciąż nie byłem w stanie tego rozwiązać.

Oto odpowiedni kod:

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") 

Ostatni wiersz powinien wykonać trick tutaj, ale nie jestem pewien, co funkcja Muszę zadzwonić tutaj.

Gdy uda mi się rozwinąć tę listę, będę mógł uzyskać linki do każdego miejsca przeznaczenia w ten sam sposób, w jaki rozwiązałem część (b) i myślę, że już to rozwiązałem (dla zainteresowanych):

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" 

jak w etapie (c), znalazłem kilka przydatnych linków, które mogą być pomocne dla że: https://github.com/hadley/rvest/blob/master/demo/tripadvisor.R http://notesofdabbler.github.io/201408_hotelReview/scrapeTripAdvisor.html

Jeśli masz jakieś wskazówki, w jaki sposób rozwinąć listę najlepszych miejsc przeznaczenia lub sposobu aby przejść przez inne kroki w inteligentniejszy sposób, proszę dać mi znać, będę bardzo chciałbym usłyszeć od ciebie.

Wielkie dzięki z góry!

Odpowiedz

3

Zasadniczo możesz spróbować wysłać zdarzenie kliknięcia do <div class="morePopularCities">. Coś takiego:

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

Aby rozwinąć wszystkie lokalizacje, można powtórzyć powyższą logikę w pętli while. Zachować klikając na <div> dopóki nie więcej dostępnych przedmiotów (do div już na stronie):

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

Nie jestem biegły w R, można znaleźć przykład kodu nie ładny, nie krępuj się sugerować.

+0

dzięki @ har07, które działały idealnie! Co dziwne, czasami nic nie robi. Nie stanowi to jednak problemu, ponieważ mogę po prostu spamować ten przycisk, dopóki nie zniknie (dopóki nie pojawi się błąd). Zauważyłem inną osobliwość - używając 'remDr $ findElement (using = 'xpath', '// div [@ class =" popularneCities "]/a')' po którym następuje 'webElem $ getElementAttribute (" text ")' for przykład, mam tylko pierwszy wpis.Ponownie nie jest to biggie, ponieważ mogę zmodyfikować moje wyrażenie Xpath na ''// div [@ class =" popularneCities "]/a [X]'' gdzie X jest numerem, którego chcę, ale czy jest lepszy droga? Wielkie dzięki! – IVR

+1

@ de1pher wypróbuj 'remDr $ findElements (...)' (zwróć uwagę na końcowe "' s' "w' findElements'), aby uzyskać wiele elementów, a następnie użyj pętli 'for', aby uzyskać atrybut' text' z każdego elementu. Zapraszamy :) – har07