日期:2014-05-20  浏览次数:20604 次

抓取网页遇见奇怪的乱码问题,查过很多资料都没有答案
本帖最后由 poplong 于 2013-11-09 18:06:39 编辑
    抓取网页本身并没有出现异常报错,但是抓下来的源代码却出现了如下的乱码:

    需要强调的一点是我用的抓取程序以前正常抓去过不少中英文网页,类似这样的乱码还是第一次碰上,用程序抓取到乱码的网页在浏览器,以及用httpfox、httprequester等插件中都能够正确的显示,所以猜测浏览器和这些插件对返回的源码进行了解码之类的操作,当然这仅仅是猜测而已。我抓取的是中文页面,程序中使用了GBK编码(与页面源代码的编码格式一致),但程序返回的乱码从表面看比较奇怪,不像是ISO-8859-1,UTF-8,GB2312,GBK等造成的乱码,但是也把几种常见的编码格式都试了还是不行。
    比较奇怪的一点是,该网站下有的页面可以正常的抓取,有的页面却会出现乱码,最奇怪的是同一个网页链接,有的时候是可以正常抓取的,但可能仅仅过了十几秒钟,再抓取该链接就出现乱码了,可能过一会又好了。反正就跟抽风一样。实在是找不到原因,请求各大神指点迷津。解决问题就给分!
    以下是使用GET方法请求网页的主要代码(try-catch什么的太占空间,没有放进去):

String reqUrl = "http://www.....";// 请求的网页网址(省略)
URL url = new URL(reqUrl);
HttpURLConnection url_conn = (HttpURLConnection)url.openConnection();
url_conn.setRequestMethod("GET");
url_conn.setConnectTimeout(HttpRequestProxy.connectTimeOut);//设置连接超时
url_conn.setReadTimeout(HttpRequestProxy.readTimeOut);//设置读取超时

InputStream in = url_conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "GBK"));
String tempLine = br.readLine();

StringBuffer temp = new StringBuffer();
while(tempLine != null){
temp.append(tempLine + "\n");
tempLine = br.readLine();
}
String responseContent = temp.toString();// 这就是返回的乱码字符串
br.close();
in.close();

网页抓取 乱码 java 中文乱码

------解决方案--------------------
你可以查看下content-encoding 如果是gzip 说明 返回的内容是压缩过的
------解决方案--------------------
PHP的频繁抓取也碰到过这种情况,不知道为什么。