2016-01-06 38 views
8

PDFをダウンロードしようとするとクッキーがつまってしまいます。例えばRを使用してクッキーを受け入れてPDFファイルをダウンロードする

私は考古学データサービス上のPDF文書のDOIを持っている場合、それはembedded link in it to this pdfthis landing page に解決が、本当にthis他のリンクにリダイレクトされます。

library(httr)はDOIの解決を処理し、library(XML)を使用してリンク先ページからpdf URLを抽出できますが、私はPDF自体を取得することに固執しています。

私が行う場合は、この:私はHow to use R to download a zipped file from a SSL page that requires cookiesの答えをしようとhttp://archaeologydataservice.ac.uk/myads/

と同じであるHTMLファイルを受け取り、その後

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

はこれに私をリード:

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") 

しかし、 POSTGETの機能の後、私は単にと同じCookieページのHTMLを取得します:

http://archaeologydataservice.ac.uk/about/Cookiesを見て
> 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... 
... 

このサイトでのクッキーの状況は複雑であると思われます。この種のCookieの複雑さは、英国のデータプロバイダにとって珍しいことではないようです:automating the login to the uk data service website in R with RCurl or httr

このウェブサイトでクッキーを取得するにはどうすればよいですか?

答えて

6

rOpenSciにあなたの嘆願書がありました!

これらのページの間には、httr + rvestで解読しようとすると面倒なことになるJavaScriptがたくさんあります。試してくださいRSelenium。これは、OS X 10.11.2、R 3.2.3 & 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")) 

ダウンロードが完了するまでお待ちください。 Rコンソールがダウンロード中にビジー状態になることはないので、ダウンロードが完了する前に、誤ってセッションを閉じるのは簡単です。

# close the session 
dr$close() 
+0

Ubuntu 14.04、R 3.2.3、Firefoxをお試しください。リモートサーバへの接続 RCurl呼び出しでの定義されていないエラーです。queryRD(paste0(serverURL、 "/ session")、 "POST"、qdata = toJSON(serverOpts) ): ' –

+1

これは、セレンの一般的な選択(必ずしもR pkgではない)のための私の最大のニットでした。 Windows、OS Xと* nixの整合性を取ることはとても難しいです。うまくいけば、人々はこれに追加することができます(私のすべての* nixシステムは非常に薄く構成されているヘッドレスサーバーのものと私は今夜phantomjsドライバをマスターしようとしていないよ:-) – hrbrmstr

+2

OK、それは私のコンピューター。私は手動で 'java -jar selenium-server-standalone-2.48.0.jar'でセレンスタンドアロンサーバを手動で起動しなければなりませんでした。それから私は接続することができます。 –

3

この答えは彼の要求でここに掲載、電子メールでJohn Harrisonから来た:

これは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") 

は、ここで彼の作業

を示す長いバージョンです
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) 
関連する問題