C# webrequest 抓取数据时,多个域Cookie的问题

Posted 左正

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# webrequest 抓取数据时,多个域Cookie的问题相关的知识,希望对你有一定的参考价值。

最近研究了下如何抓取为知笔记的内容,在抓取笔记里的图片内容时,老是提示403错误,用Chorme的开发者工具看了下:

技术分享图片

这里的Cookie来自两个域,估计为知那边是验证了token(登录后才能获取到token)

下载图片的代码:

 

[csharp] view plain copy
 
  1. var path = "https://note.wiz.cn/" + str.TrimStart(‘/‘);  
  2. var extension = Path.GetExtension(path);  
  3. var filepath = AppPath.Combine("Images/" + DateTime.Now.Ticks + extension);  
  4.   
  5. const string userAgent ="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/29.0.1547.76 Safari/537.36";  
  6. const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";  
  7. const string acceptLanguage = "zh-CN,zh;q=0.8";  
  8. const string acceptEncoding = "gzip,deflate,sdch";  
  9. var cookieContainer = new CookieContainer();  
  10. var cookie = new Cookie  
  11. {  
  12.     Name = "token".Trim(),  
  13.     Value = Token,  
  14.     Domain = ".wiz.cn".Trim() //设置cookie域  
  15. };  
  16. cookieContainer.Add(cookie);  
  17. string[] cookiesArr = txtCookie.Text.Split(‘;‘);  
  18. foreach (string s in cookiesArr)  
  19. {  
  20.     string[] keyValuePair = s.Split(‘=‘);  
  21.     if (keyValuePair.Length > 1)  
  22.     {  
  23.         cookie = new Cookie  
  24.                        {  
  25.                            Name = keyValuePair[0].Trim(),  
  26.                            Value = keyValuePair[1].Trim(),  
  27.                            Domain = "note.wiz.cn" //设置cookie域  
  28.                        };  
  29.         cookieContainer.Add(cookie);  
  30.     }  
  31. }  
  32.   
  33. var newUri = new Uri(path);  
  34. var webRequest = (HttpWebRequest)WebRequest.Create(newUri);  
  35. webRequest.Timeout = 20000;  
  36. //webRequest.CookieContainer = cookieContainer;  
  37. webRequest.UserAgent = userAgent;  
  38. webRequest.Accept = accept;  
  39. webRequest.Headers["Accept-Language"] = acceptLanguage;  
  40. webRequest.Headers["Accept-Charset"] = acceptEncoding;  
  41. webRequest.Headers["Accept-Encoding"] = acceptEncoding;  
  42. webRequest.KeepAlive = true;  
  43. webRequest.Headers["Cache-Control"] = "no-cache";  
  44. webRequest.Headers["Upgrade-Insecure-Requests"] = "1";  
  45. webRequest.Headers["Pragma"] = "no-cache";  
  46. webRequest.Headers["Cookie"] = "token=" + Token + ";" + txtCookie.Text.Trim();//todo: Cookie 要这样赋值,不能用CookieContainer??  
  47.   
  48. webRequest.Referer = newUri.AbsoluteUri;  
  49. HttpWebResponse rsp = (HttpWebResponse)webRequest.GetResponse();  
  50.   
  51. Stream stream = null;  
  52. stream = rsp.GetResponseStream();  
  53. Image.FromStream(stream).Save(filepath);  
  54.   
  55. // 释放资源  
  56. if (stream != null) stream.Close();  
  57. if (rsp != null) rsp.Close();  

奇怪的是:用 webRequest.CookieContainer = cookieContainer; 来跟cookie赋值,token参数总是赋不上,

后面改为:webRequest.Headers["Cookie"] = "token=" + Token + ";" + txtCookie.Text.Trim(); 就可以了,

CookieContainer 不是支持多个域的cookie吗,难到跨域Cookie只能webRequest.Headers["Cookie"]这样赋值吗? 没弄明白,有知道的童鞋不吝赐教。

以上是关于C# webrequest 抓取数据时,多个域Cookie的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 在 html 文档中抓取由 JavaScript 动态生成的数据

C# 抓取并导出网页里面所有超链接方法

C#使用(HttpWebRequest)WebRequest.Create()判断是不是连接服务器时,请求时间过久

c# WebRequest 使用 WebBrowser cookie

请求被中止:无法创建 SSL/TLS 安全通道 c# Webrequest

WebRequest C# 403 错误