2012-05-18 53 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