4

Windows cURLでは、次のようなWebリクエストを投稿できます。

curl  --dump-header cook.txt ^
  --data "RURL=http=//www.example.com/r&user=bob&password=hello" ^
  --user-agent  "Mozilla/5.0"  ^
  http://www.example.com/login

これtype cook.txtで、次のような応答が返されます。

HTTP/1.1 302 Found                                                 
Date: Thu, ******
Server: Microsoft-IIS/6.0                                          
SERVER: ******                                                  
X-Powered-By: ASP.NET                                              
X-AspNet-Version: 1.1.4322                                         
Location: ******
Set-Cookie: Cookie1=; domain=******; expires=****** ******
******
******
Cache-Control: private                                             
Content-Type: text/html; charset=iso-8859-1                        
Content-Length: 189

私は手動で次のようなCookie行を読み取ることSet-Cookie: AuthCode=ABC...ができます:(もちろんこれをスクリプト化することもできます)。だから私はAuthCodeその後のリクエストに使用することができます。

私はRでRCurlやhttrを使って同じことをしようとしています(どちらが私のタスクに適しているかはまだわかりません)。

私が試してみると:

library(httr)

POST("http://www.example.com/login",
     body= list(RURL="http=//www.example.com/r",
                user="bob", password="hello"),
     user_agent("Mozilla/5.0"))  

私はこれに似た応答を受け取ります:

Response [http://www.example.com/error]
  Status: 411
  Content-type: text/html
<h1>Length Required</h1> 

概して、私は411エラーについて知っており、要求を修正しようとすることができました。しかし、cURLで取得できないため、POSTコマンドで何か問題が発生しています。

cURLコマンドをRCurlやhttrに変換するのを手伝ってもらえますか?

4

3 に答える 3

2

httrhttp://httpbin.orgへのこれらの2つの呼び出しで示されているように、同じサイトへの呼び出し間でCookieを自動的に保持します。

GET("http://httpbin.org/cookies/set?a=1")
# Response [http://httpbin.org/cookies]
#   Status: 200
#   Content-type: application/json
# {
#    "cookies": {
#     "a": "1"
#   }
# } 

GET("http://httpbin.org/cookies")
# Response [http://httpbin.org/cookies]
#   Status: 200
#   Content-type: application/json
# {
#   "cookies": {
#     "a": "1"
#   }
# } 

おそらく問題は、データをとして送信していることですapplication/x-www-form-urlencodedが、httrのデフォルトはmultipart/form-dataであるため、呼び出しで使用multipart = FALSEしますPOST

于 2013-02-21T15:02:36.283 に答える
2

Jubaの提案に基づいて、これが機能するRCurlテンプレートです。

このコードは、次のようにブラウザの動作をエミュレートします。

  1. ログイン画面でCookieを取得し、
  2. 実際のデータを含む次のページリクエストでそれらを再利用します。


### RCurl login and browse private pages ###

library("RCurl")

loginurl ="http=//www.*****"
mainurl  ="http=//www.*****"
agent    ="Mozilla/5.0"

#User account data and other login pars
pars=list(
     RURL="http=//www.*****",
     Username="*****",
     Password="*****"
)

#RCurl pars     
curl = getCurlHandle()
curlSetOpt(cookiejar="cookiesk.txt",  useragent = agent, followlocation = TRUE, curl=curl)
#or simply
#curlSetOpt(cookiejar="", useragent = agent, followlocation = TRUE, curl=curl)

#post login form
web=postForm(loginurl, .params = pars, curl=curl)

#go to main url with real data
web=getURL(mainurl, curl=curl)

#parse/print content of web
#..... etc. etc.


#This has the side effect of saving cookie data to the cookiejar file 
rm(curl)
gc()
于 2013-02-27T22:49:16.803 に答える
1

これは、POSTリクエストを作成し、結果のCookieを保持して再利用する方法RCurlです。たとえば、認証が必要な場合にWebページを取得します。

library(RCurl)
curl <- getCurlHandle()
curlSetOpt(cookiejar="/tmp/cookies.txt", curl=curl)
postForm("http://example.com/login", login="mylogin", passwd="mypasswd", curl=curl)
getURL("http://example.com/anotherpage", curl=curl)
于 2013-02-21T11:19:14.243 に答える