zoukankan      html  css  js  c++  java
  • C# 爬虫----Cookies处理(Set-Cookie)

    /// <summary>
        /// Cookie 助手
        /// </summary>
        public class CookieHelper
        {
            /// <summary>
            /// 解析Cookie
            /// </summary>
            private static readonly Regex RegexSplitCookie2 = new Regex(@"[^,][Ss]+?;+[Ss]+?(?=,S)");
    
            /// <summary>
            /// 获取所有Cookie 通过Set-Cookie
            /// </summary>
            /// <param name="setCookie"></param>
            /// <returns></returns>
            public static CookieCollection GetCookiesByHeader(string setCookie)
            {
                var cookieCollection = new CookieCollection();
                //拆分Cookie
                //var listStr = RegexSplitCookie.Split(setCookie);
                setCookie += ",T";//配合RegexSplitCookie2 加入后缀
                var listStr = RegexSplitCookie2.Matches(setCookie);
                //循环遍历
                foreach (Match item in listStr)
                {
                    //根据; 拆分Cookie 内容
                    var cookieItem = item.Value.Split(';');
                    var cookie = new Cookie();
                    for (var index = 0; index < cookieItem.Length; index++)
                    {
                        var info = cookieItem[index];
                        //第一个 默认 Cookie Name
                        //判断键值对
                        if (info.Contains("="))
                        {
                            var indexK = info.IndexOf('=');
                            var name = info.Substring(0, indexK).Trim();
                            var val = info.Substring(indexK + 1);
                            if (index == 0)
                            {
                                cookie.Name = name;
                                cookie.Value = val;
                                continue;
                            }
                            if (name.Equals("Domain", StringComparison.OrdinalIgnoreCase))
                            {
                                cookie.Domain = val;
                            }
                            else if (name.Equals("Expires", StringComparison.OrdinalIgnoreCase))
                            {
                                DateTime.TryParse(val, out var expires);
                                cookie.Expires = expires;
                            }
                            else if (name.Equals("Path", StringComparison.OrdinalIgnoreCase))
                            {
                                cookie.Path = val;
                            }
                            else if (name.Equals("Version", StringComparison.OrdinalIgnoreCase))
                            {
                                cookie.Version = Convert.ToInt32(val);
                            }
                        }
                        else
                        {
                            if (info.Trim().Equals("HttpOnly", StringComparison.OrdinalIgnoreCase))
                            {
                                cookie.HttpOnly = true;
                            }
                        }
                    }
                    cookieCollection.Add(cookie);
                }
                return cookieCollection;
            }
    
            /// <summary>
            /// 获取 Cookies
            /// </summary>
            /// <param name="setCookie"></param>
            /// <param name="uri"></param>
            /// <returns></returns>
            public static string GetCookies(string setCookie, Uri uri)
            {
                //获取所有Cookie
                var strCookies = string.Empty;
                var cookies = GetCookiesByHeader(setCookie);
                foreach (Cookie cookie in cookies)
                {
                    //忽略过期Cookie
                    if (cookie.Expires < DateTime.Now && cookie.Expires != DateTime.MinValue)
                    {
                        continue;
                    }
                    if (uri.Host.Contains(cookie.Domain))
                    {
                        strCookies += $"{cookie.Name}={cookie.Value}; ";
                    }
                }
                return strCookies;
            }
    
            /// <summary>
            /// 通过Name 获取 Cookie Value
            /// </summary>
            /// <param name="setCookie">Cookies</param>
            /// <param name="name">Name</param>
            /// <returns></returns>
            public static string GetCookieValueByName(string setCookie, string name)
            {
                var regex = new Regex($"(?<={name}=).*?(?=; )");
                return regex.IsMatch(setCookie) ? regex.Match(setCookie).Value : string.Empty;
            }
    
            /// <summary>
            /// 通过Name 设置 Cookie Value
            /// </summary>
            /// <param name="setCookie">Cookies</param>
            /// <param name="name">Name</param>
            /// <param name="value">Value</param>
            /// <returns></returns>
            public static string SetCookieValueByName(string setCookie, string name, string value)
            {
                var regex = new Regex($"(?<={name}=).*?(?=; )");
                if (regex.IsMatch(setCookie))
                {
                    setCookie = regex.Replace(setCookie, value);
                }
                return setCookie;
            }
    
            /// <summary>
            /// 通过Name 更新Cookie
            /// </summary>
            /// <param name="oldCookie">原Cookie</param>
            /// <param name="newCookie">更新内容</param>
            /// <param name="name">名字</param>
            /// <returns></returns>
            public static string UpdateCookieValueByName(string oldCookie, string newCookie, string name)
            {
                var regex = new Regex($"(?<={name}=).*?[(?=; )|$]");
                if (regex.IsMatch(oldCookie) && regex.IsMatch(newCookie))
                {
                    oldCookie = regex.Replace(oldCookie, regex.Match(newCookie).Value);
                }
                return oldCookie;
            }
    
            /// <summary>
            /// 根据新Cookie 更新旧的
            /// </summary>
            /// <param name="oldCookie"></param>
            /// <param name="newCookie"></param>
            /// <returns></returns>
            public static string UpdateCookieValue(string oldCookie, string newCookie)
            {
                var list = GetCookiesByHeader(newCookie);
                foreach (Cookie cookie in list)
                {
                    var regex = new Regex($"(?<={cookie.Name}=).*?[(?=; )|$]");
                    oldCookie = regex.IsMatch(oldCookie) ? regex.Replace(oldCookie, cookie.Value) : $"{cookie.Name}={cookie.Value}; {oldCookie}";
                }
                return oldCookie;
            }
    
    
    
        }
    

      更新:加入自动更新Cookie 的方法

  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/trevan/p/9487223.html
Copyright © 2011-2022 走看看