• 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"]这样赋值吗? 没弄明白,有知道的童鞋不吝赐教。

  • 相关阅读:
    LR 场景设置
    win7 快捷键
    P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)
    A
    P1494 [国家集训队]小Z的袜子(莫队)
    P2709 小B的询问(莫队入门)
    G
    #6285. 数列分块入门 9(区间的最小众数 离散化+数列分块)
    #6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)
    #6283. 数列分块入门 7(区间乘法,区间加法,单点询问)
  • 原文地址:https://www.cnblogs.com/soundcode/p/9031981.html
Copyright © 2020-2023  润新知