2016-02-13 4 views
5

Ich versuche, Telefonnummer von dieser Website zu kratzen: http://olx.pl/oferta/pokoj-1-os-bielany-encyklopedyczna-CID3-IDdX6wf.html#c1c0e14c53. Die Rufnummer kann mit rvest Paket mit Wahl .\'id_raw\'\::nth-child(1) span+ div strong (vorgeschlagen von selectorGadget.Wie scrappe on-click Informationen mit R?

Das Problem ist, dass die Informationen erhalten werden kann abgekratzt werden, nachdem seine Maske geklickt wird. Also irgendwie muss ich eine Sitzung öffnen, ein Klick zur Verfügung stellen und dann kratzen Informationen.

EDIT Durch die Art und Weise imho es ist kein Link. Werfen sie einen Blick an der Quelle. ich habe ein Problem, weil ich eine regelmäßige R Benutzer bin, kein Javascript programer.

enter image description here

+1

Haben Sie RSelenium probiert? – Jota

Antwort

6

Sie können die Daten in den <li> Tags eingebettet greifen, die den onclick Handler sagen, was die Daten zu tun und erhält nur direkt:

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 

alles getan zu haben, sie sind ziemlich enttäuscht, dass Website hat keine besseren Nutzungsbedingungen/Nutzungsbedingungen. Es ist ziemlich offensichtlich, dass sie wirklich nicht wollen, dass Sie diese Daten abschaben.

+0

Schön, dass es eine Lösung gibt, ohne externe Software/Programme verwenden zu müssen. Bist du auf eine Situation gestoßen, in der du etwas wie Selen benutzen musst, oder kannst du normalerweise alles in R machen? – tospig

+1

Ich versuche, es nicht zu verwenden, da die Idiome, die im RSelenium pkg cld dargestellt werden, ein "Hadleyverse" makeover IMO verwenden. Aber es gibt definitiv Zeiten, in denen es notwendig ist. – hrbrmstr

3

Hier ist eine Lösung mit RSelenium, (RSelenium introduction) und Phantomjs.

Allerdings bin ich nicht sicher, wie nützlich es ist, weil es sehr langsam auf meinem Rechner läuft, und ich bin kein Phantomjs oder Selenexperte, also weiß ich nicht, wo Geschwindigkeitsverbesserungen noch gemacht werden können etwas zu suchen in ...

bearbeiten

ich habe dies noch einmal versucht und es scheint für die Geschwindigkeit in Ordnung zu sein.

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() 
Verwandte Themen