2016-11-03 7 views
1

こんにちは、開発者、、私は疑問に再び午前

私はこのウェブサイトhttps://www.iamsterdam.com/nl/uit-in-amsterdam/uit/agendaからいくつかのデータを取得しようとしていますが発行されます。最初に私はウェブサイトをクロールしましたが、そのときに彼らはAPIを持っていることに気づきました、そして、それはずっと速くなります。

GET-website.js:

var webPage = require('webpage'); 
var page = webPage.create(); 
var settings = { 
    operation: "POST", 
    encoding: "utf8", 
    headers: { 
    "Content-Type": "application/json" 
    }, 
    data: JSON.stringify({ 
    DateFilter: 03112016, 
    PageId: "3418a37d-b907-4c80-9d67-9fec68d96568", 
    Take: 2, 
    Skip: 12, 
    ViewMode: 1 
    }) 
}; 

page.open('https://www.iamsterdam.com/api/AgendaApi/', settings, function(status) { 
    console.log(page.content); 
    phantom.exit(); 
}); 

取得-website.php

$phantom_script= 'get-website.js'; 

$response = exec ('phantomjs ' . $phantom_script); 

echo $response; 

しかし、私は戻っdoesnの何を得る」だから、私はこれを試してみましたAPIからデータを取得しようとしましたtはよく見る:

012:ここで
Message":"An error has occurred.","ExceptionMessage":"Page could not be found","ExceptionType":"System.ApplicationException","StackTrace":" at Axendo.SC.AM.Iamsterdam.Controllers.Api.AgendaApiController.GetResultsInternal(RequestModel requestModel)\r\n at lambda_method(Closure , Object , Object[])\r\n 
etc. 

は、放火犯の写真です

enter image description here

誰かが私を助けてくれることを願っています。

+0

あなたのPageIDは間違っているようで、ちょうど同じことを試みるために郵便配達員が使用されていて、ページから同じ応答があります。 –

+0

@LuciaAngermüller私は、ウェブサイトがそれのために使用された火薬犬を送信していたものを追加することによってPageIdを得ました。 –

+0

はあなたのデータが明らかに間違っていて、ページが見つからないと言いますから、私はPageIDが問題かもしれないと思っていましたが、それ以上の情報がなければ暗闇の中を推測するようなものです –

答えて

1

興味深い質問です。私はこのサイトがAJAXリクエストをブラウザやcURLでも受け入れられるが、PhantomJSでは受け入れられないことに少し驚きました。そのような場合は、少しの詳細の1つがおそらくサーバーの応答に大きく影響するため、要求を非常に慎重に検討して複製する必要があります。

これは、cookieとform content-typeであり、それに応じて設定する必要がありました。

var webPage = require('webpage'); 
var page = webPage.create(); 

// courtesy of http://stackoverflow.com/a/1714899/2715393 
var serialize = function(obj) { 
    var str = []; 
    for(var p in obj) 
    if (obj.hasOwnProperty(p)) { 
     str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
    } 
    return str.join("&"); 
} 

var settings = { 
    operation: "POST", 
    encoding: "utf8", 
    headers: { 
     "accept-encoding" : "identity", // https://github.com/ariya/phantomjs/issues/10930#issuecomment-81541618 
     "x-requested-with" : "XMLHttpRequest", 
     "accept-language" : "en;q=0.8,en-US;q=0.6", 
     "authority" : "www.iamsterdam.com", 
     "accept":"application/json, text/javascript, */*; q=0.01", 
     "content-type" : "application/x-www-form-urlencoded; charset=UTF-8", 
     "cookie" : "website#lang=nl"   
    }, 
    data: serialize({ 
     Genre: '', 
     DateFilter: '03112016', 
     DayPart: '', 
     SearchTerm: '', 
     Neighbourhoud: '', 
     DayRange: '', 
     ViewMode: 1, 
     LastMinuteTickets : '', 
     PageId: '3418a37d-b907-4c80-9d67-9fec68d96568', 
     Skip: 0, 
     Take: 12 
    }) 
}; 

page.open('https://www.iamsterdam.com/api/AgendaApi/', settings, function(status) { 
    console.log(page.content); 
    phantom.exit(); 
}); 
+0

Thx男あなたは私が今必要とする伝説はそれを正しくエンコードするのですか? #mvp –

+0

あなたはとても親切です:)「エンコードする」とはどういう意味ですか? – Vaviloff

+0

私はエンコードmbの代わりにデコードを意味します。なぜなら、私は応答がjsonの権利であることを除いて、プレーンテキストで応答し、コードではないからです。 –

関連する問題