文档章节

模拟浏览器登录网站

蓝缘Y
 蓝缘Y
发布于 2013/09/07 00:49
字数 786
阅读 1629
收藏 23

  

  本程序采用JAVA所定,举个例子是模拟浏览器登录小米官网,采用的类主要是HttpURLConnection,HttpsURLConnectionURL请求的类别: 分二类,GET与POST请求。二者的区别在于:     

  a:) get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给servlet, 
     b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。 
小米官网登录分析,浏览器首先打开此地址,进行第一次会话,https://account.xiaomi.com/pass/serviceLogin,会话的过程中会保存会话ID,以后每次请求都需要附上此ID才行,否则服务器会认为用户是重新登录,有了此ID,服务器会认为是同一个用户此次请求是GET请求,相应的HttpURLConnction的设置如下

url=new URL(urlStr);
            httpConn=(HttpURLConnection) url.openConnection();
            httpConn.setRequestMethod("GET");
            HttpsURLConnection.setFollowRedirects(false);
            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; qdesk 2.4.1263.203; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727");
            httpConn.setRequestProperty("Accept-Language","zh-cn");
            httpConn.setRequestProperty("Accept", "application/msword, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*");
            httpConn.setRequestProperty("Accept-Encoding","gzip, deflate");
            httpConn.setUseCaches(false);
            httpConn.setRequestProperty("Host","account.xiaomi.com");
            httpConn.setRequestProperty("Connection", "Keep-Alive");
            httpConn.setConnectTimeout(15000);
            httpConn.setReadTimeout(20000);
            httpConn.setAllowUserInteraction(false);

设置完后,即发送请求:

httpConn.getInputStream();
            String cookieVal = null;
            String key=null;
            for (int i = 1; (key = httpConn.getHeaderFieldKey(i)) != null; i++ ) {
                System.out.println(key+"-----"+httpConn.getHeaderField(i));
            if (key.equalsIgnoreCase("set-cookie")){
                cookieVal = httpConn.getHeaderField(i);
                cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
                System.out.println(cookieVal);
                String []str=sessionId.split(";");
                boolean flag=false;
                for(int t=0;t<str.length;t++)
                {
                    if(str[t]==cookieVal)
                        flag=true;
                }
                if(!flag)
                {
                    sessionId=sessionId+cookieVal+";";
                }                        
            }
            }
            BufferedReader in = null;
            sessionId=sessionId.substring(0,sessionId.length()-1);
            InputStream inz=httpConn.getInputStream();
            in = new BufferedReader(new InputStreamReader(inz,"UTF-8"));
            String str=httpConn.getHeaderField("Content-Encoding");
            if(str!=null&&str.trim().endsWith("gzip"))
            {
                GZIPInputStream gzin = new GZIPInputStream(inz);
                in = new BufferedReader(new InputStreamReader(gzin, "UTF-8"));
            }        
            String line="";
            while((line=in.readLine())!=null)
            {
                System.out.println(line);
            }

上述代码会获取会话ID,JSESSION,注意服务器可能会返回gzip格式的数据,要进行相应的处理

有了会话ID后,即可进行登录,登录采用的是POST请求,POST请求参数是通过PrintWriter写入,从返回的数据中获得相应的cookie值作下一次使用

注意请求参数的设置,参数的设置可以查看页面源代码可知,Post请求需要传的参数为passToken,user,pwd,callback,sid,hidden

相应的HttpURLConnction的设置如下

url=new URL(urlStr);
            httpConn=(HttpsURLConnection) url.openConnection();
            httpConn.setRequestMethod("POST");
            HttpsURLConnection.setFollowRedirects(false);
            System.out.println("second:"+sessionId);
            httpConn.setRequestProperty("Cookie", sessionId);
            httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            httpConn.setRequestProperty("Accept", "application/msword, application/xaml+xml, application/x-ms-xbap, application/x-ms-application, */*");
            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; qdesk 2.4.1263.203; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727");
            httpConn.setRequestProperty("Accept-Language","zh-cn");
            httpConn.setRequestProperty("Accept-Encoding", "gzip, deflate");
            httpConn.setRequestProperty("Connection", "Keep-Alive");
            httpConn.setRequestProperty("Host","account.xiaomi.com");
            httpConn.setRequestProperty("Content-Length",String.valueOf(param.getBytes()));
            httpConn.setRequestProperty("Referer","https://account.xiaomi.com/pass/serviceLogin");
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);
            httpConn.setConnectTimeout(15000);
            httpConn.setUseCaches(false);
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(false);

