1. 程式人生 > >cookie登陸,幾種cookie來源的統一與轉化

cookie登陸,幾種cookie來源的統一與轉化

最近在做一個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:

在這裡插入圖片描述

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

在這裡插入圖片描述

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: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的學習-踐行-總結
喜歡研究和分享技術瓶頸,歡迎關注
獨學而無友,則孤陋而寡聞!