df83fa836c
Шаг 1 «Конкурентное поле» — чекпоинт: - Финальный проход «Найти и объединить дубли» на поле и предложениях; клиент решает по каждой группе, ничего не склеиваем молча. - Тихая склейка только по сайту и коду справочника; телефон и людный номер у более чем 4 фирм — на решение клиента. - Колонка phones jsonb; телефон-дубли видны уже на «Предложениях». - Sonar даёт только имя и тип, сайт всегда через EXA; вскрываем все карточки без гейта «есть сайт». - Яндекс-карточки через локальный Playwright параллельно; рубрика из заголовка идёт в описание. - Фикс рекламных номеров: 2ГИС-парсер разбирает телефоны пообъектно и выкидывает рекламные кнопки с platforms/caption чужих фирм. Тесты: автоподбор 224/224 unit, 105/105 feature; фронт-спеки зелёные. Времянки app/scripts/diag-*/probe-* в гит не входят. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 lines
1.5 KiB
JavaScript
37 lines
1.5 KiB
JavaScript
// Usage: node render-card.cjs <url>
|
||
// Рендер карточки организации (Яндекс.Карты/2ГИС) локальным Playwright → JSON { html }.
|
||
// ВАЖНО: Яндекс.Карты НЕ доходят до networkidle (постоянные фоновые запросы) — поэтому ждём
|
||
// domcontentloaded + фиксированную паузу (как рабочий render-yandex-list.cjs), а не networkidle.
|
||
// Нужен, чтобы вскрывать яндекс-карточки надёжно (xfetch под нагрузкой их режет → терялся сайт).
|
||
const { chromium } = require('playwright');
|
||
|
||
(async () => {
|
||
const url = process.argv[2];
|
||
let parsed;
|
||
try {
|
||
parsed = new URL(url);
|
||
} catch (e) {
|
||
console.error('bad url');
|
||
process.exit(2);
|
||
}
|
||
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
||
console.error('bad scheme');
|
||
process.exit(2);
|
||
}
|
||
|
||
const browser = await chromium.launch({ headless: true });
|
||
try {
|
||
const page = await browser.newPage({ locale: 'ru-RU' });
|
||
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 45000 });
|
||
// Даём подгрузиться блоку контактов (сайт/телефоны рисуются после первого рендера).
|
||
await page.waitForTimeout(4500);
|
||
const html = await page.content();
|
||
process.stdout.write(JSON.stringify({ html }));
|
||
} finally {
|
||
await browser.close();
|
||
}
|
||
})().catch((e) => {
|
||
console.error(String(e));
|
||
process.exit(1);
|
||
});
|