2016-10-18 4 views
1

Ich habe viel gesucht, aber keine gute Lösung für mein Problem finden.R - Probleme bei der Analyse von JSON-Stream

Ich versuche, einige meiner Arbeit zu automatisieren und einige Daten von einer Website, die meine Firma verwendet, zu kratzen. (FYI - TOS scheint nicht zu zeigen, sie wollen nicht, falls jemand gekratzt werden fragen, also soll ich gut sein..)

Bisher habe ich den folgenden Code

library(devtools) 
library(RSelenium) 
library(XML) 
library(rvest) 
library(stringr) 
library(dplyr) 
library(knitr) 
library(magrittr) 
library(rjson) 
library(stringi) 

#login 
appURL <- 'URL I Am accessing/' 
pJS <- phantom() 
remDr <- remoteDriver(browserName = "phantomjs") 
remDr$open() 
remDr$maxWindowSize() 
remDr$navigate(appURL) 
UN <- remDr$findElement(using = 'xpath', "//*[@id='login-form']/div[2]/div[2]/input") 
UN$sendKeysToElement(list("Username")) 
PW <- remDr$findElement(using = 'xpath', "//*[@id='login-form']/div[2]/div[3]/input") 
PW$sendKeysToElement(list("password", key = "enter")) 

URL <- 'URL of page with data' 
remDr$navigate(URL) 
Sys.sleep(2) 

Source <- remDr$getPageSource()[[1]] 

Text <- read_xml(Source,encoding = "", as_html = F, options = "NOBLANKS") %>% 
    xml_text(trim = T) 

Text <- unlist(Text) 

Auf diesem Punkt ich habe eine Menge von Text, die JSON enthält aber die JSON ist wie folgt organisiert:

event: optionCollection 
id: 229 
data: [{JSON}] 

: 

event: pageDescription 
id: 230 
data: [{JSON}] 

: 
event: dataTable.headerRows 

id: 232 
data: [{JSON}] 
: 
event: dataTable.dataRows 
id: 233 
data: [{JSON}] 

Wo die JSON I muß die JSON Zusammenhang mit der Veranstaltung: dataTable.headerRows und dataTable.dataRows.

Es gibt normalerweise mehrere DataRows-Ereignisse, aus denen ich Daten extrahieren muss.

Kann jemand einen Vorschlag machen, wie man diese in R bekommt?

Offen für alle Vorschläge oder wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.

Danke!

* Edit - Aktuellen Bibliotheken pro Anfrage hinzugefügt.

* Edit - @Parfait das ist, was zurückgegeben wird:

$event 
[1] "report.finished" 

$id 
[1] "2277" 

$data 
[1] "{\"status\":1}" 

$event 
[1] "report.finished" 


$id 
[1] "2277" 

$data 
[1] "{\"status\":1}" 

Dies erscheint nur in der tempfile.txt einmal so dass ich klar bin nicht, was das Problem verursacht, weil es der Code scheint sollte funktionieren. Hier

ist die schriftliche tmpfile mit den substituierten Daten für die Proben, die Sie in Ihrem Beitrag zur Verfügung gestellt:

https://1drv.ms/t/s!AlEviX19YBNogaZGAHCUCC_ZDEI5OA

+0

Geben Sie bitte alle ' library() 'Linien, damit wir richtig reproduzieren können. – Parfait

+0

@Parfait hinzugefügt Bibliothek(). Ich glaube nicht, dass ich all diese im Moment verwende –

+0

ist 'Text' alle JSON, oder nur die Bits innerhalb der' [{JSON}] 'Abschnitt? Wenn es nicht alles JSON ist, welche Struktur ist das? – SymbolixAU

Antwort

1

Betrachten Sie die Zeichenfolge Zeile für Zeile mit readLines() Lesen und den Aufbau einer Liste von Ereignis, ID und Daten Elemente, wobei Daten werden JSON-Strings sein. Aber zuerst die Zeichenfolge in die Datei mit writeLines() ablegen. Der Doppelpunkt-only Linie wird als Trennzeichen zwischen Listenelementen verwendet und muss erscheinen, wie Sie es haben:

writeLines(Text, "tempfile.txt")        # CREATE TEMP FILE 
con <- file("tempfile.txt", open="r")       # OPEN CONNECTION 

datalist <- c() 
while (length(line <- readLines(con, n=1, warn = FALSE)) > 0) {  
    if (grepl("event:", line)==TRUE){ 
    eventitem <- gsub("event: ", "", line)      # EVENT LINE 
    } 
    else if (grepl("id:", line)==TRUE){ 
    iditem <- gsub("id: ", "", line)       # ID LINE 
    } 
    else if (grepl("data:", line)==TRUE){ 
    dataitem <- gsub("data: ", "", line)      # DATA LINE 
    } 
    else if (grepl("^:", line)==TRUE) { 
    # COLON ONLY-LINE (APPENDING NESTED LIST ITEMS) 
    datalist <- c(datalist, list(event=eventitem, id=iditem, data=dataitem)) 
    } 
    else { 
    dataitem <- paste0(dataitem, gsub("data: ", "", line))  # ADD DATA LINES 
    } 
} 

# REMAINING LAST LIST ITEMS 
datalist <- c(datalist, list(event=eventitem, id=iditem, data=dataitem)) 
close(con)              # CLOSE CONNECTION 

unlink("tempfile.txt")           # DELETE TEMP FILE 

Output(unter Verwendung eines Beispiels Wiederholung JSON)

$event 
[1] "optionCollection"  
$id 
[1] "229"  
$data 
[1] "[{\"sales\": {\"sales_val\": 22549,\"units_in_stock\": 
    251,\"product_id\": \"0141602\"},\"sales\": {\"sales_val\": 
    22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"},\"sales\": 
    {\"sales_val\": 22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"}}]" 

$event 
[1] "pageDescription"  
$id 
[1] "230"  
$data 
[1] "[{\"sales\": {\"sales_val\": 22549,\"units_in_stock\": 
    251,\"product_id\": \"0141602\"},\"sales\": {\"sales_val\": 
    22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"},\"sales\": 
    {\"sales_val\": 22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"}}]" 

$event 
[1] "dataTable.headerRows"  
$id 
[1] "232"  
$data 
[1] "[{\"sales\": {\"sales_val\": 22549,\"units_in_stock\": 
    251,\"product_id\": \"0141602\"},\"sales\": {\"sales_val\": 
    22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"},\"sales\": 
    {\"sales_val\": 22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"}}]" 

$event 
[1] "dataTable.dataRows"  
$id 
[1] "233"  
$data 
[1] "[{\"sales\": {\"sales_val\": 22549,\"units_in_stock\": 
    251,\"product_id\": \"0141602\"},\"sales\": {\"sales_val\": 
    22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"},\"sales\": 
    {\"sales_val\": 22549,\"units_in_stock\": 251,\"product_id\": \"0141602\"}}]" 
+0

Das ist erstaunlich, aber es hat nicht ganz funktioniert. Wenn ich die Liste zurückgebe, erhalte ich nur das letzte Element aus der Liste, das zweimal wiederholt wird. –

+0

Ich habe das Problem gefunden. Entfernen Sie in der Bedingung "Nur-Doppelpunkt" das Dollarzeichen in der Datei grepl: '(grepl (" ^: ", Zeile) == TRUE)'. Wahrscheinlich sind einige Räume nach dem Doppelpunkt. – Parfait

+0

Vielen Dank für die ausgezeichnete Antwort! Das hat es gelöst. –