在我们HTTP请求的时候,有的时候目标地址发生了301/ 302等状态的改变,而改变后的地址我们是不知道的。最近在写爬虫的时候,爬取百度的地址的时候,发现百度是做了301到目标地址的,而我想直接得到每个真实的URL地址。通过测试,发现下面方法是可以的。
代码:publicstaticStringgetReal(String url){
try {
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
HttpParams params = client.getParams();
params.setParameter(AllClientPNames.HANDLE_REDIRECTS, false);
client.executeMethod(method);
String realUrl = method.getURI().getURI();
LoggerUtils.fmtDebug(CLAZZ, "获取真实的地址成功:%s,原地址是:%s",realUrl,url);
return realUrl;
} catch (Exception e) {
LoggerUtils.fmtError(CLAZZ, "获取地址失败,原来的地址是:%s", e,url);
e.printStackTrace();
return "";
}
}
从上面可以直接得到真实的domain和queryString。
自己重新看这个地方的时候发现,我没把依赖包放这里。抱歉!!!依赖包如下:
org.apache.httpcomponents
httpmime
4.4
commons-httpclient
commons-httpclient
3.1
然后LoggerUtils 这个类不用管,直接删除即可。
301 和 302 的区别?
一、官方说法。
301,302都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:301redirect: 301代表永久性转移(Permanently Moved)。
302redirect: 302代表暂时性转移(Temporarily Moved )。
二、实际区别。
1>.用户角度。
301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL。页面跳到了这个新的url指向的地方。
2>.对于搜索引擎和站长。
建议使用301,如果是用302,搜索引擎会认为是可疑转向,甚至认为是作弊。
为什么作为作弊?因为当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。这样搜索引擎会把301后的页面作为目标页面。
三、总结。
要是你还是没明白,那么我就大白话告诉你,当我们平时重定向的时候,并没有留意要给设置状态,如下代码(Java举例)。//设置为301
hsResponse.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
hsResponse.setHeader("Location","/blog/");
这样就设置为301了,我们这样设置表示,以后你什么时候访问都是跳转到新的301后的地址,而302是现在跳转到A页面,有可能明天跳转到B页面,又可能不跳转了,也就是一个是永久,一个表示不一定。
更多状态请看这里:HTTP状态码详解
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。
¥我需要走的更远,点击我 赞助。
如果还有疑问,点击我加群,为你提供最好的解答。