C# webrequest 抓取數據時,多個域Cookie的問題

最近研究了下如何抓取爲知筆記的內容,在抓取筆記裏的圖片內容時,總是提示403錯誤,用Chorme的開發者工具看了下:html

這裏的Cookie來自兩個域,估計爲知那邊是驗證了token(登陸後才能獲取到token)web

下載圖片的代碼:跨域

 

[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參數老是賦不上,cookie

後面改成:webRequest.Headers["Cookie"] = "token=" + Token + ";" + txtCookie.Text.Trim(); 就能夠了,app

CookieContainer 不是支持多個域的cookie嗎,難到跨域Cookie只能webRequest.Headers["Cookie"]這樣賦值嗎? 沒弄明白,有知道的童鞋不吝賜教。工具

相關文章
相關標籤/搜索