Httpclient gzip 乱码问题解决
■出现问题的原因推测
被反爬了,缺少了cookie,你请求出来的信息就是运行一段js,
生成cookie,看到args1了么,这个是密钥,下面的也不是编码的,就是js混淆的问题
防爬网站需要携带一些基础http头模拟成浏览器登录
https://www.jianshu.com/p/401a25134b89
■前言
以下代码运行的返回值
■代码
package com.sxz.timecontroal;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.zip.GZIPInputStream;import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;public class CheckTimeWithNet {static final String LOGINURL = "https://blog.csdn.net/sxzlc/article/list/3";public static void main(final String[] args) {final DefaultHttpClient httpclient = new DefaultHttpClient();final HttpGet httpGet = new HttpGet(LOGINURL);HttpResponse response = null;try {httpGet.addHeader("Accept-Encoding", "gzip, deflate"); response = httpclient.execute(httpGet); } catch (final ClientProtocolException cpException) {} catch (final IOException ioException) {}// verify response is HTTP OKfinal int statusCode = response.getStatusLine().getStatusCode();if (statusCode != HttpStatus.SC_OK) {System.out.println("Error authenticating to Force.com: "+statusCode);return;}System.out.println("---------------------Status code Info Start---------------------");System.out.println(response.getStatusLine());System.out.println("---------------------Status code Info end ---------------------");System.out.println("---------------------Head Info Start---------------------");final Header[] hs = response.getAllHeaders();for(final Header h:hs){System.out.println(h.getName() + ":" + h.getValue());}System.out.println("---------------------Head Info End ---------------------");String getResult = null;try {// response.setEntity(new GzipDecompressingEntity(response.getEntity())); // getResult = EntityUtils.toString(response.getEntity(),"UTF-8");getResult = getStringFromResponseUzip(response);} catch (final Exception ioException) {// Handle system IO exception}System.out.println(getResult);}public static String getStringFromResponseUzip(final HttpResponse response) throws Exception {if (response == null) {return null;}String responseText = "";//InputStream in = response.getEntity().getContent();final InputStream in = response.getEntity().getContent();final Header[] headers = response.getHeaders("Content-Encoding");for(final Header h : headers){System.out.println(h.getValue());if(h.getValue().indexOf("gzip") > -1){//For GZip responsetry{final GZIPInputStream gzin = new GZIPInputStream(in);final InputStreamReader isr = new InputStreamReader(gzin,"UTF-8");responseText = getStringFromStream(isr);//responseText = URLDecoder.decode(responseText, "utf-8");}catch (final IOException exception){exception.printStackTrace();}return responseText;}}responseText = EntityUtils.toString(response.getEntity(),"utf-8");return responseText;}public static String getStringFromStream(final InputStreamReader isr) throws Exception{final BufferedReader br = new BufferedReader(isr);final StringBuilder sb = new StringBuilder();String tmp;while((tmp = br.readLine())!=null){sb.append(tmp);sb.append("\r\n");}br.close();isr.close();return sb.toString();}
}
■运行结果
---------------------Status code Info Start---------------------
HTTP/1.1 200 OK
---------------------Status code Info end ---------------------
---------------------Head Info Start---------------------
Server:Tengine
Date:Sat, 07 Dec 2019 12:20:38 GMT
Content-Type:text/html; charset=utf-8
Transfer-Encoding:chunked
Connection:keep-alive
Set-Cookie:acw_tc=2760820215757212385795097e52a909ebbcda96b20e30f4c216c0bfbc89e6;path=/;HttpOnly;Max-Age=2678401
Content-Encoding:gzip
cache-control:no-cache, no-store
Pragma:no-cache
Strict-Transport-Security:max-age=86400
---------------------Head Info End ---------------------
gzip
<html><script>
var arg1='70EBF8B68AD7946E52DB795B887AEDFC88D2C6E3';
var _0x4818=['\x63\x73\x4b\x48\x77\x71\x4d\x49',
。。。
();try{return!!window['\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72'];}catch(_0x35538d){return![];}}()){document[_0x55f3('0x33', '\x56\x25\x59\x52')](_0x55f3('0x34', '\x79\x41\x70\x7a'),l,![]);}else{document[_0x55f3('0x36', '\x79\x41\x70\x7a')](_0x55f3('0x37', '\x4c\x24\x28\x44'),l);}_0x4db1c();setInterval(function(){_0x4db1c();},0xfa0);
function setCookie(name,value){var expiredate=new Date();expiredate.setTime(expiredate.getTime()+(3600*1000));document.cookie=name+"="+value+";expires="+expiredate.toGMTString()+";max-age=3600;path=/";}
function reload(x) {setCookie("acw_sc__v2", x);document.location.reload();}
</script></html>
■后续
解压后为16进制代码,有待解决。。。
\x65 z
这是 URLENCODE造成的,使用URLDECODE解决
感谢,[gybao]大神的帮助
https://bbs.csdn.net/topics/395274030
但是,没有使用URLDECODE,之前的代码,在运行一下,竟然直接成功了。
但是,我之前是怎么跑出这种效果的,原因不明。。。 推测问题的原因在下面记述
■再次修改后的代码
对于目前最新代码的说明
当能进入到下面79行的分支中时,不论有没有85行都不会出现乱码问题。
代码
package com.sxz.timecontroal;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.zip.GZIPInputStream;import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;public class CheckTimeWithNet {//static final String LOGINURL = "https://blog.csdn.net/sxzlc?orderby=ViewCount";static final String LOGINURL = "https://blog.csdn.net/sxzlc/article/list/2?orderby=ViewCount";public static void main(final String[] args) {final DefaultHttpClient httpclient = new DefaultHttpClient();final HttpGet httpGet = new HttpGet(LOGINURL);HttpResponse response = null;try {httpGet.addHeader("Accept-Encoding", "gzip, deflate"); response = httpclient.execute(httpGet); } catch (final ClientProtocolException cpException) {} catch (final IOException ioException) {}// verify response is HTTP OKfinal int statusCode = response.getStatusLine().getStatusCode();if (statusCode != HttpStatus.SC_OK) {System.out.println("Error authenticating to Force.com: "+statusCode);return;}System.out.println("---------------------Status code Info Start---------------------");System.out.println(response.getStatusLine());System.out.println("---------------------Status code Info end ---------------------");System.out.println("---------------------Head Info Start---------------------");final Header[] hs = response.getAllHeaders();for(final Header h:hs){System.out.println(h.getName() + ":" + h.getValue());}System.out.println("---------------------Head Info End ---------------------");String getResult = null;try {// response.setEntity(new GzipDecompressingEntity(response.getEntity())); // getResult = EntityUtils.toString(response.getEntity(),"UTF-8");getResult = getStringFromResponseUzip(response);} catch (final Exception ioException) {// Handle system IO exception}System.out.println(getResult);}public static String getStringFromResponseUzip(final HttpResponse response) throws Exception {if (response == null) {return null;}String responseText = "";//InputStream in = response.getEntity().getContent();final InputStream in = response.getEntity().getContent();final Header[] headers = response.getHeaders("Content-Encoding");for(final Header h : headers){System.out.println(h.getValue());if(h.getValue().indexOf("gzip") > -1){//For GZip responsetry{final GZIPInputStream gzin = new GZIPInputStream(in);final InputStreamReader isr = new InputStreamReader(gzin,"UTF-8");responseText = getStringFromStream(isr);responseText = URLDecoder.decode(responseText, "UTF-8");}catch (final IOException exception){exception.printStackTrace();}System.out.println("---------------------is gzip---------------------");return responseText;}}System.out.println("---------------------is not gzip---------------------");responseText = EntityUtils.toString(response.getEntity(),"utf-8");return responseText;}public static String getStringFromStream(final InputStreamReader isr) throws Exception{final BufferedReader br = new BufferedReader(isr);final StringBuilder sb = new StringBuilder();String tmp;while((tmp = br.readLine())!=null){sb.append(tmp);sb.append("\r\n");}br.close();isr.close();return sb.toString();}
}
以上代码运行后的结果
如果Get不设定gzip是,
---
推测出现问题的原因:
-------------------------------------------------------
■原因推测
还是网站那边做了什么特殊的处理
上午之所以好用,是因为网站那边返回的结果没有进行 gzip压缩,
而下午请求同样的地址,经过了gzip压缩,所以在解析处理的时候,无法正常解析。
■现象1
下午再次同样的运行代码,又出现了乱码的问题,
加上DECODE也没有用(以下88,87行),估计解码时出现问题,直接返回NULL了
现象2
上午再cmd 窗口中,使用CURL 上面的地址
可以返回页面的HTML,下午就不行了,返回效果如下。
■关于URLEncode的确认
上面的乱码抽取了一部分,确定是URL编码,但是在解码全部字符串的时候,返回值为NULL
■补充说明
而且,感觉乱码是,返回的信息,和上午返回所有的页面HTML代码相比较,少了很多!
-------------------------------------------------------
■后续(结果说明1)
关于一会儿是 gzip, 一会儿不是,
原因推测是,因为负载平衡,每次访问的服务器不一样。
基于 Nginx 的两个版本(Openresty和Tengine)
・gzip的server信息 Tengine
------------------------------------
------------------------------------
・不是gzip时的server信息
------------------------------------
TODO
------------------------------------
----
---
Httpclient gzip 乱码问题解决相关推荐
- HttpClient上传文件到微信素材乱码问题解决
在开发微信第三方公众平台的时候,需要上传图片.语音等文件到微信服务器.当文件名存在中文时会出现乱码.网上搜了一大堆文章,大部讲什么设置编码啥的,放到微信素材上传这个场景就是用不了,试了各种方式,依然是 ...
- java accept encoding_Accept-Encoding gzip 乱码 和Okhttp的解决方法
在使用okhttp请求服务器数据的时候,发现返回的数据一直都是乱码,但是使用fiddler抓包,decode后,可以正常显示.刚开始一直怀疑是编码的问题,后来对比了hex的数据和程序中乱码的二进制,发 ...
- php 和mysql中文乱码问题,常见php与mysql中文乱码问题解决办法
常见php与mysql中文乱码问题解决办法 乱码问题1:用PHPmyAdmin操作MySQL数据库汉字显示正常,但用PHP网页显示MySQL数据时所有汉字都变成了?号. 症状:用PHPmyAdmin输 ...
- python php 通信,Python和php通信乱码问题解决方法
Python和php通信乱码问题解决方法 发布于 2014-07-29 22:28:21 | 118 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertex ...
- springMVC保存数据到mysql数据库中文乱码问题解决方法
springMVC保存数据到mysql数据库中文乱码问题解决方法 参考文章: (1)springMVC保存数据到mysql数据库中文乱码问题解决方法 (2)https://www.cnblogs.co ...
- java执行cmd命令,返回结果中文乱码问题解决
java执行cmd命令,返回结果中文乱码问题解决 参考文章: (1)java执行cmd命令,返回结果中文乱码问题解决 (2)https://www.cnblogs.com/kwaitfort/p/90 ...
- Zip文件中文乱码问题解决方法(MAC->Windows)
Zip文件中文乱码问题解决方法(MAC->Windows) 参考文章: (1)Zip文件中文乱码问题解决方法(MAC->Windows) (2)https://www.cnblogs.co ...
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 参考文章: (1)Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 (2)https://www.cnblog ...
- python3 库pandas写入csv格式文件出现中文乱码问题解决方法
python3 库pandas写入csv格式文件出现中文乱码问题解决方法 参考文章: (1)python3 库pandas写入csv格式文件出现中文乱码问题解决方法 (2)https://www.cn ...
最新文章
- 在IIS上安装 thinkphp的方法
- KMP字符串模式匹配详解
- buu Unencode
- 输入 vscode_【Python技术入门2】Python集成开发环境VSCode搭建
- PHP中获取数组中单列的值
- Key-Value Coding (KVC)
- t3网络计算机浏览卡死,用友T3软件营改增界面关不了,电脑死机,总账用不了怎么办?...
- connection对象的参数
- Unity与安卓开发的一些路径知识
- 2021华为软挑赛题_思路分析——实时更新,做多少更多少(八)
- Java面试--Structs
- 大麦DW33D路由器假死
- 计算机绘图综合训练大题,工程制图与计算机绘图综合实训报告汇编.doc
- selenium基础自学七(获取超链接)
- 数据分析 --- 如何收集数据
- 【路径规划】基于粒子群算法机器人避障路径规划matlab代码
- 七月三日服务器维护,7月3日全部服务器更新维护公告
- elementUI表格中气泡位置偏移
- Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?
- 使用SQL和Pandas计算累计百分比
热门文章
- jvm 堆外内存_jvm┃java内存区域,跳槽大厂必会知识点
- java按年月季度统计折线图_拆线图按年、按月,按天统计,前端传时间只要起始时间与结束时间...
- rmmod无法卸载驱动_从hello world到LED驱动
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展...
- Office 365 On MacOS 系列——安装 O365 其他组件
- angular4 浏览器兼容
- 最全的spark基础知识解答
- 韦诺之战wesnoth没有声音
- nginx的指令root和alias的区别
- cocoachina上很酷的帖子