首页 > 解决方案 > 火车延误 - 错误:词法错误:json 文本中的无效字符

问题描述

我几个月前设计了以下脚本,它没有任何问题。最近几天我尝试重新运行相同的脚本,但总是遇到相同的错误。我已经更改了我的脚本并更新了软件包,但我无法让它再次工作。剧本应该告诉我比利时火车站的所有延误。

我添加了两个单独的脚本(一个充满了函数)和错误/回溯。

library(httr)
library(jsonlite)
library(tidyverse)

load.stations <- function(){
  a <- GET("https://api.irail.be/stations/?format=json") #get command for all stations from irail api
  parsed <- jsonlite::fromJSON(content(a, "text"), flatten=TRUE) #parse json into r
  stations <- parsed$station %>% 
    filter(grepl("^BE.NMBS.0088",id)) #keep only stations in Belgium. Regular expression ^ is begins with  
  return(stations)
}

get.time <- function(){
  time <- paste(format(Sys.time(),"%d/%m/%y %H:%M:%S")) #formats system time in dd/mm/yyyy hh:mm:ss in a string
  strpt <- strptime(time,"%d/%m/%y %H:%M:%S") #takes time-string and converts to interpretable date and time
  return(strpt)
}

get.temp_df <- function(stations, i){
  goget <- paste0("https://api.irail.be/liveboard/?format=json&id=",stations$id[i]) #http for get command, get liveboard (similar to screens in station i)
  c <- GET(goget) #get the data
  parsed_c <- jsonlite::fromJSON(content(c, "text"), flatten=TRUE) #parse from json
  temp_df <- parsed_c$departures$departure #get the dataframe with departures from the parsed json
  return(temp_df)
}

add.to.all <- function(all_df, temp_df){
  all_df <- rbind(all_df,temp_df)%>% #add temporary dataframe to master dataframe
    group_by(stationneke,time,vehicle)%>% # group departure times by station - remove doubles
    top_n(1,importtime)%>% #only keep the most recent observation  - remove doubles 2
    ungroup() #lift grouping
  return(all_df)
}

save.day <- function(all_df){
  strpt <- get.time()
  saveRDS(all_df,file = paste(strpt$mday, strpt$mon+1, strpt$year+1900,"Punct.rda",sep = "-"))
  Sys.sleep(time = 3600-(strpt$min*60+strpt$sec)) #sleep one hour minus number of secs in the sleep time
  return(data.frame())
}
library(httr)
library(jsonlite)
library(tidyverse)

## all departures - scraper

loop.scraper <- function(hour_of_pause =3){
  source("NMBS-punctuality-functions.R")
  all_df <- data.frame() #leeg dataframe
  stations <- load.stations()
  while (TRUE) { #infinite loop
    strpt <- get.time()
    while(strpt$hour != hour_of_pause){ #enters loop when hour is not "hour_of_pause"
      # startloop <- (strpt$min*60 + strpt$sec)
      for (i in 1:nrow(stations)) { #second loop through the stations
        temp_df <- get.temp_df(stations, i)
        if(is.null(temp_df)) next #skip if dataframe is empty (some stations have been closed in recent years)
        temp_df$stationneke <- stations$name[i] #add departure station name i to the dataframe
        temp_df$importtime <- Sys.time() # add variable with the time of import of the observation
        all_df <- add.to.all(all_df, temp_df)
        strpt <- get.time()
      } #end of loop through stations
      # stoploop <- (strpt$min*60 + strpt$sec)
    } #end of hour-check loop, code below only executed when no trains active (at night)
    all_df <- save.day(all_df) #saves file and returns empty dataframe
  }
}
 Error: lexical error: invalid char in json text.
                                       <br /> <b>Fatal error</b>:  Unc
                     (right here) ------^ 
5.
parse_string(txt, bigint_as_char) 
4.
parseJSON(txt, bigint_as_char) 
3.
parse_and_simplify(txt = txt, simplifyVector = simplifyVector, 
    simplifyDataFrame = simplifyDataFrame, simplifyMatrix = simplifyMatrix, 
    flatten = flatten, ...) 
2.
jsonlite::fromJSON(content(c, "text"), flatten = TRUE) 
1.
loop.scraper(12) 

标签: rwhile-loop

解决方案


推荐阅读