R:使用RCurl和postForm检索数据

R:使用RCurl和postForm检索数据,r,web-scraping,rcurl,R,Web Scraping,Rcurl,我正试图从一个网站上搜集一些数据。这是我通常在Perl中做的事情,但我真的想戒掉Perl。(我并不反对Perl;它是一个很有价值的工具,但我为十多年后我仍在与该语言斗争而感到苦恼。)由于我的需求很简单,而且性能对我来说很少是一个问题,我想将我的web抓取改为R。我知道一些R,但我从未使用过RCurl或类似的库 任务是从公开可用的数据中提取数据库。这个问题因为我不知道如何传递参数而变得复杂,因为我只是查看JS源代码,并试图找出在RCurl postForm请求中包含的内容。下面的代码不会抛出任何明

我正试图从一个网站上搜集一些数据。这是我通常在Perl中做的事情,但我真的想戒掉Perl。(我并不反对Perl;它是一个很有价值的工具,但我为十多年后我仍在与该语言斗争而感到苦恼。)由于我的需求很简单,而且性能对我来说很少是一个问题,我想将我的web抓取改为R。我知道一些R,但我从未使用过RCurl或类似的库

任务是从公开可用的数据中提取数据库。这个问题因为我不知道如何传递参数而变得复杂,因为我只是查看JS源代码,并试图找出在RCurl postForm请求中包含的内容。下面的代码不会抛出任何明显的错误,但也不会返回任何有用的信息

我做错了什么

[已编辑:反映建议的更改,但尚未解决]

require(RCurl)
## -----------> Form:
## http://jamaserv.jama.or.jp/newdb/eng/index.html
## -----------> Result:
## http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html

#POST /newdb/eng/prod4/prod4TsMkEntry.html makerCd=5&additionBase=1&additionInterval=1&chkSelCnd3=0&car4Cd=100005&termFrom=201103&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm

#POST /newdb/eng/prod4/prod4TsMkEntry.html?pass chkSelCnd3=0&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm&makerCd=5&additionBase=1&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&additionInterval=1&termFrom=201103&car4Cd=100005

x <- postForm('http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html?pass',
              chkSelCnd3 = '0',
              'prod4TsMkEntryForm/eng/prod4/prod4TsMkEntry.html' = 'prod4TsMkEntryForm',
              makerCd = '5',
              additionBase = '1',
              termTo = '201203',
              'prod4TsMkEntryForm:doAction' = 'Server',
              additionInterval = '1',
              termFrom = '201103',
              car4Cd = '100005',
              .opts = curlOptions(
              referer = 'http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html',
              verbose = TRUE,
              header = TRUE,
              followLocation = TRUE,
              useragent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'
  )
)
require(RCurl)
##------------->表格:
## http://jamaserv.jama.or.jp/newdb/eng/index.html
##------------->结果:
## http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html
#POST/newdb/eng/prod4/prod4TsMkEntry.html makerCd=5&additionBase=1&additionInterval=1&chkSelCnd3=0&car4Cd=100005&termFrom=201103&termTo=201203&prod4TsMkEntryForm%3adAction=Server&prod4TsMkEntryForm%2Feng%2prod4%2prod4tsmkentry.html=prod4TsMkEntryForm
#POST/newdb/eng/prod4/prod4TsMkEntry.html?pass chkSelCnd3=0&prod4TsMkEntry%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntry&makerCd=5&additionBase=1&termTo=201203&prod4TsMkEntry%3adaction=Server&additionInterval=1&termFrom=201103&car4Cd=100005

x您可以添加一个
.opts
参数, 指定引用者的步骤 (一些网站拒绝来自外部的查询), 用户代理(某些网站拒绝未知的用户代理) 并要求跟踪重定向(这就是结果为空的原因)。 如果添加
verbose=TRUE
,则会有更多信息: 最初的POST查询实际上失败了, 在发送表格内容之前, 而RCurl则尝试GET查询, 返回一条错误消息 (“未选择类型(机动车辆”)


x事实证明,这是一个比最初出现的问题复杂得多的问题,涉及服务器端Javascript和各种东西。我在这个问题上使用的简单方法似乎不可行。所以,回答我自己的问题并继续…

@“Vincent Zoonekynd”谢谢你的指点。两个澄清(1)我如何从RCurl获取错误响应?正如您所看到的,我在这(2)方面真的是一个新手吗?我是否像其他任何参数一样,将opts参数添加到现有请求的末尾?我试过了,但似乎对我不起作用。我在合并(列表(…),.opts)中遇到
错误:缺少参数,没有默认值。(还认为followLocation参数后面应该有一个逗号吗?)(1)只需添加
header=TRUE
。(2) (隐晦的)错误消息是由于
useragent
“@Vincent Zoonekynd”后面的一个假逗号造成的,该逗号使用了问题中的(修订的)代码,直到错误页面为止,这是向前迈出的一大步。使用Live HTTP头来观察网站生成的帖子,似乎所有参数都是相同的。我很困惑。除非我构建请求的方式有明显的问题,否则看起来我们在这一点上失败了。(顺便说一句,“未选择类型(机动车辆)”错误是由于我的一个参数中的输入错误造成的,现在已修复,谢谢。)DWin,不幸的是,我没有接近正常工作的代码。在我放弃了一个基于R的解决方案之后,我把它交给了两个不同的Perl专家,他们都是精打细算的,在对这个问题进行了大量的处理之后,他们都失败了。所以现在它进入了“太难”的状态。也许在将来。
x <- postForm(
  ...,
  .opts = curlOptions(
    referer="http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html",
    verbose = TRUE, 
    followLocation = TRUE,
    useragent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
  )
)