鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

HttpClient无法正确重定向到含有中文的网址

HttpClient的BUG

以为解决完URL中编码的问题StreamSpider爬虫之中文URL编码 之后就不用再考虑中文的问题了,然而现实是填完一个坑又有一个新的坑在等着我。

偶然发现程序无法处理含有中文的301跳转,例如 http://tzb.hit.edu.cn/全国政协办公厅 经过301跳转后会404。一顿找原因、debug。

原因

我的理解是: http头信息是用 ISO-8859-1 编码的,而HttpClient则默认用utf8解码,这个不一致导致了得到的重定向地址并不正确。

解决方案

既然HttpClient不能正确处理编码,那我们就自己抓头部Location,然后转换成正确的编码,再让HttpClient去抓取新的url。

示例代码

自动重定向

取消HttpClient的自动重定向,自己处理

1
2
3
HttpClient httpClient = HttpClientBuilder.create()
.disableRedirectHandling()
.build();

转换编码

将 ISO-8859-1 编码的网址转换为 utf8编码

1
2
3
4
5
6
7
if(statusCode==301 || statusCode ==302){
String newUrl = response.getFirstHeader("Location").getValue();
url = new URL(new URL(url), newUrl).toString();
url = new String(url.getBytes("ISO-8859-1"), "utf-8");
doGet(url);
return;
}

完整代码见:httpclient/redirect