89 lines
3.4 KiB
JavaScript
89 lines
3.4 KiB
JavaScript
(async () => {
|
||
|
||
const processed = new Set();
|
||
const results = [];
|
||
|
||
let page = 1;
|
||
|
||
while (true) {
|
||
console.log(`📄 Страница ${page} — сбор...`);
|
||
|
||
const cardContainers = document.querySelectorAll('div._1kf6gff');
|
||
|
||
for (let i = 0; i < cardContainers.length; i++) {
|
||
const container = cardContainers[i];
|
||
|
||
const link = container.querySelector('a[href*="/firm/"]');
|
||
if (!link) continue;
|
||
|
||
const href = link.href.split('?')[0];
|
||
const idMatch = href.match(/\/firm\/([^/]+)/);
|
||
const id = idMatch ? idMatch[1] : null;
|
||
|
||
if (!id || processed.has(id)) continue;
|
||
processed.add(id);
|
||
|
||
const name = container.querySelector('span._lvwrwt span, h3, [class*="name"]')?.innerText.trim() || '—';
|
||
|
||
console.log(` 🔥 ${processed.size} — ${name}`);
|
||
|
||
container.click();
|
||
await new Promise(r => setTimeout(r, 300));
|
||
|
||
const phoneBtn = document.querySelector('button, [role="button"], [class*="phone"], [aria-label*="телефон"]');
|
||
if (phoneBtn && /телефон|позвонить|показать/i.test(phoneBtn.innerText || phoneBtn.getAttribute('aria-label') || '')) {
|
||
phoneBtn.click();
|
||
await new Promise(r => setTimeout(r, 300));
|
||
}
|
||
|
||
let secondPhone = '—';
|
||
const allPhones = [];
|
||
document.querySelectorAll('a[href^="tel:"]').forEach(l => allPhones.push(l.href.replace('tel:', '').trim()));
|
||
|
||
if (allPhones.length >= 2) secondPhone = allPhones[1];
|
||
else if (allPhones.length === 1) secondPhone = allPhones[0];
|
||
|
||
const address = container.querySelector('[class*="address"], ._sfdp8cg, ._klarpw, ._14quei')?.innerText.trim() || '—';
|
||
|
||
results.push({
|
||
name: name,
|
||
address: address,
|
||
phones: secondPhone,
|
||
link: href
|
||
});
|
||
|
||
const closeBtn = document.querySelector('button[aria-label*="закрыть"], [class*="close"], [class*="modal"] button');
|
||
if (closeBtn) closeBtn.click();
|
||
await new Promise(r => setTimeout(r, 300));
|
||
}
|
||
|
||
console.log(`✅ Страница ${page} обработана (${results.length} записей)`);
|
||
|
||
const nextBtn = document.querySelector('div._n5hmn94 svg:not([style*="rotate(90deg)"])');
|
||
const nextButtonContainer = nextBtn ? nextBtn.closest('div._n5hmn94') : null;
|
||
|
||
if (!nextButtonContainer) {
|
||
console.log('✅ Достигнут конец списка');
|
||
break;
|
||
}
|
||
|
||
nextButtonContainer.click();
|
||
console.log(`➡️ Переход на страницу ${page + 1}`);
|
||
await new Promise(r => setTimeout(r, 500));
|
||
|
||
page++;
|
||
}
|
||
|
||
console.table(results);
|
||
|
||
const csv = "data:text/csv;charset=utf-8," +
|
||
"Название;Адрес;Телефоны;Ссылка\n" +
|
||
results.map(r => `"${r.name}";"${r.address}";"${r.phones}";"${r.link}"`).join("\n");
|
||
|
||
const a = document.createElement('a');
|
||
a.href = encodeURI(csv);
|
||
a.download = `автосалоны_только_вторые_${new Date().toISOString().slice(0,10)}.csv`;
|
||
a.click();
|
||
|
||
console.log('%c🎉 Готово! Собрано ' + results.length + ' записей (только вторые номера)', 'color:#00ff00;font-size:18px');
|
||
})(); |