Cookies в Selenium



Назначение

Куки (cookie, буквально — «печенье») — это небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Когда вы открываете сайт, сервер отправляет вашему браузеру данные, которые хранятся в его памяти.

Куки чаще всего используются для:

Аутентификации пользователя;
Хранения личных настроек на сайте, например, темной темы или сохранения товаров в корзине, если вы не залогинились на сайте;
Отслеживания состояния сеанса доступа пользователя;
Сбора статистики о пользователях;
Хранения информации о местоположении пользователя и IP-адресе;
Кликов и переходов;
Сбора информации об операционной системе и браузере;
И многого другого.

Cookies не являются персональными данными, так как в законе сказано, что персональные данные — это информация, позволяющая идентифицировать человека. Даже фамилия, имя и отчество могут не являться персональными данными, если требуются дополнительные сведения для определения личности человека. Не говоря уже о cookies.

Существует два вида cookie:

Сессионные (временные) — хранят в себе информацию, которая актуальна на ближайшее время. К таким данным можно отнести записи форм, полей, время пребывания на сайте. Чаще всего они существуют, пока вы находитесь на сайте, и удаляются, как только вы его покидаете.

Постоянные — это куки, которые могут храниться в вашем браузере очень долго. Например, логин от вашей учетной записи на сайте или другие данные, связанные с вашей учетной записью, такие как данные о вашем местоположении в учетной записи Google.

Чтобы увидеть, какие cookie сохраняет сайт в вашем браузере, вам нужно открыть инструмент разработчика клавишей F12.

В Selenium мы можем получить доступ ко всем cookies сразу в виде словаря, либо к конкретному полю.

Основные методы

.get_cookies()

В коде ниже использован метод .get_cookies(), который получает список всех cookie на странице. Выполните код ниже у себя в терминале.

from pprint import pprint
from selenium import webdriver

with webdriver.Chrome() as webdriver:
    webdriver.get('https://ya.ru/')
    cookies = webdriver.get_cookies()
    pprint(cookies)

Вывод:

>>> 
[{'domain': '.ya.ru',
  'expiry': 1685518907,
  'httpOnly': False,
  'name': '_ym_d',
  'path': '/',
  'sameSite': 'None',
  'secure': True,
  'value': '1653982908'},
  ...
   {'domain': '.ya.ru',
  'expiry': 1656574906,
  'httpOnly': False,
  'name': 'yandex_gid',
  'path': '/',
  'sameSite': 'None',
  'secure': True,
  'value': '239'}]

Обратите внимание на то, что список cookies — это список словарей, т.е. каждая cookie представляет собой словарь.

.get_cookie(name_cookie)

В отличие от первого метода, этот метод находит и возвращает cookie по его имени. Есть два способа определить имя.

Способ №1 — этот способ не очень надежен, т.к. с «живого» браузера данные в cookies могут отличаться в зависимости от открытой сессии. Но если ваш код не зависит от параметров сессии, то можно получить имена cookie именно в браузере;

Способ №2 — мы можем в цикле for/in итерироваться по списку cookie, который мы получили с помощью метода .get_cookies() . Этим способом мы можем получить не только имя cookie, но и его значение.

from selenium import webdriver

with webdriver.Chrome() as webdriver:
    webdriver.get('https://ya.ru/')
    cookies = webdriver.get_cookies()
    for cookie in cookies:
        print(cookie['name']) # или cookie['value'] чтобы получить их значение
>>> 
_ym_d, _ym_isad, _ym_uid, my, gdpr, _yasc, i, is_gdpr, yuidss
yabs-frequency, is_gdpr_b, yandexuid, yp, mda, ymex, yandex_gid

Когда мы знаем имена всех cookie на странице, мы можем получить нужные нам данные по ключу. Мы помним, что .get_cookies() возвращает список словарей.  Если вы посмотрите на первый пример с кодом, вы увидите, что в cookie хранится время экспирации ‘expiry’: 1685518907 т.е., время истечения срока жизни cookie. Пример кода ниже поможет нам извлечь конкретное значение из cookie.

from selenium import webdriver
with webdriver.Chrome() as webdriver:
    webdriver.get('https://ya.ru/')
    print(webdriver.get_cookie('_ym_uid')['expiry'])
>>>1685520499

Добавление cookie

webdriver.add_cookie(cookie_dict)

