3.9 KiB
3.9 KiB
Local Cian backfill scrapers (Playwright, real browser)
Cian блокирует server-IP scraping anti-bot. Эти скрипты запускаются с локальной машины разработчика через SSH-tunnel к prod tradein-postgres — обходят bot detection, используют real Chrome с persistent profile.
Когда использовать
- Backfill
offer_price_historyдля активных Cian listings (history scraper, надёжно) - Best-effort backfill
external_valuationsдля домов где Calculator отдаёт оценку без agent-wizard
Prerequisites
pip install playwright "psycopg[binary]" sqlalchemy
python -m playwright install chromium
Setup
1. SSH tunnel к tradein-postgres (отдельное окно, держать открытым)
$IP = (ssh gendesign 'docker inspect tradein-postgres --format "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}"').Trim()
ssh -L "15433:${IP}:5432" gendesign -N
2. Env vars (creds из vault meta/00_credentials.md)
$env:TRADEIN_DB_DSN = "postgresql+psycopg://tradein:<PASSWORD>@localhost:15433/tradein"
$env:COOKIE_ENCRYPTION_KEY = (ssh gendesign 'grep ^COOKIE_ENCRYPTION_KEY= /opt/gendesign/tradein-mvp/.env.runtime | cut -d= -f2').Trim()
3. Залить Cian cookies (один раз / по мере истечения)
- Login на cian.ru в обычном Chrome.
- DevTools → Application → Cookies → www.cian.ru → скопировать
DMIR_AUTH(httpOnly) +_CIAN_GK. - Вставить значения в
upload_cookies_local.py(поля с плейсхолдером<PASTE_FROM_BROWSER_DEVTOOLS>). - Вставить реальный Cian userId в
ACCOUNT_USER_ID(найти: DevTools → Network → XHR →/v1/get-my-id/→userId). - Run:
python upload_cookies_local.py
Usage
History backfill (production-ready, не блокируется)
python -u playwright_history.py --batch 20 --delay 2 2>&1 | Tee-Object -FilePath cian_history.log
- Темп: ~25 listings/min
- Идёт по
id > last_idASC pagination - Записывает в
offer_price_history(UNIQUE listing_id + change_time) - Скорость дрейна 5к листингов: ~3-4 часа
Valuation backfill (best-effort, partial)
python -u playwright_valuation.py --batch 10 --delay 5 --wait 8 2>&1 | Tee-Object -FilePath cian_valuation.log
- Использует persistent profile
./chrome_profile/для сохранения сессии между runs (переопределяется через$env:CIAN_PROFILE_DIR) - На
not authв--headedmode — ждёт manual login в открытом окне - Skip листинги где Cian не отдаёт оценку (~70% таких — новостройки, нет аналогов)
Если auth теряется
Playwright Chrome имеет другой fingerprint чем твой обычный Chrome → Cian может invalidate сессию. Решения:
- Запустить с
--headed→ login manually в окне. - Re-upload cookies через
upload_cookies_local.py.
Pre-existing knowledge
См. vault decisions/Decision_Cian_History_Valuation_Activation_May24.md — full 6-PR sequence
(#523/#525/#530/#535/#539/#543) + open follow-ups.
Limitations
- Calculator (
external_valuations) собирается только для домов с готовой оценкой в_cianConfig['valuation-for-agent-frontend'].initialState.estimation. Полный wizard-flow не автоматизируется. DMIR_AUTHexpires ~30-60 min — нужно периодически перезаливать cookies.- Не покрывает Cian listings вне нашего SERP (старые не-active, нестандартные region/category).