Назначение
Куки (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) и так далее.