R webscraping «Проблема с сертификатом SSL: срок действия сертификата истек», но работает в браузере. Нужно проанализировать HTML в JSON

#r #json #ssl #web-scraping

Вопрос:

Я нашел частичное решение своего вопроса, но мне все еще нужна помощь, чтобы добраться до конца.

Моя проблема в том, что я больше не могу получать JSON с веб-сайта с помощью R, но я все еще могу получить к нему доступ через свой браузер:

 library(rvest)
library(httr)
library(jsonlite)
library(dplyr)

website <- 'http://api.draftkings.com/sites/US-DK/sports/v1/sports?format=json'
fromJSON(website)
 

Теперь дает мне:
Error in open.connection(con, "rb") : SSL certificate problem: certificate has expired но я все еще могу посещать сайт в Chrome.

В идеале я хотел бы найти способ заставить это работать с помощью fromJSON()

Я не совсем понимаю, что вызывает эту ошибку, поэтому я перепробовал кучу разных решений. Я обнаружил, что могу, по крайней мере, прочитать html, используя это:

 website <- 'http://api.draftkings.com/sites/US-DK/sports/v1/sports?format=json'
doc <- webpage %>% 
  httr::GET(config = httr::config(ssl_verifypeer = FALSE)) %>% 
  read_html()  
 

Однако отсюда я застрял. Я изо всех сил пытаюсь проанализировать документ в JSON, который мне нужен. Я пробовал что-то вроде doc %>% xmlParse() %>% xmlToList() %>% toJSON() %>% fromJSON() этого, но это выходит как тарабарщина.

Поэтому мой вопрос сводится к следующему: 1) есть ли способ обойти проблему с сертификатом SSL, чтобы я мог fromJSON() снова использовать его напрямую. И 2) Если нет, то как я могу очистить html-документ, чтобы получить его в удобном формате JSON?

Комментарии:

1. Это связано с корневым сертификатом Let’s Encrypt, срок действия которого истек 30 сентября. Необходимо обновить доверенные сертификаты, поставляемые вместе с вашей операционной системой. Базовые системные библиотеки-это то, что R использует для выполнения этих запросов.

2. Спасибо @Brian, похоже, что первым шагом является обновление моей операционной системы? У меня есть MacBook 2019 года под управлением Catalina v10.15.4. Спасибо за вашу помощь

3. Вы можете обновить свою операционную систему или вручную добавить новый корневой сертификат (и, что важно, удалить старый) в свою связку ключей. Однако способ, который вы используете httr во втором фрагменте кода, вы должны иметь возможность заменить read_html на ...%>% content(as = "text") %>% fromJSON() , так как конфигурация SSL, которую вы передали, обходит сертификаты.

4. Интересно, что мой сертификат com.apple.systemdefault говорит, что срок его действия истекает только в 2037 году, что заставляет меня думать, что проблема не в этом. Есть какие-нибудь мысли? Но вторая часть вашего решения работает для меня, так что не беспокойтесь, если я не смогу получить первую часть. Спасибо!

5. Проблема также затрагивает Curl, Read_html и многие другие инструменты. Переопределение с помощью set_config(конфигурация(ssl_verifypeer = 0L)) не удалось. Ниже приведен пример, вызывающий ошибку. целевая страница библиотеки(httr) = » =2021-10-02T00:00:00UTCamp;time erddap.gcoos.org/erddap/tabledap/… » read_html(Целевая страница)