获得数据并设置cookie为进一步访问做准备

PrintWriter out = new PrintWriter(httpConn.getOutputStream());
            out.print(param);
            out.flush();
            out.close();
            InputStream inz=httpConn.getInputStream();
            in = new BufferedReader(new InputStreamReader(inz,"UTF-8"));
            String key=null;
            String cookieVal = null;
            String str=httpConn.getHeaderField("Content-Encoding");
            if(str!=null&&str.trim().endsWith("gzip"))
            {
                GZIPInputStream gzin = new GZIPInputStream(inz);
                in = new BufferedReader(new InputStreamReader(gzin, "UTF-8"));
            }
            for (int i = 1; (key = httpConn.getHeaderFieldKey(i)) != null; i++ ) {
                System.out.println(key+"-----"+httpConn.getHeaderField(i));
                if (key.equalsIgnoreCase("set-cookie")) {
                    cookieVal = httpConn.getHeaderField(i);
                    cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
                    if(cookieVal.indexOf("passToken")>-1)
                    {
                        passToken=cookieVal.substring(cookieVal.indexOf("=")+1);
                    }
                    if(cookieVal.indexOf("userId")>-1)
                    {
                        userId=cookieVal.substring(cookieVal.indexOf("=")+1);
                    }
                }
            }
            String line;
            while ((line = in.readLine())!= null)
            {
                System.out.println(line);
            }
            httpConn.getInputStream().close();

写到这了,你就可以看到登录成功后你自已的用户信息,随后的每一次访问都需要先前设置的cookie

 

 

 

 

 

 

 

© 著作权归作者所有

蓝缘Y
粉丝 22
博文 6
码字总数 4714
作品 0
广州
私信 提问
加载中

评论(1)

史雄伟
楼主你好,请问抓取报文分析,中间有几次重定向你不需要另外处理吗?
python-02:学习路线

随时更新的学习路线 1. python基础知识 麦子学院的几个短视频 python 爬虫基础 2. 以python爬虫作为入手点深入学习 1. 爬虫基础知识,最简单的爬虫程序,理解最简单的爬虫程序 2. 丑事百科实...

达岭凹老大
2015/11/23
299
0
C++ 代码模拟登录淘宝、天猫、支付宝等电商网站的实现

想通过纯代码(我指的是不借助浏览器而完全通过自己处理和发送请求)来实现登录有一定阻碍, 因为PC端网站的登录模块出于各种原因被电商网站加密了, 整个登录流程不是公开的(相对其他未加密的网...

RLib
2015/01/26
0
0
Python骚操作:打造VIP账号共享浏览器

以下是文章内容: 本篇文章介绍的内容会涉及到以下知识: PyQt5的使用; Selenium的使用; 代理服务器的架设和使用; 一、账号限制之痛 在如今的互联网中,免费的信息和资源占据了很大一部分,...

急速奔跑中的蜗牛
06/06
0
0
PHP爬虫和基于命令行的Python爬虫有什么差别?

基于命令行的Python爬虫。。。就是说是命令行运行的,而不是通过浏览器运行的 然后这种Python爬虫和PHP爬虫什么差别呢? 是不是因为php爬虫本身基于浏览器,一旦你的浏览器已经登录了对方网站...

oreax
2018/06/05
2.2K
6
python-37: 模拟登录

我们通过前面的两个实例讲解了爬虫的简单应用,但是在很多网站中,你将会发现你写的所有代码都没有用 因为你没有登录 登录网站是一种很常见的行为,就拿百度贴吧来说,你需要先登录才能发贴回...

达岭凹老大
2015/12/01
180
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部