
Мне как то пару месяцев назад пришлось парсить данные из личного кабинета клиента. Каждый запуск скрипта требовал вручную заходить, вводить логин/пароль и т.д. Это было неудобно и невыносимо.
И я подумал, зачем вручную все делать, если есть Playwright который умеет все это делать да и еще сохранять сессию через cookies — и после первого входа можно автоматически заходить снова и снова, минуя форму авторизации.
В этой статье я покажу пошагово, как:
- Войти на сайт через форму
- Сохранить cookies в файл
- Восстановить сессию при следующем запуске
- Проверить, что вход успешен
Всё — на реальном демо-сайте, с полным кодом и пояснениями.
Оглавление
Выбор демо-сайта для практики
Идеальный кандидат — https://demoqa.com/login. Это официальный тестовый сайт, где:
- Есть форма входа
- Логин:
admin - Пароль:
123456 - После входа появляется надпись «Logged in as admin»
🌐 Сайт не требует email-подтверждения и работает мгновенно — идеально для обучения.
Шаг 1. Первый вход: заполняем форму и нажимаем «Login»
Если вы первый раз используете Playwright для автоматизации, я в отдельной своей статье рассказывал как заполнять формы и искать селекторы, можете ознакомиться:
👉 Как автоматически заполнять формы и нажимать кнопки в Playwright
Базовый скрипт с авторизацией
from playwright.sync_api import sync_playwright
def login_and_save_cookies():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=200)
context = browser.new_context()
page = context.new_page()
# Переходим на страницу логина
page.goto("https://demoqa.com/login")
# Вводим логин и пароль
page.fill("#userName", "admin")
page.fill("#password", "123456")
# Нажимаем кнопку
page.click("#login")
# Ждём появления элемента после входа
page.wait_for_selector("#userName-value", timeout=10000)
print("✅ Успешный вход!")
# Сохраняем cookies
cookies = context.cookies()
import json
with open("cookies.json", "w") as f:
json.dump(cookies, f)
print("💾 Cookies сохранены в cookies.json")
browser.close()
if __name__ == "__main__":
login_and_save_cookies()
💡
slow_mo=200добавляет паузу между действиями — удобно при отладке.
Шаг 2. Вход по cookies — без ввода логина и пароля
Скрипт с восстановлением сессии
from playwright.sync_api import sync_playwright
import json
import os
def login_with_cookies():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
# Загружаем cookies, если файл существует
if os.path.exists("cookies.json"):
with open("cookies.json", "r") as f:
cookies = json.load(f)
context.add_cookies(cookies)
print("🍪 Cookies загружены")
# Переходим в личный кабинет
page.goto("https://demoqa.com/profile")
# Проверяем, авторизованы ли мы
if page.is_visible("#userName-value"):
user = page.text_content("#userName-value")
print(f"✅ Привет, {user}! Вход по cookies.")
else:
print("❌ Сессия устарела. Требуется повторный логин.")
# Здесь можно вызвать login_and_save_cookies()
browser.close()
if __name__ == "__main__":
login_with_cookies()
Шаг 3. Умный скрипт: пробует cookies, иначе — форма
Объединим оба подхода в один надёжный скрипт:
def smart_login():
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
# Сначала пробуем зайти с cookies
if os.path.exists("cookies.json"):
with open("cookies.json") as f:
context.add_cookies(json.load(f))
page.goto("https://demoqa.com/profile")
if page.is_visible("#userName-value"):
print("✅ Вход по cookies")
browser.close()
return
# Если не получилось — логинимся вручную
print("🔁 Требуется повторный вход")
page.goto("https://demoqa.com/login")
page.fill("#userName", "admin")
page.fill("#password", "123456")
page.click("#login")
page.wait_for_selector("#userName-value")
# Сохраняем новые cookies
with open("cookies.json", "w") as f:
json.dump(context.cookies(), f)
print("✅ Новые cookies сохранены")
browser.close()
Важные нюансы и советы
Cookies живут недолго
Многие сайты устанавливают короткий срок жизни cookies (30 минут – 24 часа). Если скрипт не работает — удалите cookies.json и залогиньтесь заново.
Используйте один context на всё приложение
Все действия (логин, переходы, парсинг) должны происходить в одном контексте, иначе cookies не поделятся.
Для продакшена — шифруйте файл cookies
Файл cookies.json — это ключ от вашего аккаунта. Любой, кто получит его, сможет:
- Войти в личный кабинет от вашего имени
- Делать покупки, менять настройки, удалять данные
- Использовать сессию, пока она не протухнет
Поэтому никогда не коммитьте cookies.json в Git и не храните его в открытом виде на сервере.
Лучшая практика — шифровать файл при сохранении и расшифровывать при загрузке с помощью cryptography.
📚 Документация Playwright: Authentication
Установка библиотеки
pip install cryptography
Генерация ключа шифрования (делается один раз)
from cryptography.fernet import Fernet
# Создаём ключ и сохраняем в файл (храните его в секрете!)
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
key_file.write(key)
⚠️ Файл
secret.key— это ваш «пароль» к зашифрованным cookies.
Никогда не публикуйте его в GitHub! Добавьте в.gitignore.
Сохранение cookies в зашифрованном виде
from cryptography.fernet import Fernet
import json
def save_encrypted_cookies(cookies, key_path="secret.key"):
with open(key_path, "rb") as key_file:
key = key_file.read()
f = Fernet(key)
# Конвертируем cookies в JSON и шифруем
cookies_json = json.dumps(cookies).encode("utf-8")
encrypted_data = f.encrypt(cookies_json)
with open("cookies.encrypted", "wb") as f_out:
f_out.write(encrypted_data)
print("✅ Cookies сохранены в зашифрованном виде")
Используйте вместо простого json.dump():
# В конце успешного логина:
save_encrypted_cookies(context.cookies())
Загрузка и расшифровка cookies
def load_encrypted_cookies(key_path="secret.key"):
try:
with open(key_path, "rb") as key_file:
key = key_file.read()
f = Fernet(key)
with open("cookies.encrypted", "rb") as f_in:
encrypted_data = f_in.read()
decrypted_data = f.decrypt(encrypted_data)
cookies = json.loads(decrypted_data.decode("utf-8"))
print("🍪 Cookies успешно расшифрованы")
return cookies
except FileNotFoundError:
print("🔐 Файл cookies не найден — требуется вход")
return None
except Exception as e:
print(f"❌ Ошибка расшифровки: {e}")
return None
Используйте при запуске:
cookies = load_encrypted_cookies()
if cookies:
context.add_cookies(cookies)
Безопасное хранение ключа в продакшене
На сервере лучше хранить ключ в переменной окружения, а не в файле:
import os
from cryptography.fernet import Fernet
def get_key():
key = os.getenv("COOKIE_ENCRYPTION_KEY")
if not key:
raise ValueError("Переменная COOKIE_ENCRYPTION_KEY не задана!")
return key.encode()
# При сохранении:
f = Fernet(get_key())
encrypted = f.encrypt(json.dumps(cookies).encode())
А в системе (например, в .env или через export):
export COOKIE_ENCRYPTION_KEY="ваш_ключ_из_Fernet.generate_key()"
Теперь даже если злоумышленник получит файл cookies.encrypted, он не сможет его использовать без ключа.
А сам ключ вы храните отдельно — в защищённой переменной или секретном менеджере (HashiCorp Vault, AWS Secrets и т.д.).
Это — минимальный уровень безопасности для любого скрипта, работающего с авторизацией.
Заключение
Теперь вы умеете:
✅ Автоматически входить на сайт через форму
✅ Сохранять и восстанавливать сессию через cookies
✅ Создавать «умный» скрипт, который сам решает, нужен ли повторный логин
Этот подход работает не только с демо-сайтами, но и с реальными личными кабинетами (если нет двухфакторной аутентификации или сложных капч).
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и Python.
👉 Ваш интерес — лучшая мотивация для новых статей!