3

I'm having problems using the JSONlite package in R to collect Dota2 match data using the Steam API. I am not an experienced developer and really appreciate any help. Thanks!

I have created a script in R. When I check the API call using a web browser it correctly returns the JSON contents, but when I execute the very same API call in R (either in a for loop or as a single call) using the fromJSON() function, I get the following errors:

Error in open.connection(con, "rb") : HTTP error 503.
In addition: Warning message:
closing unused connection 3 (https://api.steampowered.com/IDOTA2Match_570/GetMatchDetails/V001/?match_id=2170111273&key=XXXXXXXXXXPLACEHOLDERXXXXXXXXXXX) 

This is the R script I have created to collect multiple JSON responses using the fromJSON command and jsonlite:

# Load required libraries

library(rvest)
library(stringr)
library(magrittr)
library(plyr)
library(dplyr)
library(tidyr)
library(knitr)
library(XML)
library(data.table)
library(foreign)
library(pbapply)
library(jsonlite)

## Set base url components

base.url_0 = "https://api.steampowered.com/IDOTA2Match_570/GetMatchDetails/V001/?match_id="
base.url_0.1 = "&key="
steamAPIkey = "XXXXXXXXXXPLACEHOLDERXXXXXXXXXXX" # Steam API Key

 ### Create for loop where each "i" is a DOTA2 match ID

for(i in seq(1:length(targets$match_id))) {

base.url = paste0(
  base.url_0,
  targets$match_id[i],
  base.url_0.1,
  steamAPIkey)
message("Retrieving page ", targets$match_id[i])

## Get JSON response and store into data.frame

ifelse(

  tmp_json <- fromJSON(
    txt = base.url,flatten = T), # if the json file exists

  as.data.frame(tmp_errors_1$matches) <- base.url # if the json file does not   exists

) # close ifelse statement

tmp_json <- try_default( 
  expr = 
    as.data.frame(tmp_json), # convert json file into a data frame
  default = 
    as.data.frame(tmp_errors_2$matches) <- base.url, quiet = T) # if error, add match id to a dataframe

## Rbindlist

l = list(results, tmp_json)
results <- rbindlist(l,fill = T)

## Sleep for x seconds

Sys.sleep(runif(1, 2, 3))

   ## End of loop
    }
4

0 回答 0