很久没有写新的东西了,今天在工作中遇到的一个问题,感觉很有用,有种想记下来的冲动。

这篇文章是有关模拟登录网站方面的。

实现步骤;

  1. 启用一个web会话
  2. 发送模拟数据请求(POST或者GET)
  3. 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据。

我们以登录人人网为例,首先需要分析人人网登录时POST的数据格式,这个可以通过IE9中只带的F12快捷键,调出开发人员工具。如下图:

通过开始捕获得到POST的地址和POST的数据

POST数据:

email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476

POST地址:

http://www.renren.com/PLogin.do

下面就是代码示例来得到登录后页面(http://guide.renren.com/guide)的数据

HTMLHelper类

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Threading;
  2.  
  3. namespace Test
    {
    public class HTMLHelper
    {
    /// <summary>
    /// 获取CooKie
    /// </summary>
    /// <param name="loginUrl"></param>
    /// <param name="postdata"></param>
    /// <param name="header"></param>
    /// <returns></returns>
    public static CookieContainer GetCooKie(string loginUrl, string postdata, HttpHeader header)
    {
    HttpWebRequest request = null;
    HttpWebResponse response = null;
    try
    {
    CookieContainer cc = new CookieContainer();
    request = (HttpWebRequest)WebRequest.Create(loginUrl);
    request.Method = header.method;
    request.ContentType = header.contentType;
    byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
    request.ContentLength = postdatabyte.Length;
    request.AllowAutoRedirect = false;
    request.CookieContainer = cc;
    request.KeepAlive = true;
  4.  
  5. //提交请求
    Stream stream;
    stream = request.GetRequestStream();
    stream.Write(postdatabyte, 0, postdatabyte.Length);
    stream.Close();
  6.  
  7. //接收响应
    response = (HttpWebResponse)request.GetResponse();
    response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
  8.  
  9. CookieCollection cook = response.Cookies;
    //Cookie字符串格式
    string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
  10.  
  11. return cc;
    }
    catch (Exception ex)
    {
  12.  
  13. throw ex;
    }
    }
  14.  
  15. /// <summary>
    /// 获取html
    /// </summary>
    /// <param name="getUrl"></param>
    /// <param name="cookieContainer"></param>
    /// <param name="header"></param>
    /// <returns></returns>
    public static string GetHtml(string getUrl, CookieContainer cookieContainer,HttpHeader header)
    {
    Thread.Sleep(1000);
    HttpWebRequest httpWebRequest = null;
    HttpWebResponse httpWebResponse = null;
    try
    {
    httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(getUrl);
    httpWebRequest.CookieContainer = cookieContainer;
    httpWebRequest.ContentType = header.contentType;
    httpWebRequest.ServicePoint.ConnectionLimit = header.maxTry;
    httpWebRequest.Referer = getUrl;
    httpWebRequest.Accept = header.accept;
    httpWebRequest.UserAgent = header.userAgent;
    httpWebRequest.Method = "GET";
    httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    Stream responseStream = httpWebResponse.GetResponseStream();
    StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
    string html = streamReader.ReadToEnd();
    streamReader.Close();
    responseStream.Close();
    httpWebRequest.Abort();
    httpWebResponse.Close();
    return html;
    }
    catch (Exception e)
    {
    if (httpWebRequest != null) httpWebRequest.Abort();
    if (httpWebResponse != null) httpWebResponse.Close();
    return string.Empty;
    }
    }
    }
  16.  
  17. public class HttpHeader
    {
    public string contentType { get; set; }
  18.  
  19. public string accept { get; set; }
  20.  
  21. public string userAgent { get; set; }
  22.  
  23. public string method{get;set;}
  24.  
  25. public int maxTry { get; set; }
    }
    }

测试用例:

  1. HttpHeader header = new HttpHeader();
    header.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*";
    header.contentType = "application/x-www-form-urlencoded";
    header.method = "POST";
    header.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
    header.maxTry = 300;
  2.  
  3. string html = HTMLHelper.GetHtml("http://guide.renren.com/guide", HTMLHelper.GetCooKie("http://www.renren.com/PLogin.do",
    "email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476", header), header);
  4.  
  5. Console.WriteLine(html);
  6.  
  7. Console.ReadLine();

使用C#的HttpWebRequest模拟登陆网站的更多相关文章

  1. 转:使用C#的HttpWebRequest模拟登陆网站

    这篇文章是有关模拟登录网站方面的. 实现步骤: 启用一个web会话 发送模拟数据请求(POST或者GET) 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据. ...

  2. c# 使用 HttpWebRequest模拟登陆

    c# 使用 HttpWebRequest模拟登陆(附带验证码) 分类: C# .net2010-06-04 00:50 35647人阅读 评论(43) 收藏 举报 c#exceptionstreams ...

  3. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    [前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...

  4. HttpWebRequest模拟c#网站登录

     用户名 密码 模拟登录asp.net开发的网站 关心两个问题:通过控件属性获取数据.响应事件. 上面是一个普通的asp.net表单.输入用户名.密码后,点击按钮将会进入各自绑定的后台函数,而不仅仅是 ...

  5. c# 使用 HttpWebRequest模拟登陆(附带验证码)

    在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等. 先说下流程 1.使用httpwebrequest先进入你要登录的 ...

  6. 使用C#的HttpWebRequest模拟登陆访问人人网

    使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路: 第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest:第二 模拟POST或者GET方式提交的 ...

  7. 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站

    Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...

  8. 使用C#的HttpWebRequest模拟登陆访问人人网(转)

    无论使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest:第二 模拟POST或者GET方式提交 ...

  9. python requests 模拟登陆网站,抓取数据

    抓取页面数据的时候,有时候我们需要登陆才可以获取页面资源,那么我们需要登陆以后才可以跳转到对应的资源页面,那么我们需要通过模拟登陆,登陆成功以后再次去抓取对应的数据. 首先我们需要通过手动方式来登陆一 ...

随机推荐

  1. nginx 重定向 说明

    一.nginx 两个操作系统的安装见以前的随笔(已安装请跳过) linux上搭建nginx windows上搭建nginx 二.Nginx重定向——直接到项目,而非nginx欢迎页 默认ngin修改n ...

  2. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  3. Android如何着色字符串的特定部分

    文章选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文探讨Android如何着色字符串的特定部分. ...

  4. FLAG区

    以下是一些flag(倒了我也不会怎么样): 更博客(对不起 您呼叫的flag是空号 请稍后再拨) CTS/APIO2019 Cu+ NOI2019 Ag+

  5. 让自己的网站实现在线编辑office文档

    我们可以通过Office Web Apps(OWA)来实现在线编辑word,excel,power point, one note,并集成到自己的网站里去.   1 准备工作 1.1 操作系统 安装了 ...

  6. Linux下搜狗输入法和快捷键Ctrl+Space冲突的解决

    配置快捷键(不是搜狗的设置) 把搜狗的启动快捷键给删了(如果有两个键盘[英+中],你按Shift就可以切换了,完全没必要占着茅坑) 其他快捷键冲突在键盘里面设置 over

  7. eclipse 设置

    修改工作空间默认编码:Window --> Preferences --> General --> Workspace --> Text file encoding --> ...

  8. 【CF1141F1】Same Sum Blocks

    题目大意:给定一个 N 个值组成的序列,求序列中区间和相同的不相交区间段数量的最大值. 题解:设 \(dp[i][j]\) 表示到区间 [i,j] 时,与区间 [i,j] 的区间和相同的不相交区间数量 ...

  9. plink:ped格式转换为bed格式

    命令行如下: plink --file FILENAME --make-bed --out FILENAME 第一个FILENAME的后缀为.ped和.map,生成的第二个FILENAME的后缀为.b ...

  10. linux系统调用之网络管理2

    socketcall socket系统调用 socket 建立socket bind 绑定socket到端口 connect 连接远程主机 accept 响应socket连接请求 send 通过soc ...