【问题标题】:Why does a Java coded HTTP GET deliver a different web page than a seemingly identical Firefox GET request?为什么 Java 编码的 HTTP GET 提供的网页与看似相同的 Firefox GET 请求不同?
【发布时间】:2013-10-09 10:47:57
【问题描述】:

我想从 Java 程序加载我自己的 TMF 播放器页面以自动导出决策点。网址是“http://caps.fool.com/player/staka.aspx”。 Firefox 按预期加载页面(所有 Cookie 已删除,未登录)。它对 GET 请求进行协议,如下所示:

请求网址:http://caps.fool.com/player/staka.aspx
请求方法:GET
状态码:HTTP/1.1 200 OK
请求标头 12:03:26.000
用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
主持人:caps.fool.com
DNT:1
连接:保持活动
缓存控制:max-age=0
接受语言:de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
接受编码:gzip、deflate
接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

我尝试尽可能地编写代码:

  URL url = new URL("http://caps.fool.com/player/staka.aspx"); 
  HttpURLConnection connection = (HttpURLConnection)url.openConnection();
  connection.setRequestMethod("GET");
  connection.setRequestProperty(
    "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0");
  connection.setRequestProperty("Host", url.getHost());
  connection.setRequestProperty("DNT", "1");
  connection.setRequestProperty("Connection", "keep-alive");
  connection.setRequestProperty("Cache-Control", "max-age=0");
  connection.setRequestProperty("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
  connection.setRequestProperty("Accept-Encoding", "gzip, deflate");
  connection.setRequestProperty(
    "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
  inputStream = connection.getInputStream();
  ...

不过,我得到了一个不同的页面,其中包含以下内容:

<html>
<head>
<META NAME="robots" CONTENT="noindex,nofollow">
<script>
(function() { 
var z="";var b="747279 ... 7D3B";for (var i=0;i<b.length;i+=2){z=z+parseInt(b.substring(i, i+2), 16)+",";}z =  z.substring(0,z.length-1); eval(eval('String.fromCharCode('+z+')'));})();
</script></head>
<body>
<iframe style="display:none;visibility:hidden;" src="http://my.incapsula.com/public/ga/jsTest.html" id="gaIframe"></iframe>
</body></html>

我用“...”缩短了一串相当长的数字。在这个返回的页面中,他们显示了一个无机器人提示,该提示不包含在我打算访问的原始页面中。我看到他们使用来自“incapsula.com”的技术,这可能有助于他们看到我的 GET 和 Firefox 的区别。我对各种参数和其他参数进行了很多试验,但没有任何结果会导致不同的结果。

难道不能编写一个与 Firefox 创建的请求没有区别的 GET 请求吗?知道如何做到这一点吗?

【问题讨论】:

  • 试试硒。当您发送获取请求时,您的浏览器会下载 js 和图像。如果您不要求他们,则可能意味着您是机器人。还有一些人检查鼠标移动。
  • 浏览器拿到页面后只能下载js和图片! Java 请求未传递页面。
  • 其实你是对的,尝试删除我的浏览器发送的DNT,Cache-Control here's
  • 这个我试过了,没有区别。
  • 我也试过了,我用更多的 js 得到了类似的东西,我想必须执行 js 才能获得正确的页面。最终。我相信使用 selenium 会容易得多,除非你当然有理由不使用它

标签: java http firefox get


【解决方案1】:

差异是由于缺乏适当的 JavaScript 执行。

如果您想获得完整的 JS 支持,请使用 Selenium 浏览页面 - 但这将实例化一个真正的 Web 浏览器进程。

您也可以尝试使用HtmlUnit - 它具有相当好的 JavaScript 执行能力,与 Selenium 相比,它没有 GUI,性能会好很多。

【讨论】:

  • 不能和 JavaScript 有任何关系;返回的原始字节不同。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多