R:使用RCurl和postForm检索数据

时间:2012-05-18 01:04:37

标签: r web-scraping rcurl

我正试图从网站上抓取一些数据。这是我通常在Perl中做的事情,但我真的想让自己脱离Perl。 (我不是在贬低Perl;它是一个很有价值的工具,但是我十多年来仍然对这种语言的困难感到苦恼。)因为我的需求很简单而且性能对我来说很少是一个问题,我想要将我的网络抓取转移到R.我知道一些R,但我从未使用过RCurl或类似的库。

任务是抓取公开数据的数据库。由于我不知道如何传递参数,这个问题很复杂,因为我只是在查看JS源代码并试图找出要包含在RCurl postForm请求中的内容。下面的代码不会引发任何明显的错误,但它也不会返回任何有用的内容。

Q值。我做错了什么?

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

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'
  )
)

使用浏览器时,表单如下所示: enter image description here

以上设置返回(在单独的页面上): enter image description here

2 个答案:

答案 0 :(得分:4)

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

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"
  )
)

答案 1 :(得分:1)

这最初是一个更复杂的问题,它涉及服务器端的Javascript和各种各样的东西。使用我在这个问题中使用的简单方法似乎不可行。所以,回答我自己的问题并继续......