2016-01-06 16 views
8

Mi sto bloccando sui cookie quando provo a scaricare un PDF.Utilizzo di R per accettare i cookie per scaricare un file PDF

Per esempio, se ho un DOI per un documento PDF sul Data Service Archeologia, si risolverà a this landing page con una embedded link in it to this pdf ma che reindirizza veramente this altro collegamento.

library(httr) gestirà la risoluzione del DOI e possiamo estrarre l'URL pdf dalla pagina di destinazione utilizzando library(XML) ma sono bloccato a ottenere il PDF stesso.

Se faccio questo:

download.file("http://archaeologydataservice.ac.uk/archiveDS/archiveDownload?t=arch-1352-1/dissemination/pdf/Dyfed/GL44004.pdf", destfile = "tmp.pdf") 

poi ricevo un file HTML che è lo stesso di http://archaeologydataservice.ac.uk/myads/

Cercando la risposta a How to use R to download a zipped file from a SSL page that requires cookies mi porta a questo:

library(httr) 

terms <- "http://archaeologydataservice.ac.uk/myads/copyrights" 
download <- "http://archaeologydataservice.ac.uk/archiveDS/archiveDownload" 
values <- list(agree = "yes", t = "arch-1352-1/dissemination/pdf/Dyfed/GL44004.pdf") 

# Accept the terms on the form, 
# generating the appropriate cookies 

POST(terms, body = values) 
GET(download, query = values) 

# Actually download the file (this will take a while) 

resp <- GET(download, query = values) 

# write the content of the download to a binary file 

writeBin(content(resp, "raw"), "c:/temp/thefile.zip") 

Ma dopo le funzioni POST e GET ottengo semplicemente l'HTML della stessa pagina di cookie che ho ottenuto con download.file:

