/// <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. 201771010118 马昕璐《面向对象程序设计java》第十二周学习总结

    第一部分:理论知识学习部分 用户界面:用户与计算机系统(各种程序)交互的接口 图形用户界面:以图形方式呈现的用户界面 AET:Java 的抽象窗口工具箱包含在java.awt包中,它提供了许多用来设计 ...

  2. [LeetCode] Mirror Reflection 镜面反射

    There is a special square room with mirrors on each of the four walls.  Except for the southwest cor ...

  3. jQuery倒计时组件(jquery.downCount.js)

    //html <span class="days">00</span> <span class="hours">00< ...

  4. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  5. C# INI文件读写类

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

  6. dijkstra算法解决单源最短路问题

    简介 最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程. 前言 呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易 ...

  7. SSIS - 8.FTP 任务

    FTP全称为 File Transfer Protocol(文件传输协议),是通过TCP网络将文件从一个服务器传输到另一个服务器.在SSIS包中,FTP任务是用来实现FTP功能的. 一.创建FTP连接 ...

  8. ubuntu Nvidia driver install

    在图形界面中,有软件和更新,可以使用附加驱动来更新 最上面的驱动是最新版本,英伟达目前Linux最新的版本是375.39 后面的括号,专有意思是代表英伟达自家的驱动,不开源 选择好之后点击应用更改 关 ...

  9. 老司机带路:《axios从入门到开车 嘀嘀~~》

    前言:axios vue.axios 跨域.axios.js.axios get.axios post.axios中文文档 之前当vue更新到2.0之后,作者就宣告不再对vue-resource更新, ...

  10. java中的堆,栈和方法区(转)

    来源:https://www.cnblogs.com/iliuyuet/p/5603618.html https://blog.csdn.net/lin542405822/article/detail ...