【发布时间】:2017-04-06 18:08:18
【问题描述】:
我正在用 Java 编写一个蜘蛛程序,但在处理 URL 重定向时遇到了一些麻烦。到目前为止,我遇到了两种 URL 重定向,第一种是 HTTP 响应代码为 3xx 的那些,我可以关注this answer。
但第二种是服务器返回 HTTP 响应代码 200,页面仅包含一些 JavaScript 代码,如下所示:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script>
function detectmob() {
var u=(document.URL);
if( navigator.userAgent.match(/Android/i) || some other browser...){
window.location.href="web/mobile/index.php";
} else {
window.location.href="web/desktop/index.php";
}
}
detectmob();
</script>
</head>
<body></body></html>
如果原始 URL 是 http://example.com,那么如果我使用启用了 JavaScript 的桌面网络浏览器,它将自动重定向到 http://example.com/web/desktop/index.php。
但是,我的蜘蛛通过获取HTTP response code 200 来检查HttpURLConnection#getResponseCode() 以查看它是否已到达最终URL,如果收到HTTP response code 3xx,则使用URLConnection#getHeaderField() 获取Location 字段。以下是我的蜘蛛的sn-p代码:
public String getFinalUrl(String originalUrl) {
try {
URLConnection con = new URL(originalUrl).openConnection();
HttpURLConnection hCon = (HttpURLConnection) con;
hCon.setInstanceFollowRedirects(false);
if(hCon.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM
|| hCon.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
System.out.println("redirected url: " + con.getHeaderField("Location"));
return getFinalUrl(con.getHeaderField("Location"));
}
} catch (IOException ex) {
System.err.println(ex.toString());
}
return originalUrl;
}
所以获取上面的页面将有一个HTTP response code 200,我的蜘蛛会假设不会有进一步的重定向并开始解析内容文本为空的页面。
我在谷歌上搜索了一下这个问题,显然javax.script 有点相关,但我不知道如何使它起作用。如何对我的蜘蛛进行编程,以便它能够获取正确的 URL?
【问题讨论】:
标签: javascript java web-crawler url-redirection