我想从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}}来完成?但如果是这样,那么这种情况下的语法是什么?
欢迎任何建议!
欢呼,汤姆答案 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