【问题标题】:How to fill in an online form and get results back in R如何填写在线表格并在 R 中返回结果
【发布时间】:2012-12-23 14:53:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • @AriB.Friedman 这真的不够.. :) 这个问题涉及理解 hcalc.js javascript,解析 ajaxCalc()ajaxiCalc() 函数来构造 url 中使用的字符串/functions/iclass.php 电话。我没有看到在 S.O. 上使用 R 的所有示例
  • @AnthonyDamico 我怀疑它不会。但这给了她一个起点和一个词汇,从而缩小了她的问题的范围。您已经完成了许多缩小问题范围的工作,所以也许您可以编辑问题以更有针对性?
  • 这个问题的答案 (stackoverflow.com/questions/5396461/…) 应该会有所帮助,因为他们专注于自动化填写网络表单并将结果导入 R 的过程。
  • 是的,我知道这不仅仅是网络抓取。谢谢@eipi10,看起来很有希望。

标签: xml r forms web-scraping rselenium


【解决方案1】:

你可能想看看 Rcurl 的 postForm here 还有一个很好的教程 here

【讨论】:

  • 我不认为 RCurl 可以解决它,因为它不是传统的 HTML 表单。
【解决方案2】:

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

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

还可以查看 omegahat.org 上的“RHTMLForms”包

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以使用RSelenium 包填写和提交网络表单并检索结果。

      利用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,您只需要

      • download PhantomJS 并将其放在用户路径中
      • 如下所述替换开头和结尾的代码 sn-ps

      默认浏览(如上图):

      checkForServer()
      startServer()
      remDrv <- remoteDriver()
      
      ...
      
      remDrv$quit()
      remDrv$closeServer()
      

      无头浏览:

      pJS <- phantom()
      remDrv <- remoteDriver(browserName = 'phantomjs')
      
      ...
      
      remDrv$close()
      pJS$stop()
      

      【讨论】:

      • 从源代码中你怎么知道选择:using = "xpath", "//input[@value = 'Male']"??我怎么知道如何在这个网页上填写文字:ois.dk
      猜你喜欢
      • 1970-01-01
      • 2012-12-21
      • 2017-02-13
      • 2015-10-20
      • 2021-01-14
      • 1970-01-01
      • 2015-01-03
      • 2021-01-22
      • 2016-10-21
      相关资源
      最近更新 更多