我正在尝试从网站上抓取一些数据。这是我通常会在 Perl 中做的事情,但我真的很想摆脱 Perl。 (我不是在贬低 Perl;它一直是一个有值(value)的工具,但我对十多年后仍然在与该语言斗争的程度感到苦恼。)由于我的需求很简单,性能对我来说很少成为问题,我想将我的网页抓取转移到 R。我知道一些 R,但我从未使用过 RCurl 或类似的库。

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

问:我做错了什么?

[已编辑:反射(reflect)建议的更改,但尚未解决]

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

使用浏览器时,表单如下所示:

并且上述设置返回(在单独的页面上):

最佳答案

您可以添加 .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"
  )
)

关于R:使用 RCurl 和 postForm 检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10645467/

10-11 05:24