/// <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. for循环:用turtle画一颗五角星

    import turtle # 设置初始位置 turtle.penup() turtle.left(90) turtle.fd(200) turtle.pendown() turtle.right(9 ...

  2. Android APT

    APT APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理. Annota ...

  3. Katalon Studio之swagger中的API导入

    约束条件: swagger中一定要在注解@ApiOperation中设置nickname的唯一值,例如: @ApiOperation(value="新增用户",notes=&quo ...

  4. git常用方法整理

    Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! 初始化本地仓库 mkdir xxx cd xxx git init 创建本 ...

  5. laravel 邮件配置

    .env的配置 MAIL_DRIVER=smtpMAIL_HOST=smtp.163.comMAIL_PORT=465MAIL_USERNAME=你的163邮箱地址MAIL_PASSWORD=你的16 ...

  6. Python课程学习总结

    Python的介绍 Python是一种高级动态.完全面向对象的语言,函数.模块.数字.字符串都是对象,并且完全支持继承.重载.派生.多继承,有益于增强源代码的复用性. Python是一种计算机程序设计 ...

  7. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  8. 推荐几个牛逼的 IDEA 插件,还带动图!

    阅读本文大概需要 2.3 分钟. 作者:纪莫, cnblogs.com/jimoer 这里只是推荐一下好用的插件,具体的使用方法不一一详细介绍. JRebel for IntelliJ 一款热部署插件 ...

  9. 写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)

    注:个人对偏向于底层基本上拿来就用的应用,倾向于使用安装包,直接yum或者rpm安装:而对于应用层面控制较多或者需要大范围维护的,倾向于直接使用tar.gz版本. 对于linux下的ftp服务器,实际 ...

  10. [Swift]LeetCode74. 搜索二维矩阵 | Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...