2016-02-13 29 views
5

Próbuję zeskanować numer telefonu z tej strony: http://olx.pl/oferta/pokoj-1-os-bielany-encyklopedyczna-CID3-IDdX6wf.html#c1c0e14c53. Numer telefonu można ociera z rvest pakiecie z selektorem .\'id_raw\'\::nth-child(1) span+ div strong (sugerowane przez selectorGadget.Jak wyświetlać informacje za pomocą R-screen?

Problemem jest to, że informacje mogą być uzyskane po jego maska ​​jest kliknięty. Więc jakoś muszę otworzyć sesję, zapewniają charakterystyczne kliknięcie, a następnie zeskrobać informacja.

EDIT przy okazji to nie jest związek imho. Wystarczy popatrzeć na źródło. mam problem, bo jestem zwykłym użytkownikiem R, nie javascript programista.

enter image description here

+1

Czy próbowałeś RSelenium? – Jota

Odpowiedz

6

Można pobrać dane osadzone w <li> znaczników, które opowiada obsługi onclick co robić i po prostu dane bezpośrednio:

library(httr) 
library(rvest) 
library(purrr) 
library(stringr) 

URL <- "http://olx.pl/oferta/pokoj-1-os-bielany-encyklopedyczna-CID3-IDdX6wf.html#c1c0e14c53" 

pg <- read_html(URL) 

html_nodes(pg, "li.rel") %>%  # get the 'special' <li> tags 
    html_attrs() %>%     # extract all the attrs (they're non-standard) 
    flatten_chr() %>%    # list to character vector 
    keep(~grepl("rel \\{", .x)) %>% # only want ones with 'hidden' secret data 
    str_extract("(\\{.*\\})") %>% # only get the data 
    unique() %>%      # there are duplicates 
    map_df(function(x) { 

    path <- str_match(x, "'path':'([[:alnum:]]+)'")[,2]     # extract out the path 
    id <- str_match(x, "'id':'([[:alnum:]]+)'")[,2]      # extract out the id 

    ajax <- sprintf("http://olx.pl/ajax/misc/contact/%s/%s/", path, id) # make the AJAX/XHR URL 
    value <- content(GET(ajax))$value         # get the data 

    data.frame(path=path, id=id, value=value, stringsAsFactors=FALSE) # make a data frame 

    }) 

## Source: local data frame [3 x 3] 
## 
##   path id  value 
##   (chr) (chr)  (chr) 
## 1  phone dX6wf 503 155 744 
## 2  skype dX6wf e.bobruk 
## 3 communicator dX6wf  7686136 

zrobiwszy wszystko, jestem bardzo rozczarowany, że witryna nie ma lepszych warunków korzystania z usługi/użytkowania. To dość oczywiste, że naprawdę nie chcą, żebyś skrobał te dane.

+0

Miło, że istnieje rozwiązanie bez konieczności korzystania z zewnętrznego oprogramowania/programów. Czy spotkałeś się z sytuacją, w której ** potrzebujesz **, aby użyć czegoś takiego jak "selen", lub czy zazwyczaj robisz wszystko w "R"? – tospig

+1

Staram się go nie używać, ponieważ idiomy przedstawione w pliku RSelenium pkg używają MOM "Hadleyverse". Ale zdecydowanie są czasy, kiedy to konieczne. – hrbrmstr

3

Oto rozwiązanie z użyciem RSelenium, (RSelenium introduction) i phantomjs.

Jednak nie jestem pewien, jak użyteczne jest to, ponieważ działa bardzo wolno na moim komputerze, a ja nie jestem phantomjs lub selen ekspertem więc nie wiem, gdzie poprawa prędkości mogą być jeszcze wykonane, więc coś do zbadania ...

Edit

próbowałem to ponownie i wydaje się być ok dla szybkości.

library(RSelenium) 
library(rvest) 

## Terminal command to start selenium (on ubuntu) 
## cd ~/selenium && java -jar selenium-server-standalone-2.48.2.jar 
url <- "http://olx.pl/oferta/pokoj-1-os-bielany-encyklopedyczna-CID3-IDdX6wf.html#c1c0e14c53" 

RSelenium::startServer() 
remDr <- remoteDriver(browserName = "phantomjs") 

remDr$open() 
remDr$navigate(url) 

# css <- ".cpointer:nth-child(1)" ## couldn't get this to work 
xp <- "//div[@class='contactbox-indent rel brkword']" 
webElem <- remDr$findElement(using = 'xpath', xp) 

# webElem <- remDr$findElement(using = 'css selector', css) 
webElem$clickElement() 

## the page source now includes the clicked element 
page_source <- remDr$getPageSource()[[1]] 
pos <- regexpr('class=\\"xx-large', page_source) 

## you could write a more intelligent regex, but this works for now 
phone_number <- substr(page_source, pos + 11, pos + 21) 
phone_number 
# "503 155 744" 

# remDr$close() 
# remDr$closeServer() 
Powiązane problemy