如何避免http代码204?

时间:2015-10-06 04:06:19

标签: scala web-scraping

我从一个网站上感兴趣的信息来自于Ajax调用的Json形式。但是,当我拨打电话时,它有时会返回204 - 没有内容 - Http响应代码,根本不给我任何数据。

从客户端来看,是否有办法强制服务器始终返回内容,例如设置标题,还是通过其他方式?

我使用的是Scala Play WS API。例如,

WS.url(url).withQueryParameters(queryParameters)
.withHeaders("User-Agent" -> "Mozilla/5.0 (X11; Linux x86_64)...",
"X-Requested-With" -> "XMLHttpRequest",
"Cookie" -> "cookie1=1; cookie2=2;...")
.get()

更新:Ajax有效负载

AJAX CAPTURE Chrome扩展程序数据:

$.get(url).done (showResult).fail(showError);

{
  "frameId": 0,
  "method": "GET",
  "parentFrameId": -1,
  "requestId": "122389",
  "tabId": 2432,
  "timeStamp": 1444493900946.029,
  "type": "xmlhttprequest",
  "url": url
}

感谢。

1 个答案:

答案 0 :(得分:1)

  

它有时会返回204 - 没有内容

最好提供您要求的服务器的信息。

可能有很多原因导致您无法获得请求的内容。

  1. 服务器因为过载而无法为响应形成动态内容,并且以这种方式设置为返回空内容(而不是引发超时问题)。
  2. 目标服务器上的安全服务发现/怀疑您是一个不好的请求者(僵尸程序,可疑的IP等),而不是禁止和返回代码400它不返回任何代码{{ 1}}。

    • 这里的特殊情况是服务器可能只需要在您看似常规请求时进行ajax调用。请参阅此post以及如何add it to curl
  3. 服务器对您的请求进行一些特殊检查,并导致您错过了一些参数(GET参数,POST有效负载,cookie等)。

  4. 如果您想在目标服务器上修复它 - 请转向网站所有者。

    更新:Stackoverflow请求分析中的Ajax有效负载

    考虑以下来自 AJAX CAPTURE Chrome扩展的镜头: enter image description here

    正如您所看到的,整个请求有效负载由表单数据 1。和一些服务信息组成,总计构成有效负载对象 - 2。 因此, 2。包含 1。,正如您在镜头中看到的那样。因此,对于目标服务器,您需要浏览/调查浏览器生成的实际ajax请求并模拟类似的请求。

    注意:

    1. 204显然是stackoverflow内部请求计数器,因此它不易制作/生成/模拟。
    2. requestId显然是stackoverflow计时值(加上smth。其他),因此找到一个形成它们的算法可能会很棘手。随着时间的推移进行一些试验以找出算法。