使用R中的提交按钮将数据发布到Web表单

时间:2014-01-28 20:50:43

标签: r post web

我想从R发布数据到Web表单,并检索结果。这有可能吗?

特别是,我想将一个文本文件传递给这个网站 http://ionspectra.org/aristo/batchmode/ 并检索结果。

网站使用的帖子方法是

<form action="../batchreport/" method="post" enctype="multipart/form-data"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='d9c49e206913e5d8b515bc9705ca2e09' />

首先,我想检查单选按钮“格式”以制表符分隔:

<input type="radio" name="format" value="tsv" /> Tab-delimited <br/>

然后我想上传一个给定的文件:

<input type="file" name="batchfile" size="20"><br/>

然后点击提交按钮:

<input type="submit" value="Ontologize!" />

最后检索生成的文本文件。

问题是,这可以从R编写脚本,如果是,使用什么包? 是否可以使用RCurl的{​​{1}}来完成?但如果是这样,那么这种情况下的语法是什么?

欢迎任何建议!

欢呼,汤姆

2 个答案:

答案 0 :(得分:2)

由于它是Django网站,这比正常情况稍微复杂一点,我们需要通过生成CSRF令牌来处理Django的跨站点请求伪造保护。

以下是使用here提供的示例文件httr的方法:

library(httr)
csrf <- GET(url='http://ionspectra.org/aristo/batchmode/')$cookies$csrftoken
res <- POST(url='http://ionspectra.org/aristo/batchreport/', 
            body=list(batchfile=upload_file('example.txt'),
                      format='tsv',
                      csrfmiddlewaretoken=csrf))
out <- read.delim(file=textConnection(content(res)), 
                  stringsAsFactors=FALSE)

GET调用生成CSRF令牌,后续POST调用需要该令牌。

答案 1 :(得分:1)

这也有效,不需要GET请求。基本上,ionpectra网站在您访问网络表单时会生成一个cookie,并在您提交时将该cookie以隐藏变量的形式发送回服务器。然后服务器比较两者。下面的代码使用set_cookies(csrftoken=...)欺骗cookie,与POST正文中的csrfmiddlewaretoken相同。正如您所看到的,令牌几乎可以是任何东西。

library(httr)
# download example dataset and save as file "example.txt"
data <- readLines("http://ionspectra.org/static/aristo/example.txt")
file <- writeLines(data,"example.txt")
# POST request; z$content is the returned content, in raw format
z <- POST(url="http://ionspectra.org/aristo/batchreport/",
       set_cookies(csrftoken="arbitrarytoken"),
       body=list(csrfmiddlewaretoken="arbitrarytoken",
                 format="tsv",
                 filter="filter",
                 submit="Ontologize!",
                 batchfile=upload_file("example.txt")))

df <- read.csv(text=rawToChar(z$content),header=T,sep="\t")
head(df)
#   scan.       title score    ChEBI_ID         ChEBI_Name  N   AUC Est..Precision Correct.
# 1     8 CHEBI:34205 0.781 CHEBI:53156 polychlorobiphenyl 24 0.990              1     True
# 2     8 CHEBI:34205 0.755 CHEBI:35446     chlorobiphenyl 27 0.990              1     True
# 3     8 CHEBI:34205 0.708 CHEBI:22888          biphenyls 38 0.943              1     True
# 4     8 CHEBI:34205 0.698 CHEBI:36686        chloroarene 40 0.966              1     True
# 5     8 CHEBI:34205 0.694 CHEBI:36820      ring assembly 49 0.827              1     True
# 6     8 CHEBI:34205 0.681 CHEBI:50887          haloarene 44 0.955              1     True