无论使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:
第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest;
第二 模拟POST或者GET方式提交的数据;
第三 模拟请求的头;
第四 提交请求并获得响应,及对响应做我们所需要的处理。
这里我们以人人网的登录为例,将涉及到POST以及GET两种请求方式。
在之前的文章《免费网页抓包工具,火狐插件FireBug的抓包使用教程》中我们知道,登陆人人网的时候,一共做了一个POST请求以及两个GET请求,如下图:

观察这三个请求的详细信息,不难看出第一个GET请求的地址可以由POST的响应得到,而第二个GET请求的地址又由第一个GET的响应得到。
先来模拟第一个POST请求

  1. HttpWebRequest request = null;
  2. HttpWebResponse response = null;
  3. string gethost = string.Empty;
  4. CookieContainer cc = new CookieContainer(); // 若要从远程调用中获取COOKIE一定要为request设定一个CookieContainer用来装载返回的cookies
  5. string Cookiesstr = string.Empty;
  6. try
  7. {
  8. //第一次POST请求
  9. string postdata = "email=" + UserName.Replace("@", "%40") + "&password=" + PassWord + "&origURL=" + HostUrl + "&domain=renren.com";//模拟请求数据,数据样式可以用FireBug插件得到。人人网POST数据时,用户名邮箱中的“@”变为“%40”,所以我们也要作此变化
  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. //request.Referer = "http://www.renren.com/Login.do?rf=r&domain=renren.com&origURL=" + HostUrl;
  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. //取第一次GET跳转地址
  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];
  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. //取再次跳转链接
  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];
  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. request.Abort();
  38. response.Close();
  39. }
  40. catch (Exception)
  41. {
  42. //第二次GET出错
  43. }

GET与POST请求大同小异,这里便不再累述。三次请求结束,保存好你的cookie string,每次请求的时候都赋给请求的头部,你就处于登录状态了。
人人网的HttpWebRequest登陆模拟很简单,但是POST及GET涉及到了,是个不错的案例。
当然,在.net想做自动访问的操作还可以使用WebBrowser控件,而且还能够和HttpWebRequest共用cookie,抛砖引玉一下不在本篇文章的讨论范围。

使用C#的HttpWebRequest模拟登陆访问人人网(转)的更多相关文章

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

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

  2. c# 使用 HttpWebRequest模拟登陆

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

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

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

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

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

  5. 使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)

    前言 其实老喜欢取经,偶尔也得分享下.关于阿里巴巴国际站的登陆,过程有点复杂但是算不上难.一不小心少个东西倒也挺麻烦的. 主要是看下请求类HttpClient基本请求封装使用,AliClient模拟浏 ...

  6. 使用C#的HttpWebRequest模拟登陆网站

    很久没有写新的东西了,今天在工作中遇到的一个问题,感觉很有用,有种想记下来的冲动. 这篇文章是有关模拟登录网站方面的. 实现步骤: 启用一个web会话 发送模拟数据请求(POST或者GET) 获取会话 ...

  7. HttpWebRequest 模拟浏览器访问网站

    最近抓网页时报错: 要么返回 The remote server returned an error: (442)要么返回: 非法访问,您的行为已被WAF系统记录! 想了想,就当是人家加了抓网页的东西 ...

  8. HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3284481.html] PostLogin :登录,并保存Cookie 1 public st ...

  9. C#如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用

    public static string GetCookie(string requestUrlString, Encoding encoding, ref CookieContainer cooki ...

随机推荐

  1. PHP阿里大于发短信教程

    PHP阿里大于发短信教程 1 先去控制台 https://www.alidayu.com/center/user/account?spm=a3142.7791109.1999204004.5.ZtBQ ...

  2. 算法浅谈之DP悬线法

    悬线法 用途 解决给定矩阵中满足条件的最大子矩阵 做法 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义 \(left[i][j]\):代表从\((i,j)\)能到达的最左位置 \ ...

  3. TCP/IP学习笔记14--IP地址 之 全局地址,私有地址

    只要明天还在,我就不会悲哀,冬雪终会悄悄融化,春雷定将滚滚而来.----<只要明天还在>,汪国真 全局地址,私有地址 , 一种为解决IP地址不足而产生的技术. 起初 ,互联网中的任何一台主 ...

  4. JavaScript有用的代码片段和trick

    浮点数取整 const x = 123.4545; x >> 0; ~~x; x | 0; Math.floor(x); 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math. ...

  5. Linux下创建Oracle19C的数据库实例

    接上一篇博客,安装 Oracle19chttps://www.cnblogs.com/xuzhaoyang/p/11264557.html 切换到root用户下,切换目录到db_1,执行,遇到选择路径 ...

  6. python实战项目 — 使用bs4 爬取猫眼电影热榜(存入本地txt、以及存储数据库列表)

    案例一: 重点: 1. 使用bs4 爬取 2. 数据写入本地 txt from bs4 import BeautifulSoup import requests url = "http:// ...

  7. 27 多线程(一)——创建进程的三种方法、线程锁(同步synchornized与lock)

    线程的流程 线程的创建 有三种方法,重点掌握前两种: 继承Thread类 实现Runnable接口(推荐使用:避免单继承的局限性) 实现Callable接口 根据java的思想,要少用继承,多用实现. ...

  8. 【scratch3.0教程】1.3 了解scratch界面内容

    第3课 了解Scratch界面内容 1.认识Scratch界面 双击桌面快捷方式,启动Scratch程序.我们来认识一下Scratch界面吧! (1)指令区 Scratch程序一共有运动.外观.声音. ...

  9. Codeforces 1239B. The World Is Just a Programming Task (Hard Version)

    传送门 这一题好妙啊 首先把括号序列转化成平面直角坐标系 $xOy$ 上的折线,初始时折线从坐标系原点 $(0,0)$ 出发 如果第 $i$ 个位置是 '(' 那么折线就往上走一步($y+1$),否则 ...

  10. [高清] Java编程思想第四版完整中文高清版

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...