C# 爬虫----Cookies处理(Set-Cookie)
/// <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)的更多相关文章
- python爬虫 - Urllib库及cookie的使用
http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...
- Python爬虫入门六之Cookie的使用
大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...
- Python爬虫教程-15-读取cookie(人人网)和SSL(12306官网)
Python爬虫教程-15-爬虫读取cookie(人人网)和SSL(12306官网) 上一篇写道关于存储cookie文件,本篇介绍怎样读取cookie文件 cookie的读取 案例v16ssl文件:h ...
- 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率
爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...
- 6.Python爬虫入门六之Cookie的使用
大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...
- 爬虫cookies详解
cookies简介 cookie是什么? Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 ...
- 爬虫程序获取登录Cookie信息时遇到302,怎么处理
最近要做个爬虫程序爬爬东西,先搞定登录授权这块,没得源代码,所以只能自行搞定了,按平时的直接发起HttpWebRequest(req)请求,带上用户名密码,好了,然后 HttpWebResponse ...
- Python 爬虫(二十五) Cookie的处理--cookielib库的使用
Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...
- ASP.NET Request.Cookies获取某个Cookie的奇怪问题
公司的某个产品依赖一个Cookie的值,发现在某些情况下即使Request附带了该Cookie(通过Fiddler2监控),服务器端通过HttpContext的Request.Cookies访问该Co ...
随机推荐
- python获取多线程的返回值
import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super(MyThread,s ...
- vue 登录跳转
前几次做登录处理,都是写一个公用方法,然后在对应的路由页面调用,即判断是不是处于登录状态,如果不是,就返回登录页面. let exit = (vm)=>{ let login = session ...
- python Ajax
Ajax一.准备知识JSON1.什么是json JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSO ...
- 【前端性能】Web 动画帧率(FPS)计算
我们知道,动画其实是由一帧一帧的图像构成的.有 Web 动画那么就会存在该动画在播放运行时的帧率.而帧率在不同设备不同情况下又是不一样的. 有的时候,一些复杂或者重要动画,我们需要实时监控它们的帧率, ...
- 【RL-TCPnet网络教程】第29章 NTP网络时间协议基础知识
第29章 NTP网络时间协议基础知识 本章节为大家讲解NTP (Network Time Protocol,网络时间协议)和SNTP(简单网络时间协议,Simple Network Time ...
- [Swift]LeetCode318. 最大单词长度乘积 | Maximum Product of Word Lengths
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- [Swift]LeetCode598. 范围求和 II | Range Addition II
Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...
- [Swift]LeetCode942. 增减字符串匹配 | DI String Match
Given a string S that only contains "I" (increase) or "D" (decrease), let N = S. ...
- [Swift]LeetCode943. 最短超级串 | Find the Shortest Superstring
Given an array A of strings, find any smallest string that contains each string in A as a substring. ...
- AES,DES加密JS源文件及其使用方法
源文件地址:https://github.com/dididi1234/crypto 进入之后直接下载CryptoJS.js,js中直接引用,小程序也一样可以使用 具体使用方法和vue中的Crypto ...