精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-16
HttpClient是Apache基金下jakarta commons项目中的一个小项目,该项目封装了对远程地址下载的一些功能,最新版本为3.0。该项目地址:http://jakarta.apache.org/commons/httpclient 最近在编写Spider的时候就用到了HttpClient。在使用过程中发现一个有趣现象:有些URL的编码方式是utf-8,有些URL的编码方式是gbk。他总能够正确识别,但是有些他又不能识别(抓取回来后是乱码)。调用的是:httpMethod.getResponseBodyAsString(); 方法。 在进行进一步分析时,发现他对在http头信息中有charset描述的就正确正常识别。如:
而没有charset描述信息时,就会是乱码。再查看相关文档时,可以指定URL的编码方式。如:HttpClientParams.setContentCharset("gbk");,指定了编码后,就能够正确识别对应编码的URL了。问题出现了,因URL编码不一样,Spider不可能把URL的编码方式写死。并且只有在抓取回来后才知道编码是否正确。于是再仔细研究一下httpclient的源代码,发现他使用编码的顺序是:http头信息的charset,如果头信息中没有charset,则查找HttpClientParams的contentCharset,如果没有指定编码,则是ISO-8859-1。
这个该死的iso-8859-1害了多少人啊(Tomcat对提交的数据处理默认也是iso-8859-1)!! 经过仔细思考后,决定httpclient再封装一次,思路如下:
经过以上思路处理后,发现抓回来的URL再也没有乱码了。爽! 以上步骤中,就是第四步稍微麻烦一些,不过,也可以利用第三方的html paser工具来分析meta的charset! 如果没有特别注明,本Blog文章岂为原创。 转贴请注明出处: http://netbus.iteye.com 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-03-16
有些网页里面连meta charset也没有的时候咋办呀
建议直接拿返回的Stream开刀,拿到byte[],可以用utf-8尝试解码、分词得到所有汉字词语总数,再用gbk解码,分词也得到一个总数,绝大多数情况下两个统计总数相差悬殊,选大的那个就是了,试试看 ;) 另,这个分词算法可以相当简单,正向最大匹配即可。 |
|
返回顶楼 | |
发表时间:2007-03-17
你这种搞法太费时了,byte to String和分词是一个非常慢的过程。
对于中文来说,服务器文件编码无非就是utf-8或者gbk(gb18030),如果header中没有charset信息,那么meta中肯定是有的。如果meta中都没有charset信息,那说明这个网页可能是小学生弄出来。 退一万步讲如果从meta中取不出来的话,那就只有硬编码采用gbk了,毕竟采用gbk编码的网站要多一些! |
|
返回顶楼 | |
发表时间:2007-03-17
我的步聚:
1:httpMethod.getResponseBody 返回byte[] 2:用new String(byte[],"iso-8859-1")转为String.因为meta里的字符为英文,所以无论html为什么编码,只要里面的meta里有编码信息都能正确显视。(经过几十万个网页的测试,header里有编码信息的网页不足20%,meta里有编码信息的网页超过99.8%) 3:用正则表达式查找meta里的编码是什么。 4:再用new String(byte[],"编码")。 经过几十万个网页的测试,这个方法几乎没什么问题,性能也还可以。 但话说回来,我觉得httpclient比java.net.URL好用的地方是他可以方便地维护http中的session(cookies).如果只是写一般的spider,还不如直接用URL来得直接。 |
|
返回顶楼 | |
发表时间:2007-03-19
NetBus 写道 你这种搞法太费时了,byte to String和分词是一个非常慢的过程。
对于中文来说,服务器文件编码无非就是utf-8或者gbk(gb18030),如果header中没有charset信息,那么meta中肯定是有的。如果meta中都没有charset信息,那说明这个网页可能是小学生弄出来。 退一万步讲如果从meta中取不出来的话,那就只有硬编码采用gbk了,毕竟采用gbk编码的网站要多一些! 我建议的方式是对上述的补充,就是对付小学生搞的网页,既然99.9%都两者必有其一,剩下0.1%用我这个算法也不算慢哦。 我这个算法是基于内容含义来判断编码,理论上准确率相当高,假设不看charset,就算写网页的人把charset写错了也可以准确解码。 |
|
返回顶楼 | |
发表时间:2007-03-20
楼上的,你说得也有道理,你这种搞法属于内容分析后的结果。
适合0.1%的情况,不过,写程序也需要你这种精神。尽可能的捕捉到所有的可能,并且做好相应的处理程序。 |
|
返回顶楼 | |
发表时间:2007-08-17
最近也在使用httpclient,遇到问题就是url带中文时httpclient无法识别url,请教lz怎么解决
比如url="http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3" 调用: GetMethod getMethod = new GetMethod(url); 报url异常:java.lang.IllegalArgumentException: Invalid uri 'http://www.blcu.edu.cn/financial/musicclub/02-sunyanzi/CD3/05%20-%20星期一天气晴我离开你.mp3': escaped absolute path not valid at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:219) at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:88) |
|
返回顶楼 | |
浏览 16597 次