cookie登陆,几种cookie来源的统一与转化

时间:2024-03-22 17:40:53

最近在做一个cookie池项目,遇到一个问题,webdriver、requests、requests.Session、scrapy、浏览器、抓包的cookie,这几种请求相应来源的cookie格式都不一样,需要统一成一种格式。

首先看这几种cookie的格式

从正常的chrome浏览器获取储存的cookie:

import browsercookie
browsercookie.chrome()
Out[8]: <CookieJar[Cookie(version=0, name='_hvn_login'value='0'
port=None, port_specified=False, domain='.alibaba.com'
domain_specified=True, domain_initial_dot=True, path='/',
 path_specified=True, secure=1, expires=0, discard=False, 
comment=None, comment_url=None, rest={}, rfc2109=False), 
Cookie(version=0, name='_tb_token_'value='73b06abb5e',
 port=None, port_specified=False, domain='.alibaba.com'
domain_specified=True, domain_initial_dot=True, path='/'
path_specified=True, secure=0, expires=0, discard=False, 
comment=None, comment_url=None, rest={}, rfc2109=False), 
Cookie(version=0, name='cookie2'

从正常浏览器获取cookie的好处是可以应对网站对Selenium的检测,通过登陆正常浏览器然后获取cookie,这种方式可以登录淘宝。

但是获取到的cookie是浏览器的所有记录,需要处理一下,并且cookie的字段信息很全。

一条cookie包含的字段有:name、path、value、port、domain、expires等,从正常浏览器获得的cookie可以直接使用在webdriver控制的页面,目前这种方式可以跳过淘宝登录页对Selenium的检测。

从webdriver获得的cookie:

cookie登陆,几种cookie来源的统一与转化

webdriver.get_cookies()
Out[19]: 
[{'domain''.baidu.com',
  'httpOnly'False,
  'name''H_PS_PSSID',
  'path''/',
  'secure'False,
  'value''26524_1461_21103_28140'},
 {'domain''www.baidu.com',
  'expiry'1547618916,
  'httpOnly'False,
  'name''BD_UPN',
  'path''/',
  'secure'False,
  'value''12314353'}]

可以看到是一个内嵌字段的列表,字典里面字段比直接从 正常浏览器获取的字段少一点。

从requests、requests.Session获取cookie

从requests、requests.Session获取的cookie格式是一致都是下面格式

<RequestsCookieJar[Cookie(version=0, name='BDORZ'value='27315',
 port=None, port_specified=False, domain='.baidu.com',
 domain_specified=True, domain_initial_dot=True, path='/'
path_specified=True, secure=False, expires=1546841552, 
discard=False, comment=None, comment_url=None, rest={}, 
rfc2109=False)]>

可以看见字段基本和webdriver获取的cookie字段相同,比从正常浏览器获取的cookie字段少

从scrapy获取cookie

cookie登陆,几种cookie来源的统一与转化

In [1]: response.headers.getlist('Set-Cookie')
Out[1]: [b'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/']

从scrapy获取cookie和前面几种不一样的是没有name、value字段并且格式是bytes,其他字段大同小异,但是以几次尝试结果来看第一个等号左边是name,右边是value

从抓包得到的cookie

cookie登陆,几种cookie来源的统一与转化

Cookie:BAIDUID=89C23F0D3D1DAD89BAD2E77470C010AE:FG=1; 
BIDUPSID=89C23F0D3D1DAD89BAD2E77470C010AE; PSTM=1546681778; 
H_PS_PSSID=1460_27209_21122_28205_28131_28267_28140; 
BD_UPN=1a314353; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; delPer=0; 
BD_CK_SAM=1; PSINO=1; BDRCVFR[EaNsStaiD7m]=mk3SLVN4HKm; locale=zh; 
BDRCVFR[S_ukKV6dOkf]=mk3SL

抓包得到的cookie就是一个name=value再用‘;’拼接而成的字符串,只有两个字段的信息,但是我们知道默认的path=‘\’

其中这几个字段是可以互相转化和使用的,但都必须含有这几个字段:name、domain、value、path,path是默认为‘\’、domain可以获得,这就是这几种cookie来源相互转化和统一的前提。

目前正在做的一个cookie池就是从这几种来源的cookie,统一成一种格式储存在redis数据库,然后使用requests和webdriver两种方式来检验cookie是否失效,通过tornado框架来做成可在线配置的微服务,具有基本雏形后再和大家分享。


ID:Python之战
|作|者|公(zhong)号:python之战
专注Python,专注于网络爬虫、RPA的学习-践行-总结
喜欢研究和分享技术瓶颈,欢迎关注
独学而无友,则孤陋而寡闻!