文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>.net 数据抓取中添加cookie值

.net 数据抓取中添加cookie值

时间:2011-04-20  来源:duohahawuwu

最近发现抓取网页数据的工作越来越多了,抓取技术,正则表达式,各种麻烦,这次又遇到了cookie的问题。

首先痛恨一下那些靠cookie来变换网页内容的网站,嘿嘿

 在网上找了一些资料,最后整理出来了结论

 说结论之前先说一下cookie的层次关系,在.net中cookie的大小关系如下CookieContainer--CookieCollection--Cookie  ,其中我们使用的HttpWebRequest使用的正式第一级别也就是CookieContainer,弄明白这个关系以后就可以进行相应的代码开发了

 

 1 public void StartClimb()
 2         {
 3             string urlContent = "";
 4 
 5             try
 6             {
 7                 CookieCollection cookies = new CookieCollection();
 8                 cookies.Add(new Cookie("cookie名称", "cookie值"));
 9 
10                 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://www.XXXXX.com");
11                 webRequest.Timeout = 30000;
12                 webRequest.AllowAutoRedirect = true;
13                 webRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
14                 webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
15                 webRequest.Headers.Set("Pragma", "no-cache");
16                 webRequest.Headers.Add("Accept-Language", "zh-cn,zh;q=0.5");
17                 webRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
18                 webRequest.Headers.Add("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
19 
20                 CookieContainer myCookieContainer = new CookieContainer();
21                 myCookieContainer.Add(webRequest.RequestUri,cookies);
22                 webRequest.CookieContainer = myCookieContainer;
23 
24                 HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
25                 
26 
27                 Stream stream;
28                 //对gzip和deflate进行解密处理
29                 switch (webResponse.ContentEncoding)
30                 {
31                     case "gzip":
32                         stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
33                         break;
34                     case "deflate":
35                         stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
36                         break;
37                     default:
38                         stream = webResponse.GetResponseStream();
39                         break;
40                 }
41 
42                 StreamReader streamReader;
43                 streamReader = new StreamReader(stream, Encoding.UTF8);
44                 //streamReader = new StreamReader(stream, Encoding.Default);
45                 //streamReader = new StreamReader(stream, Encoding.UTF8);
46                 urlContent = streamReader.ReadToEnd();
47                 streamReader.Close();
48                 stream.Close();
49 
50                 if (webRequest != null) { webRequest.Abort(); }
51                 if (webResponse != null) { webResponse.Close(); }
52             }
53             catch (WebException ex)
54             {
55 
56             }
57             catch (Exception ex)
58             {
59 
60             }
61 
62             
63         }

有了上面的代码应该就可以搞定cookie的事情了。不过一般我们在开发的时候可能会忘记Cookie的Domain问题,这样的话在程序执行的时候会导致报错

 

myCookieContainer.Add(webRequest.RequestUri,cookies); 这句话声明了必要的Domain,CSDN上面的一个帖子的问题就出在于此http://topic.csdn.net/u/20080402/18/d63636a7-d81e-40f2-b972-b9c6bb775ac4.html

 

 

对了,如果你不知道需要传递什么cookie给服务器,那么有很多办法,其中最简单的就是通过firefox的firebig来查看,还有ie9里面的f12功能,再有就是自己写程序,在抓取的时候获取一些传回的cookie值,但是记得也要声明URL

 

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
CookieCollection CCol = myCookieContainer.GetCookies(webRequest.RequestUri);
 

 

 

 

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载