Держи выжимку. Это железобетонный алгоритм, по которому мы с тобой только что разнесли защиту Одноклассников. Сохрани себе в заметки.
Шпаргалка архитектора: Взлом тяжелых React-сайтов на Playwright (Headless)
1. Никакой слепой угадайки (Дамп реальности)Если локатор падает по таймауту, не пытайся перебирать классы из обычного браузера. Headless-сервер часто получает урезанную или измененную вёрстку. Делай полный слепок прямо перед падением:
- Скриншот: await page.screenshot(path="debug.png", full_page=True)
- Сырой DOM: with open("dom.txt", "w") as f: f.write(await page.content())
- Изучай dom.txt — бей по тем классам, которые сервер реально отдал боту.
2. Обход React-перекрытий (JS-инъекция)Если элемент виден, но locator.click(force=True) не срабатывает (перекрыт невидимым div), пробивай клик изнутри браузера через чистый JavaScript:
- await page.evaluate("document.querySelector('.my-class').click()")
3. Режим Бога: Playwright CodegenНе можешь зацепиться за элемент? Запускай кодогенератор на локальном ПК, подгрузив куки боевого бота. Playwright сам найдет семантику (Accessibility Tree):
- python -m playwright codegen --load-storage state.json https://твой-сайт.ru
- Кликай руками и копируй сгенерированные локаторы.
Команада Ok:
python -m playwright codegen --load-storage ok_state.json https://ok.ru/group/70000050926852
Команада ЖЖ:
python -m playwright codegen --load-storage lj_state.json https://www.livejournal.com/post
Команада Дзен:
python -m playwright codegen --load-storage dzen_state.json https://dzen.ru/suite/studio/editor
Пинтерест: Pinterest:
python -m playwright codegen --load-storage pinterest_state.json https://www.pinterest.com/pin-creation-tool/
Twitter:
python -m playwright codegen --save-storage twitter_state.json https://x.com/i/flow/login
VC:
python -m playwright codegen --device="Desktop Chrome" --save-storage vc_state.json https://vc.ru
********
Ты хочешь запустить
генератор кода Playwright с записью действий прямо поверх твоей готовой сессии vc_state.json! То есть, чтобы открылось окно, где ты уже залогинен, ты руками нажал «Создать запись», вбил тестовый заголовок, прикрепил картинку, а Playwright Inspector в реальном времени записал все точные клики, селекторы и кнопки новой верстки VC.ru.
python -m playwright codegen --load-storage vc_state.json --device="Desktop Chrome" https://vc.ru
********
Medium:
C:\python\venv\Scripts\python.exe -m playwright codegen --ignore-https-errors --device="Desktop Chrome" --save-storage medium_state.json https://medium.com
Это если нужен ВПН, заходим через сервер где он есть и вбиваем команду выше!
Чтобы забрать Cookies из обычного браузера:
расширение для Chrome:
EditThisCookie или
Get cookies.txt LOCALLYКак мы уже знаем по опыту с Одноклассниками, тяжелый метод get_by_role в связке с Draft.js на сервере без монитора (headless=True) гарантированно сожрёт память и уронит Chromium. Поэтому мы сразу переводим селекторы на
лёгкий, скоростной CSS, убираем весь мусор с двойными кликами и переводим код на асинхронные рельсы под наш пайплайн.
Режим Бога для Тильды:
python -m playwright codegen --load-storage tilda_state.json https://feeds.tilda.ru/posts/?feeduid=103792748761
4. Защита сервера от краша (OOM Killer)Генератор выдаст тяжелые локаторы вроде get_by_role("link", name="..."). На слабом Linux-сервере в headless-режиме они вызовут скачок памяти, и браузер схлопнется с ошибкой Target page, context or browser has been closed.
- Решение: Берем логику из codegen (например, имя из aria-label) или из дампа dom.txt и переводим в молниеносный CSS.
- Было (тяжело): page.get_by_role("textbox", name="Ввод")
- Стало (легко): page.locator('.posting_itx').first
5. Пробуждение ленивых скриптов (Эмуляция жизни)Современные сайты (соцсети, парсеры ссылок) не реагируют на программную вставку текста через fill(). Им нужны аппаратные прерывания.
- Вставил ссылку? Эмулируй физический удар по клавише, чтобы запустить React-хуки:
- await page.keyboard.press("End")
- await page.keyboard.type(" ", delay=150)