我正在尝试从此页面检索链接:http://www.seas.harvard.edu/academics/areas
页面中间有一个名为“Computer Science”的链接。它的基础链接是“/学术/领域/计算机科学”。我可以使用Java内置URL类将其转换为绝对URL,获取“http://www.seas.harvard.edu/academics/areas/computer-science”。
但是,当我点击Chrome浏览器中的链接时,绝对网址会更改为“http://www.seas.harvard.edu/computer-science”。
所以我的问题是双重的:
我需要在重定向后获取URL,因为我想阅读页面的源代码,但重定向之前的URL对我不起作用。我正在使用JSoup
库来读取URL,因此我怀疑它可能是基于javascript的重定向。
答案 0 :(得分:4)
从curl --dump-header [file] [URL]
文件看起来像:
HTTP/1.1 301 Moved Permanently
Age: 0
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Date: Tue, 13 Aug 2013 13:00:12 GMT
ETag: "1376398812"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 13 Aug 2013 13:00:12 GMT
Location: http://www.seas.harvard.edu/computer-science
Server: nginx
Vary: Accept-Encoding
Via: 1.1 varnish
X-AH-Environment: prod
X-Cache: MISS
X-Drupal-Cache: MISS
X-Redirect-ID: 44
X-Varnish: 2704315535
transfer-encoding: chunked
Connection: keep-alive
如您所见,这是从服务器提供的301永久重定向。
您可以使用HttpURLConnection进行连接,但在连接之前,请致电myConn.setInstanceFollowRedirects(true)
。遵循重定向,您可以获取输出流并阅读它。
您可以使用HttpURLConnection
进行连接,但在连接之前,请致电myConn.setInstanceFollowRedirects(false)
至而不是,然后重定向。这会将实际的URL保存在正确的位置。
这里的诀窍是,由于某些奇怪的原因,HttpURLConnection不允许通过 name 检索标头,除非您将其解析为日期。
因此,您需要迭代一个整数,在建立连接后调用getHeaderFieldKey
并检查它是否等于Location
,如果是,则将getHeaderField
与相同的整数相加得到位置。很烦人,我知道。但是,地点不是日期,这是JRE的疏忽。
答案 1 :(得分:0)
我使用Fiddler进行调查,网站返回链接http://www.seas.harvard.edu/academics/areas/computer-science
HTTP 301 response code,执行重定向。
我想获得真实的网址。您应该对harvard.edu Web服务器执行实际请求并解析响应。 (重定向URL位于HTTP标头中的Location
键中。)
对你的第二个问题感到抱歉。我没有Java技能。
这个SO问题可能有所帮助(httpclient-4-how-to-capture-last-redirect-url)
答案 2 :(得分:0)
.htaccess
和mod_rewrite
重定向。使用Firefox的控制台我可以看到请求。如下所示,服务器正在发送301 Moved Permanently
消息。这告诉浏览器重定向到响应的Location
标头中返回的地址。
Location
标题中。答案 3 :(得分:0)
我只能尝试解决Q1,因为我不是Java程序员。源代码说他们正在使用Drupal,所以我推测他们正在使用Drupal的global redirect module(关于Drupal重定向模块here的SO讨论)。查看模块的文档可能会说明如何使用Java获取正确的URL。
javascript中还有许多方法可以让网址请求自动重定向到某个基页(例如,CS主页),而物理导航网站则允许用户前进到新页面。这是许多单页Web应用程序中的标准做法。如果是这种情况,那么@hexafraction的建议可能会帮助您检索所需的URL,尽管我不熟悉他建议的Java方法。
答案 4 :(得分:0)
您可以从以下代码设置Redirect URL
获取followRedirects
到false
。
如果您将重定向页面设置为true
,那么您将获得重定向页面的源代码,这是Jsoup
的默认行为
Connection con = Jsoup.connect("http://www.seas.harvard.edu/academics/areas/computer-science")
.userAgent("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36")
.followRedirects(false);
System.out.println("Redirected Url : " + con.execute().header("Location")); //null if followRedirect is true
Document doc = con.get();
System.out.println(doc.html());
System.out.println("=================================================");