Привет, разработчики, я снова с вопросом,
Я пытаюсь получить некоторые данные с этого сайта https://www.iamsterdam.com/nl/uit-in-amsterdam/uit/agenda . Сначала я просканировал веб-сайт, но при этом им приходило в голову, что у них есть api, и это будет намного быстрее. Поэтому я попытался получить данные из api, я попробовал это:
получить-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;
Но то, что я получаю, выглядит не очень хорошо:
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.
Вот картина с огненным камнем:
Я надеюсь, что кто-то может мне помочь.
Интересный вопрос. Я был немного удивлен тем, что сайт будет выполнять AJAX-запрос в браузере и даже в cURL, но не в PhantomJS. В таких случаях вам необходимо внимательно изучить и повторить запрос, потому что одна из небольших деталей, вероятно, сильно влияет на ответ сервера.
Оказалось, что это был файл cookie и форма контента, который должен был быть установлен соответствующим образом.
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(); });