¿Cómo webscrapear páginas aseguradas en R (enlaces https) (usando readHTMLTable del paquete XML)?

Hay buenas respuestas sobre SO sobre cómo usar readHTMLTable desde el paquete XML y lo hice con páginas http regulares, sin embargo, no puedo resolver mi problema con las páginas https.

Estoy tratando de leer la tabla en este sitio web (url string):

library(RTidyHTML) library(XML) url <- "https://ned.nih.gov/search/ViewDetails.aspx?NIHID=0010121048" h = htmlParse(url) tables <- readHTMLTable(url) 

Pero obtengo este error: el archivo https://ned.nih.gov/search/Vi…no existe.

Traté de superar el problema de https con esto (las primeras 2 líneas a continuación) (desde el uso de google para encontrar una solución (como aquí: http://tonybreyal.wordpress.com/2012/01/13/ra-quick-scrape-of) -top-grossing-films-from-boxofficemojo-com / ).

Este truco ayuda a ver más de la página, pero cualquier bash de extraer la tabla no funciona. Cualquier consejo apreciado. Necesito los campos de la tabla como Organización, Título de la organización, Administrador.

  #attempt to get past the https problem raw <- getURL(url, followlocation = TRUE, cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) head(raw) [1] "\r\n\n\n\n<meta http-equiv=\"Content-Type\" content=\"text/html; ... h = htmlParse(raw) Error in htmlParse(raw) : File ... tables <- readHTMLTable(raw) Error in htmlParse(doc) : File ... 

El nuevo paquete httr proporciona una envoltura alrededor de RCurl para que sea más fácil RCurl todo tipo de páginas.

Aún así, esta página me dio una buena cantidad de problemas. Lo siguiente funciona, pero sin duda hay formas más sencillas de hacerlo.

 library("httr") library("XML") # Define certicificate file cafile < - system.file("CurlSSL", "cacert.pem", package = "RCurl") # Read page page <- GET( "https://ned.nih.gov/", path="search/ViewDetails.aspx", query="NIHID=0010121048", config(cainfo = cafile) ) # Use regex to extract the desired table x <- text_content(page) tab <- sub('.*(.*).*', '\\1', x) # Parse the table readHTMLTable(tab)

Los resultados:

 $ctl00_ContentPlaceHolder_dvPerson V1 V2 1 Legal Name: Dr Francis S Collins 2 Preferred Name: Dr Francis Collins 3 E-mail: francis.collins@nih.gov 4 Location: BG 1 RM 1261 CENTER DRBETHESDA MD 20814 5 Mail Stop: Â 6 Phone: 301-496-2433 7 Fax: Â 8 IC: OD (Office of the Director) 9 Organization: Office of the Director (HNA) 10 Classification: Employee 11 TTY: Â 

Obtenga httr aquí: http://cran.r-project.org/web/packages/httr/index.html


EDITAR: página útil con preguntas frecuentes sobre el paquete RCurl : http://www.omegahat.org/RCurl/FAQ.html

Usando la excelente forma de Andrie para pasar el https

una forma de obtener los datos sin readHTMLTable también está a continuación.

Una tabla en HTML puede tener una ID. En este caso, la tabla tiene una buena y la función XPath en getNodeSet lo hace muy bien.

 # Define certicificate file cafile < - system.file("CurlSSL", "cacert.pem", package = "RCurl") # Read page page <- GET( "https://ned.nih.gov/", path="search/ViewDetails.aspx", query="NIHID=0010121048", config(cainfo = cafile, ssl.verifypeer = FALSE) ) h = htmlParse(page) ns <- getNodeSet(h, "//table[@id = 'ctl00_ContentPlaceHolder_dvPerson']") ns 

Todavía necesito extraer los identificadores detrás de los hipervínculos.

por ejemplo, en lugar de collen baros como gerente, necesito llegar al ID 0010080638

Gerente: Colleen Barros

Esta es la función que tengo para enfrentar este problema. Detecta si https en url y usa httr si lo es.

 readHTMLTable2=function(url, which=NULL, ...){ require(httr) require(XML) if(str_detect(url,"https")){ page < - GET(url, user_agent("httr-soccer-ranking")) doc = htmlParse(text_content(page)) if(is.null(which)){ tmp=readHTMLTable(doc, ...) }else{ tableNodes = getNodeSet(doc, "//table") tab=tableNodes[[which]] tmp=readHTMLTable(tab, ...) } }else{ tmp=readHTMLTable(url, which=which, ...) } return(tmp) }