/// <summary>
/// Cookie 助手
/// </summary>
public class CookieHelper
{
/// <summary>
/// 解析Cookie
/// </summary>
private static readonly Regex RegexSplitCookie2 = new Regex(@"[^,][\S\s]+?;+[\S\s]+?(?=,\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 的方法

C# 爬虫----Cookies处理(Set-Cookie)的更多相关文章

  1. python爬虫 - Urllib库及cookie的使用

    http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...

  2. Python爬虫入门六之Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  3. Python爬虫教程-15-读取cookie(人人网)和SSL(12306官网)

    Python爬虫教程-15-爬虫读取cookie(人人网)和SSL(12306官网) 上一篇写道关于存储cookie文件,本篇介绍怎样读取cookie文件 cookie的读取 案例v16ssl文件:h ...

  4. 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率

    爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...

  5. 6.Python爬虫入门六之Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  6. 爬虫cookies详解

    cookies简介 cookie是什么? Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 ...

  7. 爬虫程序获取登录Cookie信息时遇到302,怎么处理

    最近要做个爬虫程序爬爬东西,先搞定登录授权这块,没得源代码,所以只能自行搞定了,按平时的直接发起HttpWebRequest(req)请求,带上用户名密码,好了,然后 HttpWebResponse ...

  8. Python 爬虫(二十五) Cookie的处理--cookielib库的使用

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...

  9. ASP.NET Request.Cookies获取某个Cookie的奇怪问题

    公司的某个产品依赖一个Cookie的值,发现在某些情况下即使Request附带了该Cookie(通过Fiddler2监控),服务器端通过HttpContext的Request.Cookies访问该Co ...

随机推荐

  1. 【高并发架构】Redis缓存高并发之-主从架构

    Redis主从架构 到目前为止,Redis Cluster 能实现很好的性能,但如果只是缓存几个G的数据,那么单机Redis就足够了,但缓存主要用来读的,单机的QPS有一定的极限,一两万QPS一台应该 ...

  2. 从url中获得域名

    import java.net.MalformedURLException; import java.net.URL; /** * * @author csh * */ public class AA ...

  3. vue变异方法

    push()  往数组最后面添加一个元素,成功返回当前数组的长度    pop()  删除数组的最后一个元素,成功返回删除元素的值    shift()  删除数组的第一个元素,成功返回删除元素的值u ...

  4. C# INI文件读写类

    public class Ini { // 声明INI文件的写操作函数 WritePrivateProfileString() [System.Runtime.InteropServices.DllI ...

  5. grunt 插件

    一个简单的 grunt 插件, 作用是 把 css 文件中的  /images/  替换成指定的  url path, 以实现 图片 cdn 路劲改造 插件项目文件结构 grunt-contrib-s ...

  6. High Availability手册(1): 环境

    三台KVM虚拟机 首先我们得有一个pacemaker的环境,需要三台机器,如果没有那么多物理机器,可以用kvm虚拟机 创建一个bridge ovs-vsctl add-br ubuntu_br ifc ...

  7. 算法与数据结构(七) AOV网的拓扑排序(Swift版)

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  8. [Swift]LeetCode256.粉刷房子 $ Paint House

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...

  9. [Swift]LeetCode771. 宝石与石头 | Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S representing the ston ...

  10. [Swift]LeetCode954. 二倍数对数组 | Array of Doubled Pairs

    Given an array of integers A with even length, return true if and only if it is possible to reorder ...