如何使用R触发文件下载

时间:2018-12-18 21:27:20

标签: html r web-crawler rvest

我正在尝试使用R触发以下站点的文件下载:http://www.regulomedb.org。基本上,以表格形式输入ID,例如rs33914668,然后单击Submit。然后在新页面中,单击左下角的下载以触发文件下载。

在其他帖子的帮助下,我尝试了rvest。

library(httr)
library(rvest)
library(tidyverse)

pre_pg <- read_html("http://www.regulomedb.org")
POST(
  url = "http://www.regulomedb.org", 
  body = list(
    data = "rs33914668"
  ),
  encode =  "form"
  )
) -> res
pg <- content(res, as="parsed")

通过检查pg,我认为我仍然在首页上,而不是http://www.regulomedb.org/results。 (除了逐行阅读之外,我不知道如何检查pg列表)。因此,我无法到达下载按钮。我不明白为什么它不能跳到下一页。

通过学习其他文章,我设法不用rvest来下载文件。

library(httr)
library(rvest)
library(RCurl)

session <- html_session("http://www.regulomedb.org")
form <- html_form(session)[[1]]
filledform <- set_values(form, `data` = "rs33914668")

session2 <- submit_form(session, filledform)
form2 <- html_form(session2)[[1]]
filledform2 <- set_values(form2)

thesid <- filledform2[["fields"]][["sid"]]$value
theurl <- paste0('http://www.regulomedb.org/download/',thesid)
download.file(theurl,destfile="test.bed",method="libcurl")

在fillform2中,我找到了sid。使用www.regulomedb.org/download/:sid,我可以下载文件。

我是html甚至R的新手,甚至不知道sid是什么。尽管我做到了,但是我对编码并不满意。因此,我希望一些有经验的用户可以提供更好的替代解决方案,或者改进我当前的解决方案。另外,POST / rvest方法有什么问题?

1 个答案:

答案 0 :(得分:1)

url<-"http://www.regulomedb.org/"
library(rvest)
page<-html_session(url)

download_page<-rvest:::request_POST(page,url="http://www.regulomedb.org/results",
                                    body=list("data"="rs33914668"),
                                    encode = 'form')

#This is a unique id on generated based on your query
sid<-html_nodes(download_page,css='#download > input[type="hidden"]:nth-child(8)') %>% html_attr('value')

#This is a UNIX time
download_token<-as.numeric(as.POSIXct(Sys.time()))

download_page1<-rvest:::request_POST(download_page,url="http://www.regulomedb.org/download",
                                    body=list("format"="bed",
                                              "sid"=sid,
                                              "download_token_value_id"=download_token ),
                                    encode = 'form')
writeBin(download_page1$response$content, "regulomedb_result.bed")