> GET(download, query = values) 
Response [http://archaeologydataservice.ac.uk/myads/copyrights?from=2f6172636869766544532f61726368697665446f776e6c6f61643f61677265653d79657326743d617263682d313335322d3125324664697373656d696e6174696f6e2532467064662532464479666564253246474c34343030342e706466] 
    Date: 2016-01-06 00:35 
    Status: 200 
    Content-Type: text/html;charset=UTF-8 
    Size: 21 kB 
<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h... 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 
     <head> 
      <meta http-equiv="Content-Type" content="text/html; c... 


      <title>Archaeology Data Service: myADS</title> 

      <link href="http://archaeologydataservice.ac.uk/css/u... 
... 

Guardando http://archaeologydataservice.ac.uk/about/Cookies sembra che la situazione dei cookie in questo sito è complicato. Sembra che questo tipo di cookie non sia insolito per i fornitori di dati nel Regno Unito: automating the login to the uk data service website in R with RCurl or httr

Come posso utilizzare R per superare i cookie su questo sito?

risposta

6

L'appello rOpenSci è stato ascoltato!

C'è un sacco di javascript tra quelle pagine che rende alquanto fastidioso provare a decifrare tramite httr + rvest. Prova RSelenium. Questo ha funzionato su OS X 10.11.2, R 3.2.3 & caricato da Firefox.

library(RSelenium) 

# check if a sever is present, if not, get a server 
checkForServer() 

# get the server going 
startServer() 

dir.create("~/justcreateddir") 
setwd("~/justcreateddir") 

# we need PDFs to download instead of display in-browser 
prefs <- makeFirefoxProfile(list(
    `browser.download.folderList` = as.integer(2), 
    `browser.download.dir` = getwd(), 
    `pdfjs.disabled` = TRUE, 
    `plugin.scan.plid.all` = FALSE, 
    `plugin.scan.Acrobat` = "99.0", 
    `browser.helperApps.neverAsk.saveToDisk` = 'application/pdf' 
)) 
# get a browser going 
dr <- remoteDriver$new(extraCapabilities=prefs) 
dr$open() 

# go to the page with the PDF 
dr$navigate("http://archaeologydataservice.ac.uk/archives/view/greylit/details.cfm?id=17755") 

# find the PDF link and "hit ENTER" 
pdf_elem <- dr$findElement(using="css selector", "a.dlb3") 
pdf_elem$sendKeysToElement(list("\uE007")) 

# find the ACCEPT button and "hit ENTER" 
# that will save the PDF to the default downloads directory 
accept_elem <- dr$findElement(using="css selector", "a[id$='agreeButton']") 
accept_elem$sendKeysToElement(list("\uE007")) 

Attendere il completamento del download. La console R non sarà occupata durante il download, quindi è facile chiudere la sessione accidentalmente, prima che il download sia completato.

# close the session 
dr$close() 
+0

Ha provato su Ubuntu 14.04, R 3.2.3 e Firefox. 'dr $ open()' riporta '[1]" Connessione al server remoto " Errore non definito in RCurl call.Error in queryRD (paste0 (serverURL,"/sessione ")," POST ", qdata = toJSON (serverOpts)): –

+1

Questa è sempre stata la mia più grande nit da scegliere con il Selenium in generale (non necessariamente con il pacchetto Rkg). Ottenere coerenza tra Windows, OS X e * nix è così difficile.Speriamo che la gente possa aggiungere a questo (tutti i miei sistemi * nix sono cose server-y headless configurate in modo molto sottile e non sono abt a cercare di padroneggiare il driver phantomjs stasera :-) – hrbrmstr

+2

OK, ho trovato come farlo funzionare sul mio computer. Ho dovuto avviare manualmente il server autonomo di selenio prima con 'java -jar selenium-server-standalone-2.48.0.jar'. Quindi posso connettermi. –

3

Questa risposta è venuto da John Harrison per e-mail, postato qui su sua richiesta:

questo vi permetterà di scaricare il PDF:

appURL <- "http://archaeologydataservice.ac.uk/archiveDS/archiveDownload?t=arch-1352-1/dissemination/pdf/Dyfed/GL44004.pdf" 
library(RCurl) 
library(XML) 
curl = getCurlHandle() 
curlSetOpt(cookiefile="cookies.txt" 
      , curl=curl, followLocation = TRUE) 
pdfData <- getBinaryURL(appURL, curl = curl, .opts = list(cookie = "ADSCOPYRIGHT=YES")) 
writeBin(pdfData, "test2.pdf") 

Ecco una versione più lunga che mostra il suo lavoro

appURL <- "http://archaeologydataservice.ac.uk/archiveDS/archiveDownload?t=arch-1352-1/dissemination/pdf/Dyfed/GL44004.pdf" 
library(RCurl) 
library(XML) 
curl = getCurlHandle() 
curlSetOpt(cookiefile="cookies.txt" 
      , curl=curl, followLocation = TRUE) 
appData <- getURL(appURL, curl = curl) 

# get the necessary elements for the POST that is initiated when the ACCEPT button is pressed 

doc <- htmlParse(appData) 
appAttrs <- doc["//input", fun = xmlAttrs] 
postData <- lapply(appAttrs, function(x){data.frame(name = x[["name"]], value = x[["value"]] 
                , stringsAsFactors = FALSE)}) 
postData <- do.call(rbind, postData) 

# post your acceptance 
postURL <- "http://archaeologydataservice.ac.uk/myads/copyrights.jsf;jsessionid=" 
# get jsessionid 
jsessionid <- unlist(strsplit(getCurlInfo(curl)$cookielist[1], "\t"))[7] 

searchData <- postForm(paste0(postURL, jsessionid), curl = curl, 
         "j_id10" = "j_id10", 
         from = postData[postData$name == "from", "value"], 
         "javax.faces.ViewState" = postData[postData$name == "javax.faces.ViewState", "value"], 
         "j_id10:_idcl" = "j_id10:agreeButton" 
         , binary = TRUE 
) 
con <- file("test.pdf", open = "wb") 
writeBin(searchData, con) 
close(con) 


Pressing the ACCEPT button on the page you gave initiates a POST to "http://archaeologydataservice.ac.uk/myads/copyrights.jsf;jsessionid=......" via some javascript. 
This post then redirects to the page with the pdf having given some additional cookies. 

Checking our cookies we see: 

> getCurlInfo(curl)$cookielist 
[1] "archaeologydataservice.ac.uk\tFALSE\t/\tFALSE\t0\tJSESSIONID\t3d249e3d7c98ec35998e69e15d3e" 
[2] "archaeologydataservice.ac.uk\tFALSE\t/\tFALSE\t0\tSSOSESSIONID\t3d249e3d7c98ec35998e69e15d3e" 
[3] "archaeologydataservice.ac.uk\tFALSE\t/\tFALSE\t0\tADSCOPYRIGHT\tYES"   

so it would probably be sufficient to set that last cookie to start with (indicating we accept copyright) 
Problemi correlati