2012-05-18 48 views
3

我试图从网站上刮取一些数据。这就是我通常在Perl中所做的事情,但我真的很想让自己脱离Perl。 (我不是在讨论Perl,它是一个有价值的工具,但是我为十多年后仍然与这门语言苦苦挣扎而感到痛心)。由于我的需求很简单,性能对我来说很少是一个问题,所以我想转移我的网站刮到R.我知道一些R,但我从来没有使用RCurl或类似的图书馆。R:使用RCurl和postForm检索数据

这个任务是刮取公开可用数据的数据库。这个问题很复杂,我不知道如何传递参数,因为我只是看着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' 
) 
) 

在使用浏览器的形式如下: enter image description here

,以上的设置返回(一个单独的页面上)这样的: enter image description here

回答

1

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

+0

代码....我们想要代码!得到的代码? –

+0

@DWin不幸的是,我没有接近工作的代码。在我放弃了一个基于R的解决方案之后,我把它交给了两个不同的Perl专家,他们用了很好的技巧,并在解决了这两个问题之后解决了这个问题。所以现在它进入了“太难”的水桶。也许在将来。 – SlowLearner

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

@“文森特Zoonekynd”感谢您的指点。两种澄清,如果你会如此友善(1)我如何访问RCurl的错误响应?正如你所看到的,真的是一个新手在这(2)我是否像任何其他参数一样将opts参数添加到现有请求的末尾?我试过了,它似乎不适合我。我得到了'合并错误(list(...),.opts):参数丢失,没有默认值。 (还认为followLocation参数后应该有一个逗号?) – SlowLearner

+0

(1)只需添加'header = TRUE'。 (2)(神秘的)错误信息是由'useragent'后面的虚假逗号引起的。 –

+0

“@Vincent Zoonekynd”在问题中使用上面的(修改后的)代码,直到错误页面,这是一大进步。使用Live HTTP头来观察网站生成的POST似乎所有参数都是相同的。我很困惑。除非我的请求结构有明显的错误,否则看起来我们已经被击败了。 (顺便说一句,“类型(机动车辆)没有被选中”错误是由于我的一个论点中的错字,现在修复,谢谢。) – SlowLearner