Все мы когда-то чистили браузер от печенек (cookies). Наверное, каждый начинающий программист знает, что если очистить cookies, то настройки сайта слетят: слетит учётная запись, тёмная тема перестанет загружаться по умолчанию, и сайт вдруг перестанет приветствовать вас по имени. Всем понятно, зачем чистить куки, но зачем их добавлять в браузер? Добавляем мы их по обратной причине. Когда работаем с Selenium, мы не всегда можем использовать один профиль браузера в нескольких скриптах. В таких случаях мы можем либо создать ещё несколько профилей, либо использовать одни cookies для всех скриптов.

.add_cookie(cookie_dict) — это метод, который добавляет cookie в ваш браузер. Он принимает словарь, но с определёнными ограничениями: мы не можем передать в cookie что угодно. В браузере есть заранее подготовленные поля, в которые мы можем передавать данные.

# Добавляет файл cookie в текущий контекст браузера.
driver.add_cookie({"name": "key", "value": "value"})

Доступные поля для cookie можно посмотреть в любом браузере. Эти поля доступны для передачи их в словаре. О том, как формировать словарь, мы поговорим ниже.»

«name» — устанавливает имя cookie-файла;

«value» — устанавливает значение cookie; это значение может либо идентифицировать пользователя, либо содержать любую другую служебную информацию;

«expires» и «max-age» — определяют срок жизни cookie; после истечения этого срока, cookie будет удалён из памяти браузера. Если не указывать эти значения, содержимое cookie будет удалено после закрытия браузера;

«path» — указывает путь к директории на сервере, для которой будут доступны cookie. Чтобы cookie были доступны по всему домену, необходимо указать «/»;

«domain» — хранит в себе информацию о домене или поддомене, которые имеют доступ к этой cookie. Если необходимо, чтобы cookie были доступны по всему домену и всем поддоменам, указывается базовый домен, например, www.example.ru;

«secure» — указывает серверу, что cookie должны передаваться только по защищённому HTTPS-соединению;

«httponly»— этот параметр запрещает доступ к cookie посредством API браузера document.cookie. Предотвращает кражу cookie посредством XSS-атак. Если флаг установлен в True, вы сможете получить доступ к этой cookie только через браузер, в том числе и через Selenium;

«samesite»— ограничивает передачу cookie между сайтами и предотвращает кражу cookie посредством XSS-атак. Имеет три состояния.

SameSite=None — на передачу cookie нет никаких ограничений;

SameSite=Lax — разрешает передачу только безопасным HTTP-методам;

SameSite=Strict или SameSite — самое строгое состояние, которое запрещает отправку cookie на другие сайты.

Запустите код ниже у себя в терминале, поиграйтесь с параметрами,  посмотрите на результат, найдите изменения в браузере.

import time
from pprint import pprint
from selenium import webdriver

cookie_dict = {
    'name': 'any_name_cookie',    # Любое имя для cookie
    'value': 'any_value_cookie',  # Любое значение для cookie
    'expiry': 2_000_000_000,      # Время жизни cookie в секундах
    'path': '/',                  # Директория на сервере для которой будут доступны cookie
    'domain': 'mob25.com',     # Информация о домене и поддомене для которых доступны cookie
    'secure': True,  # or False   # Сигнал браузера о том чтобы передавать cookie только по защищённому HTTPS
    'httpOnly': True,  # or False # Ограничивает доступ к cookie по средствам API
    'sameSite': 'Strict',  # or lax or none # Ограничение на передачу cookie между сайтами

}

with webdriver.Chrome() as webdriver:
    webdriver.get('https://mob25.com/')
    webdriver.add_cookie(cookie_dict)
    pprint(webdriver.get_cookies())
    time.sleep(100)

Все ключи словаря cookie_dict={} соответствуют полям cookie в браузере. Поэтому изменять ключи в этом словаре не рекомендуется: если вы это сделаете, ничего не произойдёт. Словарь просто не запишется в cookie браузера. Изменять можно только значения этого словаря, и то, следуя определённым правилам. Вы имеете полную свободу изменения только для значений ключей «name» и «value»; остальные значения в ключах подчиняются строгим правилам.

Это могут быть правила касающиеся времени жизни cookie (Expires, Max-Age), домена (Domain), пути (Path), флагов безопасности (Secure, HttpOnly) и так далее.



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: