HttpGet 请求爬去网页内容,返回乱码问题

本文探讨了使用HttpGet请求获取网页内容时遇到的乱码问题,详细分析了header设置对响应解析的影响,特别是accept-encoding导致的压缩乱码,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

HttpGet请求爬去网页内容,因为是模拟浏览器操作,所以将浏览器的header也都设置到了代码里;结果返回的内容乱码。

g1 = new HttpGet("https://mp.yidianzixun.com/");
//此行设置影响response解析的内容是乱码
//g1.setHeader("accept-encoding","gzip, deflate, br");
g1.setHeader("accept-language", "zh-CN");
.
.
.

HttpResponse response = httpClient.execute(g1);
String result = EntityUtils.toString(response.getEntity(),"utf-8");

查找资料:

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。

现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了。

总结:

因此我们在代码中设置了压缩,则接受到的是压缩之后的数据,因此就呈现出乱码;在header中取消压缩的设置,将不会压缩,已原文本的形式展现,就不再出现乱码的情况。

### Java HTTP请求返回乱码解决方案 对于Java中HTTP请求返回乱码问题,主要原因是字符编码不匹配。当发送或接收数据时,如果客户端和服务端使用的字符集不同,则会出现乱码现象。 #### 设置统一的字符编码 确保服务端和客户端采用相同的字符编码标准是非常重要的。通常情况下,默认使用UTF-8作为通用字符集可以有效减少跨平台传输过程中产生的乱码问题[^1]。 #### 使用InputStreamReader指定编码读取流 通过`InputStreamReader`类并指明具体的字符编码来创建输入流对象,从而保证能够按照预期的方式解析接收到的数据: ```java BufferedReader in = new BufferedReader( new InputStreamReader(inputStream, "UTF-8")); // 明确设置字符编码为 UTF-8 ``` 此方法适用于处理GET/POST等各种类型的HTTP响应内容[^3]。 #### 处理GZIP压缩后的响应体 有时服务器会启用GZIP压缩功能以减小网络流量,在这种情形下除了要关注字符编码外还需要先对字节流进行解压操作再做进一步处理: ```java if ("gzip".equalsIgnoreCase(contentEncoding)) { GZIPInputStream gis = new GZIPInputStream(entity.getContent()); reader = new BufferedReader(new InputStreamReader(gis,"UTF-8")); } else { reader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8")); } ``` 这段代码展示了如何判断是否需要执行GZIP解压缩以及怎样正确地应用字符编码转换逻辑。 #### 发送带有适当头部信息的请求 另外值得注意的是,在发起HTTP请求之前应该向目标URL附加合适的Accept-Encoding与Content-Type字段,告知远端服务器本机支持哪些编码头部信息可以帮助优化整个通信过程中的性能表现同时也降低了发生错误的可能性[^2]: ```java connection.setRequestProperty("Accept-Encoding", "gzip"); connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); ``` 以上措施综合起来能有效地预防并修复大部分由字符编码差异引发的乱码情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值