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

  • 相关阅读:
    JAVA数组复制和扩容
    Nginx-fastdfs安装与配置
    ssh安全免密登录
    修改Linux默认源
    Linux查看IP
    整合ssm框架
    Java-maven-shangcheng-parent-web-配置
    Java-maven-shangcheng-manager-service-配置
    Java-maven-shangcheng-manager-配置
    jquery美化select,自定义下拉框样式
  • 原文地址:https://www.cnblogs.com/soundcode/p/9031981.html
Copyright © 2011-2022 走看看