`
hanjk1234
  • 浏览: 2338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于网页爬去编码问题,(编码格式设置无误,还是会出现乱码)

阅读更多
第一次发帖,可能个是不太注意 ,请大家谅解
最近遇到 2个蛋疼的 乱码问题,希望 万能的吧友 大神能帮忙解答

第一个 是: 爬取天气预报的时候 个别城市 的数据 乱码
url:
http://m.weather.com.cn/data/101110101.html

可以看到 头信息 编码神马的 都是UTF-8 ,返回值 也是UTF-8
上代码
public static String getResult(String urlStr,Proxy proxy) {
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(urlStr);
if(proxy == null){
connection = (HttpURLConnection) url.openConnection();
}else{
connection = (HttpURLConnection) url.openConnection(proxy);
}
 
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setConnectTimeout(2000);
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip,deflate");
connection.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
connection.setRequestProperty("Cache-Control", "max-age=0");
connection.setRequestProperty("Connection", "keep-alive");
connection.setRequestProperty("Content-Type", "text/html; charset=utf-8");
 
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
return buffer.toString();
} catch (Exception e) {
log.error(e);
} finally {
if (connection != null) {
connection.disconnect();
}
}
return null;
}
//执行的  伪代码 
String json =  getResult("http://m.weather.com.cn/data/101110101.html",null); 

打印输出的 是 数据乱码 , (不是控制台的原因)
我爬取了大约2000+个城市的 天气,但是个别城市 有问题
我的解决方式 是用代理来访问,然后既可以解决乱码问题

第二个 是 google 地址解析 服务

ur:
http://maps.googleapis.com/maps/api/geocode/json?address=%E4%B8%8A%E6%B5%B7%E4%B8%8A%E6%B5%B7%E5%B8%82%E5%BE%90%E6%B1%87%E5%8C%BA%E7%BD%97%E7%A7%80%E8%B7%AF55%E5%BC%846%E5%8F%B7902%E5%AE%A4&sensor=true

在linux 下异常 但是在 windows 下正常
上代码

private String getGeocodingResultByAddr(String q) {
String site = "http://maps.googleapis.com/maps/api/geocode/json";
String params = "address=%s&sensor=false";
HttpURLConnection conn = null;
String json = "";
try {
params = String.format(params, URLEncoder.encode(q, charset));
URL url = new URL(site + "?" + params);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoInput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.setRequestProperty("Accept-Encoding","gzip");
conn.setRequestProperty("Accept-Language","zh-CN");
conn.setRequestProperty("Cache-Control","max-age=0");
conn.setRequestProperty("Cache-Control","keep-alive");
conn.setRequestProperty("Host","maps.googleapis.com");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setDoInput(true);
InputStream is = conn.getInputStream();
String contentType = conn.getContentType();
System.out.println(contentType);
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
  ByteArrayOutputStream bytestream = new ByteArrayOutputStream(1024);
  int ch = 0;
  while ((ch = is.read()) != -1) {
  bytestream.write(ch);
  }
  byte imgdata[] = bytestream.toByteArray();
  System.out.println(new String(imgdata));
  System.out.println(new String(imgdata, "utf-8"));
  System.out.println(new String(imgdata, "gbk"));
  System.out.println(new String(imgdata, "gb18030"));
  bytestream.close();
}
is.close();
} catch (Exception e) {
json = null;
log.error("地址:" +q +"请求异常,结果"+json,e);
} finally {
if (conn != null)
conn.disconnect();
}
return json;
}
 
//执行的 伪代码 
getGeocodingResultByAddr("北京市海淀区上地");
 


我的解决方式 是用 httpclient
private String getGeocodingResultByAddr(String q) {
if(httpClient == null){
httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(HTTP.USER_AGENT,"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36"); 
}
String site = "http://maps.googleapis.com/maps/api/geocode/json";
String params = "address=%s&sensor=false";
 
String json = "";
try {
params = String.format(params, URLEncoder.encode(q, charset));
String url = site + "?" + params;
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpGet.setHeader("Accept-Encoding","gzip");
httpGet.setHeader("Accept-Language","zh-CN");
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent() , "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
json = buffer.toString();
} catch (Exception e) {
json = null;
log.error("地址:" +q +"请求异常,结果"+json,e);
}
return json;
}


求大神 们解惑
分享到:
评论
1 楼 hanjk1234 2013-06-30  
感谢一个技术群里的朋友提供的解决方案:
涨姿势了,

第一个问题是: 是应为 
connection.setRequestProperty("Accept-Encoding", "gzip,deflate");

服务器 把数据 做了压缩
解决方式 :
String encoding = connection.getContentEncoding();
if("gzip".equals(encoding)){
reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8"));
}else{

reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
}
感谢 仔仔

相关推荐

    辨别网页编码格式

    通过理解上述方法,我们可以更好地理解和处理网页编码问题,确保无论访问哪个国家或地区的网站,都能获得准确无误的显示效果。在日常的网络浏览和开发工作中,熟练掌握网页编码识别技巧是非常有益的。

    Python网络爬虫出现乱码问题的解决方法

    Python网络爬虫在抓取网页数据时,可能会遇到各种乱码问题,这通常是由于源网页的编码与程序处理编码不一致导致的。解决这类问题的关键在于正确地识别和转换编码。 首先,我们要理解网页编码的基本原理。网页的编码...

    网页,文本编码快速转换

    然而,ANSI编码并不是一个国际标准,对于非西欧语言,如中文、日文、韩文等,它无法正确显示,因此在处理多语言环境时可能会出现问题。 **编码转换的重要性**:在处理不同来源的文本时,编码不匹配会导致乱码问题。...

    关于代码编码问题

    但是,如果网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因此,保持一致的编码格式非常重要。 三、在字符串传输时的编码问题 在字符串传输时,也可能出现乱码问题。解决方法是使用以下代码: ```java ...

    批量转换网页文件编码工具

    3. **数据清洗**:在处理大量网页数据时,转换编码可以消除乱码问题,保证数据质量。 4. **国际化**:向全球用户推出产品时,使用UTF-8可以支持各种语言,减少编码问题。 总之,批量转换网页文件编码工具是解决...

    网页乱码问题的解决方案

    网页乱码通常源于服务器端数据库编码设置、前端页面编码声明以及中间传输过程中的不一致或错误配置。例如,在给定的部分内容中提到了使用MySQL和PHP时遇到的乱码问题,这主要涉及数据库连接和查询时的字符集设置。 ...

    网页编码转换期

    综上所述,"网页编码转换期"涉及到的是如何有效地将网页文件的编码格式从UTF-8或GB转换,以确保跨平台和跨系统的兼容性。通过使用合适的批量转换工具,可以高效地解决编码不匹配的问题,确保信息的准确传达。

    网页编码转换工具GB2312转换UTF-8

    综上所述,"网页编码转换工具GB2312转换UTF-8"是一个实用的工具,它简化了不同编码格式之间的转换过程,尤其在处理大量中文文本时,其批量转换功能显得尤为高效。无论是网页开发者、内容创作者还是数据管理人员,都...

    谷歌浏览器Chrome设置编码插件

    在处理不同来源的网页时,有时会遇到编码问题,导致页面显示乱码。为了方便用户解决这类问题,开发了“谷歌浏览器Chrome设置编码插件”。这个插件允许用户自定义网页的字符编码,确保内容能够正确显示。 首先,我们...

    网页获取JSON中文返回乱码解决方案(java + js)

    在开发Web应用时,我们经常会遇到JSON数据在传输过程中出现中文乱码的问题。尤其是在Java后端与JavaScript前端交互时,由于编码格式不一致或者处理不当,可能会导致中文字符无法正常显示。本文将针对"网页获取JSON...

    WebZIP7 网页或者网站中文版下载

    4. **开始下载**:确认设置无误后,点击“开始”按钮,WebZIP7会开始抓取网页内容,并将其保存到指定的本地目录。 5. **离线浏览**:下载完成后,可以在保存的文件夹中找到一个结构化的网站副本,通过浏览器打开根...

    汉字编码转换器-对文字进行各种编码的工具

    在处理跨平台或网络数据交换时,如果不进行正确的编码转换,可能会出现乱码问题。例如,GBK编码的网页在UTF-8环境下显示时,如果没有转换,汉字会出现乱码。 5. **汉字编码转换器的功能**:这款工具提供了便捷的...

    谷歌插件-设置字符编码

    本文将深入探讨“谷歌插件-设置字符编码”这一主题,以及它如何帮助解决查看源码时出现的中文乱码问题。 首先,我们要理解什么是字符编码。常见的字符编码有ASCII、GB2312、GBK、Big5和Unicode(包括其变体UTF-8、...

    smartUpLoad终极版,完全解决中文路径乱码问题

    然而,当涉及到中文路径时,可能会出现乱码问题,这是由于字符编码不兼容导致的。"smartUpLoad终极版"是一个专为解决这个问题而设计的上传组件,它能够确保在处理包含中文路径的文件时,文件名和路径保持正确无误。 ...

    乱码查看器 EMail中经常碰到的各种乱码

    在IT行业中,乱码是一个常见的问题,特别是在电子邮件(EMail)通信中,由于编码不兼容或者格式转换不当,经常会遇到各种难以识别的字符显示。"乱码查看器"这款工具就是为了帮助用户解决这类问题而设计的。下面我们...

    批量修改文本文件的编码方式至UTF-8或ANSI,可用于批量修改CUE格式文件

    它的优点在于兼容性好,大多数现代软件和网页浏览器都能很好地支持UTF-8编码,减少了乱码问题的出现。 相反,ANSI编码(通常指的是Windows默认的代码页,如Windows-1252)是特定地区的单字节编码,只包含有限的字符...

    文本乱码识别工具包下载

    这通常是由于网页编码不明确或者与预期的编码格式不符导致的。针对这个问题,我们可以借助一些特定的工具和库来帮助识别和处理乱码。在这个“文本乱码识别工具包”中,包含了三个重要的文件:antlr.jar、cpdetector-...

    专用网页修改程序代码

    3. 检查并修正所有内嵌资源的引用路径,确保它们与网页编码一致,避免因URL中的特殊字符编码错误而导致的问题。 #### 结论 网页乱码问题虽然常见,但通过合理的编码管理,无论是静态HTML页面还是动态生成的网页,...

    字符编码 自动识别 编码类型

    在IT领域,尤其是编程和文件处理中,理解不同的字符编码至关重要,因为错误的编码设置可能导致乱码问题。本篇将详细介绍字符编码、自动识别以及常见的编码类型,并提供解决显示乱码的方法。 首先,字符编码是一种...

Global site tag (gtag.js) - Google Analytics