zoukankan      html  css  js  c++  java
  • 使用C#的HttpWebRequest模拟登陆访问人人网

    使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:

    第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest;
    第二 模拟POST或者GET方式提交的数据;
    第三 模拟请求的头;
    第四 提交请求并获得响应,及对响应做我们所需要的处理。
    这里我们以人人网的登录为例,将涉及到POST以及GET两种请求方式。
    大家使用抓包工具(IE调试工具/httpwatch)都是可以的,我这里采用httpwatch,登陆人人网的时候(www.renren.com),一共做了一个POST请求以及两个GET请求,如下图:

    post了一个后,第一个返回状态值是200的一般就是登录后的首页地址,有些网页需要跳转的比较多一些,但是方法都是一样的,

    观察这三个请求的详细信息,不难看出这里都是顺序的,第一个GET请求的地址由POST的响应得到,而第二个GET请求的地址又由第一个GET的响应得到。

    每次请求与下一次请求之间的联系就是每次请求后返回的Cookies数据,前一次的返回Cookie数据需要同下一次请求一同发送到服务器,这也是C#模拟网站登陆的关键。

    这里需要注意几点:

    一、选择需要post的地址,可以通过工具查看获得,也可以通过查看网页源代码获得。

    二、content可以查看返回的内容,或者是包含下一跳的链接地址。到最后一定是首页的网页内容。

    先来模拟第一个POST请求

    1. HttpWebRequest request = null;   
    2. HttpWebResponse response = null;   
    3. string gethost = string.Empty;   
    4. CookieContainer cc = new CookieContainer();   
    5. string Cookiesstr = string.Empty;   
    6. try  
    7. {   
    8.         //第一次POST请求   
    9.     string postdata =“”email=adm13956587&password=786954887&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&captcha_type=web_login" //模拟请求数据,httpwatch中点击stream,就可以直接复制了
    10.     string  LoginUrl="http://www.renren.com/PLogin.do";   
    11.       request = (HttpWebRequest)WebRequest.Create(LoginUrl);//实例化web访问类   
    12.     request.Method = "POST";//数据提交方式为POST   
    13.       //模拟头   
    14.     request.ContentType = "application/x-www-form-urlencoded";   
    15.       byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);   
    16.       request.ContentLength = postdatabytes.Length;   
    17.   
    18.       request.AllowAutoRedirect = false;   
    19.       request.CookieContainer = cc;   
    20.       request.KeepAlive = true;   
    21.       //提交请求   
    22.     Stream stream;   
    23.       stream = request.GetRequestStream();   
    24.       stream.Write(postdatabytes, 0, postdatabytes.Length);   
    25.       stream.Close();   
    26.       //接收响应   
    27.     response = (HttpWebResponse)request.GetResponse();   
    28.       //保存返回cookie   
    29.       response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);   
    30.       CookieCollection cook = response.Cookies;   
    31.       string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);   
    32.       Cookiesstr = strcrook;   
    33.       //从返回的stream当中取第一次GET跳转地址: The URL has moved <a href="http://www.renren.com/home">here</a>
    34.     StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);   
    35.       string content = sr.ReadToEnd();   
    36.       response.Close();   
    37.       string[] substr = content.Split(new char[] { '"' });   
    38.       gethost = substr[1];   //http://www.renren.com/home
    39. }   
    40. catch (Exception)   
    41. {   
    42.       //第一次POST出错;   
    43. }  

    注释写的很详细了,在这就不再分析,也许有人对request = (HttpWebRequest)WebRequest.Create(LoginUrl)有疑问,可以去google一下HttpWebRequest和WebRequest的区别,简单来说WebRequest是一个抽象类,不能直接实例化,需要被继承,而HttpWebRequest继承自WebRequest。

    再模拟第一个和第二个GET请求

    1. try  
    2. {   
    3.     request = (HttpWebRequest)WebRequest.Create(gethost);   
    4.     request.Method = "GET";   
    5.     request.KeepAlive = true;   
    6.     request.Headers.Add("Cookie:" + Cookiesstr);   
    7.     request.CookieContainer = cc;   
    8.     request.AllowAutoRedirect = false;   
    9.     response = (HttpWebResponse)request.GetResponse();   
    10.     //设置cookie   
    11.     Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);   
    12.     //取再次跳转链接   The URL has moved <a href="http://www.renren.com/1915651750">here</a>
    13.     StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);   
    14.     string ss = sr.ReadToEnd();   
    15.     string[] substr = ss.Split(new char[] { '"' });   
    16.     gethost = substr[1];   //http://www.renren.com/1915651750
    17.     request.Abort();   
    18.     sr.Close();   
    19.     response.Close();   
    20. }   
    21. catch (Exception)   
    22. {   
    23.     //第一次GET出错   
    24. }   
    25. try  
    26. {   
    27.     //第二次GET请求   
    28.     request = (HttpWebRequest)WebRequest.Create(gethost);   
    29.     request.Method = "GET";  
    30.     request.KeepAlive = true;  
    31.     request.Headers.Add("Cookie:" + Cookiesstr);   
    32.     request.CookieContainer = cc;   
    33.     request.AllowAutoRedirect = false;   
    34.     response = (HttpWebResponse)request.GetResponse();   
    35.     //设置cookie   
    36.     Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);
    37. StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

    38.  

      string ss = sr.ReadToEnd();

    39. webBrowser1.Navigate("about:blank");
    40. webBrowser1.Document.OpenNew(true);

    41. webBrowser1.Document.Write(ss);

    42.     request.Abort();   
    43.     response.Close();   
    44. }   
    45. catch (Exception)   
    46. {   
    47.     //第二次GET出错   
    48. }  

    GET与POST请求大同小异,这里便不再累述。三次请求结束,保存好你的cookie string,每次请求的时候都赋给请求的头部,你就处于登录状态了。

  • 相关阅读:
    AtCoder Beginner Contest 205
    Codeforces Round #725 (Div. 3)
    Educational Codeforces Round 110 (Rated for Div. 2)【A
    Codeforces Round #722 (Div. 2)
    AtCoder Beginner Contest 203(Sponsored by Panasonic)
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    PTA 520 钻石争霸赛 2021
    Educational Codeforces Round 109 (Rated for Div. 2)【ABCD】
    AtCoder Beginner Contest 200 E
    Educational Codeforces Round 108 (Rated for Div. 2)【ABCD】
  • 原文地址:https://www.cnblogs.com/xiaoxia/p/7285674.html
Copyright © 2011-2022 走看看