10

有没有人从 R 远程填写过网络表格?

我想用我的分数在 R 中做一些射箭统计。有一个非常方便的网页,为您提供分类和障碍http://www.archersmate.co.uk/,我自然希望将其包含在我的统计表中。

是否可以远程填写此表格并将结果返回给 R???

否则,我将不得不自己获取所有障碍表并将它们放入数据库中。

更新:我们已将问题缩小到事实,即表单提交按钮是用 javascript 编写的。

4

4 回答 4

9

您可以使用该RSelenium软件包来填写和提交 Web 表单并检索结果。

以下利用RSelenium的代码将下载示例输入的数据(男性,18 岁以下,长弓,布里斯托尔 V,500):

library(RSelenium)

# Start Selenium Server --------------------------------------------------------

checkForServer()
startServer()
remDrv <- remoteDriver()
remDrv$open()


# Simulate browser session and fill out form -----------------------------------

remDrv$navigate('http://www.archersmate.co.uk/')
remDrv$findElement(using = "xpath", "//input[@value = 'Male']")$clickElement()
Sys.sleep(2) 
remDrv$findElement(using = "xpath", "//select[@id = 'drpAge']/option[@value = 'Under 18']")$clickElement()
remDrv$findElement(using = "xpath", "//input[@value ='Longbow']")$clickElement() 
remDrv$findElement(using = "xpath", "//select[@id = 'rnd']/option[@value = 'Bristol V']")$clickElement()
remDrv$findElement(using = "xpath", "//input[@id ='scr']")$sendKeysToElement(list('5', '0', '0'))
remDrv$findElement(using = "xpath", "//input[@id = 'cmdCalc']")$clickElement()

# Retrieve and download results injecting javascript ---------------------------

Sys.sleep(2)
clsf <- remDrv$executeScript(script = 'return $("#txtClass").val();', args = list())[[1]]
hndcp <- remDrv$executeScript(script = 'return $("#txtHandicap").val();', args = list())[[1]]

remDrv$quit()
remDrv$closeServer()

默认浏览器RSelenium是 Firefox。但是,RSelenium甚至支持使用PhantomJS. 为了利用PhanomJS你只需要

  • 下载 PhantomJS并将其放在用户路径中
  • 替换开头和结尾的代码片段,如下所述

默认浏览(如上图):

checkForServer()
startServer()
remDrv <- remoteDriver()

...

remDrv$quit()
remDrv$closeServer()

无头浏览:

pJS <- phantom()
remDrv <- remoteDriver(browserName = 'phantomjs')

...

remDrv$close()
pJS$stop()
于 2014-12-24T00:41:01.820 回答
0

这可能对您没有帮助,因为我正在寻找类似问题的答案,但是查看您想要抓取的 URL,要填写的表单实际上是 HTML 表单,您可以通过以下方式获取描述:

url <- "http://www.archersmate.co.uk/"
forms <- getHTMLFormDescription(url)

另请查看 omegahat.org 上的“RHTMLForms”包

于 2013-04-30T17:10:31.250 回答
0

这在 RCurl 中是做不到的,因为表单会触发 ajax 事件,所以 postForm 函数是不够的。

于 2014-02-25T13:25:16.173 回答
0

你可能想看看 Rcurl's postForm here和 theres also a nice tutorial here

于 2013-01-13T18:00:24.157 回答