【问题标题】:Trying to GET from api after posting API issues发布 API 问题后尝试从 api 获取
【发布时间】:2016-11-03 08:53:39
【问题描述】:

各位开发者,我又带着一个问题回来了,

我正在尝试从该网站https://www.iamsterdam.com/nl/uit-in-amsterdam/uit/agenda 获取一些数据。我首先抓取了网站,但这样做时我想到他们有一个 api,而且速度会快得多。所以我试图从我试过的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();
});

get-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.

这是萤火虫的图片:

我希望有人可以帮助我。

【问题讨论】:

  • 你的PageId好像错了,刚刚用postman试了一下,得到了同样的页面响应。
  • @LuciaAngermüller 我通过查看添加网站发送的使用过的萤火虫获得了 PageId,所以应该不错。
  • 关于你的数据显然是错误的,因为他说找不到页面,我认为可能是 PageID 的问题,但没有进一步的信息,这就像在黑暗中猜测
  • @AnnSophieAngermüller 我添加了一个萤火虫图像,您可以看到浏览器发送的数据与我发送的数据相同。
  • 您向谁或如何发送请求?也许之前执行了一些其他脚本?

标签: javascript php api web-scraping phantomjs


【解决方案1】:

有趣的问题。我有点惊讶该网站会在浏览器中甚至在 cURL 中支持 AJAX 请求,但在 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();
});

【讨论】:

  • 谢谢,你是个传奇人物,我现在需要做的就是对其进行编码,对吗? #mvp
  • 你很善良 :) 你说的“编码”是什么意思?
  • 我的意思是使用解码而不是编码 mb,因为我得到的是纯文本而不是代码的响应,所以我除了响应是 json 对吗?
  • 不,响应实际上是预渲染的 HTML,因此您必须以某种方式对其进行解析。实际上,直接连接到该 API 端点并没有获得太多收益。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2019-10-16
相关资源
最近更新 更多