jsonlite: toJSON для объекта из пакета запросов Python приводит к массивам, прямой вызов API - нет - PullRequest
0 голосов
/ 17 апреля 2019

Я играю с некоторыми данными Fantasy Premier League, доступными через API.

Желаемый результат, вложенные кадры данных, достигается при выполнении следующего кода:

library(jsonlite)
url <- "https://fantasy.premierleague.com/drf/bootstrap-static"
fromJSON(url)

Если вы войдете в систему, вы получите больше данных. Я не могу заставить пакет httr работать с API, где-то читал, что он перестал работать после изменения SSL некоторое время назад.

Я могу войти в систему и получить данные, пройдя через Python, но в итоге получаю другой json. Код ниже иллюстрирует проблему. После прохождения Python значения помещаются в массивы (обратите внимание на скобки в нижнем выводе json):

library(tidyverse)
library(jsonlite)

# No authentication

# API url
bootstrapUrl <- "https://fantasy.premierleague.com/drf/bootstrap-static"

# Desired result
fromJSON(bootstrapUrl) %>% 
  toJSON() %>% 
  substr(., 1, 100)
#> {"phases":[{"id":1,"name":"Overall","num_winners":3,"start_event":1,"stop_event":38},{"id":2,"name":


# With authentication

library(reticulate)

use_python("/usr/bin/python3.6")
source_python("~/Projects/pl/api_request.py")
### api_request.py
#
#  import requests
#  
#  def py_get_json(subdomain):
#    session = requests.session()
#    apiUrl = "https://fantasy.premierleague.com/drf/"
#    loginUrl = 'https://users.premierleague.com/accounts/login/'
#    payload = {
#     'password': '',
#     'login': '',
#     'redirect_uri': 'https://fantasy.premierleague.com/a/login',
#     'app': 'plfpl-web'
#    }
#    session.post(loginUrl, data=payload)
#    targetUrl = apiUrl + subdomain
#    
#    return session.get(targetUrl).json()
#
###

subdomain <- "bootstrap-static"
json <- py_get_json(subdomain)

json %>%
  toJSON() %>% 
  substr(., 1, 100)
#> {"phases":[{"id":[1],"name":["Overall"],"num_winners":[3],"start_event":[1],"stop_event":[38]},{"id"

Я предполагаю, что это связано с тем, как объект Python возвращается в R через reticulate. Я ищу легкое исправление, есть ли в jsonlite какая-нибудь функциональность, которая может с этим разобраться?

...