关键词搜索

源码搜索 ×
×

C#抓取需要登录的页面

发布2012-02-05浏览6600次

详情内容

抓取需要登录的页面的内容,原理主要是:先模拟登录,获取到COOKIE,然后接下来的访问,都使用这个COOKIE,就可以访问到需要登录的页面。

理论上,浏览器可以做到的事情,程序应该也可以。

不过,模拟登录,说起来容易,但不同站点有不同的处理方式,复杂程度不同。

1、最简单的,是POST适当的数据,不用验证码

2、象Discuz!系列的,要先访问某一个页面,获得随机码,然后置于POST数据中,才可以登录

3、需要验证码。验证码识别是另外一个课题。

无论如何,POST数据必须的。那么,模拟登录,需要POST哪些数据呢?

其实,需要POST哪些数据,每个站点都有所不同,所以要有一个合适的工具来进行分析。我装的是firefox的扩展控件:HttpFox。利用它,可以很方便的获取登录指定站点时,所需要提交的数据串。

模拟登录的代码是这样的:

  1. //sPostData,待提交的数据串,如http://www.test.com/login.aspx?user=admin&pwd=123456
  2. public static CookieContainer Login(string url, string sPostData, CookieContainer cc)
  3. {
  4. CookieContainer container = (cc == null) ? new CookieContainer() : cc;
  5. ASCIIEncoding encoding = new ASCIIEncoding();
  6. byte[] data = encoding.GetBytes(sPostData);
  7. HttpWebRequest resquest = ResquestInit(url);
  8. resquest.Method = "POST";
  9. resquest.ContentLength = data.Length;
  10. resquest.CookieContainer = container;
  11. Stream newStream = resquest.GetRequestStream();
  12. newStream.Write(data, 0, data.Length);
  13. newStream.Close();
  14. try
  15. {
  16. HttpWebResponse response = (HttpWebResponse)resquest.GetResponse();
  17. response.Cookies = container.GetCookies(resquest.RequestUri);
  18. }
  19. catch{}
  20. return container;
  21. }
  22. //这个函数的作用就是统一Request的格式,使得每次访问目标网站都用相同的口径。如果参数不同的话,可能造成COOKIE无效,因而登录无效
  23. public static HttpWebRequest ResquestInit(string url)
  24. {
  25. Uri target = new Uri(url);
  26. HttpWebRequest resquest = (HttpWebRequest)WebRequest.Create(target);
  27. resquest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.2) Geckohttps://cdn.jxasp.com:9143/image/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)";
  28. resquest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  29. resquest.AllowAutoRedirect = true;
  30. resquest.KeepAlive = true;
  31. resquest.ReadWriteTimeout = 120000;
  32. resquest.ContentType = "application/x-www-form-urlencoded";
  33. resquest.Referer = url;
  34. return resquest;
  35. }


获得这个CookieContainer后,保存下来,以后每访问该网站,都带上它。CookieContainer相当于浏览器的COOKIE容器,里面存放访问各个网站的COOKIE。

带COOKIE访问代码如下:

  1. static HttpWebResponse GetResponse(string url, CookieContainer cc)
  2. {
  3. try
  4. {
  5. CookieContainer container = (cc == null) ? new CookieContainer() : cc;
  6. HttpWebRequest resquest = ResquestInit(url);
  7. resquest.CookieContainer = container;
  8. HttpWebResponse response = (HttpWebResponse)resquest.GetResponse();
  9. response.Cookies = container.GetCookies(resquest.RequestUri);
  10. return response;
  11. }
  12. catch
  13. {
  14. return null;
  15. }
  16. }

其中参数 CookieContainer cc 就是保存的CookieContainer。




相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载