Автоматизируем SEO-анализ конкурентов с Puppeteer, Zod и TypeScript: DIY-скрипт
-

SEO-анализ конкурентов руками - это ад. Залипаешь часами в Ahrefs или Serpstat, копируешь титлы, мета, ключевики, а толку ноль - данные устаревают за день. Этот скрипт на Puppeteer, Zod и TypeScript парсит всё автоматически: сниппеты, заголовки, ссылки конкурентов прямо из выдачи. Запускаешь на Node.js - и получаешь чистый JSON для дальнейшей обработки или ИИ-анализа.
Зачем это нужно? Экономит 80% времени, даёт свежие данные без платных API, масштабируется на сотни запросов. Идеально для пет-проектов или когда бюджет на инструменты жмёт. Плюс, с Zod типизируем вывод - никаких сюрпризов в данных.
Почему Puppeteer - король для SEO-парсинга
Puppeteer рендерит JavaScript как настоящий браузер, так что SPA-конкуренты с динамикой не проблема. Headless-режим скрывает автоматизацию, обходит базовые антиботы. В отличие от Cheerio, который жрёт статический HTML, тут полная эмуляция: скролл, клики, ожидание загрузки. Реальный кейс: парсим топ-10 Яндекса по “купить iPhone” - титлы, описания, URL улетают в базу за минуты.
С TypeScript добавляем строгую типизацию - скрипт не сломается на кривых данных. Zod валидирует парсинг: если сниппет не влез - ошибка сразу. Без этого хаос: один домен вернёт 404, другой заблокирует - и весь массив в мусор. Плюс, легко интегрировать с ИИ: кидаешь JSON в GPT для кластеризации ключей.
Вот ключевые плюсы стека:
- Puppeteer: Обходит JS-рендер, имитирует юзера - стабильность 95%+.
- Zod: Схемы валидации - данные всегда типизированы, без ручных чеков.
- TypeScript: Автокомплит, рефакторинг - код как конструктор Lego.
Инструмент Плюсы Минусы Puppeteer JS-рендер, DevTools Жрёт RAM (200-500 МБ/страница) Cheerio Лёгкий, быстрый Нет динамики Playwright Мультибраузер Круче, но heavier Установка и настройка: 5 минут до первого парса
Сначала ставим зависимости: puppeteer для браузера, zod для схем, typescript и ts-node для запуска. npm i -D @types/node ts-node. Всё на Node.js 20+. Скачивается Chromium автоматически - не паримся с драйверами. Конфигим userAgent на реальный Chrome, добавляем прокси если Яндекс злой.
В package.json скрипты: “dev”: “ts-node scraper.ts”. Запуск - node dist/scraper.js после tsc. Логируем в файл, чтобы не засорять консоль. Тестируем на одном запросе: “seo анализ” - и вуаля, JSON с 10 конкурентами. Масштаб: очередь на 100+ запросов с лимитом 1/sec, чтоб не банили.
Шаги установки:
npm init -y && npm i puppeteer zod && npm i -D typescript @types/node ts-node- Создай tsconfig.json: {“compilerOptions”: {“target”: “ES2020”, “module”: “commonjs”, “strict”: true}}
- UserAgent ротируй вручную или через puppeteer-extra-plugin.
// tsconfig.json фрагмент {"include": ["src/**/*"], "ts-node": {"esm": false}}Основной скрипт: парсим выдачу конкурентов
Код делим на функции: launchBrowser, searchQuery, extractSnippet. Идём на google.com или yandex.ru, вбиваем запрос через page.type, ждём результаты. Puppeteer.click на пагинацию если нужно топ-50. Извлекаем селекторы: h3 для титлов, .snippet для описаний, a[href] для URL. Zod схема проверяет: title.length > 10, url.startsWith(‘http’).
Обработка ошибок: если captcha - retry с новым прокси. Параллелим запросы Promise.all, но не больше 5 одновременно. Выводим в файл или Mongo. Пример: по запросу “node.js курсы” хватит 3 страницы - 30 конкурентов с метриками.
Ключевые селекторы для Яндекса/Google:
- Титлы: ‘h3[data-lines]’ или ‘. OrganicTitle’
- Описания: ‘.organic__url-text’ / ‘div[data-sncf]’
- URL: ‘a[href].serp-item__title-link’
Полный скрипт ниже - копипасть и лети:
import puppeteer from 'puppeteer'; import { z } from 'zod'; type Competitor = { title: string; description: string; url: string; }; const CompetitorSchema = z.object({ title: z.string().min(1), description: z.string().optional(), url: z.string().url() }); const parseCompetitors = async (query: string): Promise<Competitor[]> => { const browser = await puppeteer.launch({ headless: 'new' }); const page = await browser.newPage(); await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'); await page.goto(`https://yandex.ru/search/?text=${encodeURIComponent(query)}`, { waitUntil: 'networkidle0' }); const competitors: Competitor[] = await page.evaluate(() => { return Array.from(document.querySelectorAll('li.serp-item')).map(el => { const titleEl = el.querySelector('h2 a') as HTMLElement; const descEl = el.querySelector('.organic__text') as HTMLElement; const linkEl = el.querySelector('h2 a') as HTMLAnchorElement; return { title: titleEl?.innerText || '', description: descEl?.innerText || '', url: linkEl?.href || '' }; }).slice(0, 10); }); await browser.close(); return z.array(CompetitorSchema).parse(competitors); }; // Использование (async () => { const data = await parseCompetitors('seo анализ конкурентов'); console.log(JSON.stringify(data, null, 2)); })();Нюанс: для Google меняй селекторы на g-search-item или используй SerpAPI если паранойя.
Расширение: ИИ-анализ и экспорт данных
Собранный JSON кидай в OpenAI API: кластеризуй ключи, оцени контент по LSI. Zod обеспечит чистый ввод. Добавь экспорт в CSV/Excel via papaparse. Мониторинг: cron на серваке раз в день парсит топ-5 ниш, сравнивает видимость.
Интеграция простая: после парса POST в /analyze с промптом. Пример: “Проанализируй эти титлы конкурентов и предложи улучшения”. Масштаб до 1000 запросов/день с ротацией IP. Сравни с платными: бесплатно, кастомно, без лимитов.
Возможности расширения:
- ИИ-кластеризация: GPT-4o по JSON генерит топики.
- Ссылка-парсинг: Качай robots.txt, sitemap.xml.
- Мониторинг: Сохраняй в Supabase, алерты на изменения.
Фича Время на имплемент Польза ИИ-анализ 30 мин Кластеры ключей Экспорт CSV 10 мин Отчёты в Google Sheets Прокси-ротация 1 час Антибан Скрипт в продакшене: от пет-проекта к рутине
Задеплой на Vercel или Render - serverless функции по запросу. Docker для локалки: Chrome stable + puppeteer. Тестируй на staging: 50 запросов без крашей. Лайфхак: stealth-плагин puppeteer-extra маскирует под человека. Reddit шепчет, что в 2026 Yandex усилил ботов - ротация UA must-have.
Бонус: добавь скриншоты топ-страниц via page.screenshot. Храни в S3, анализируй визуал ИИ. Теперь у тебя дашборд: графики позиций, дельта ключей. Экономия - 10 часов/неделю на ручной труд.
Масштабирование работает так:
- 1 запрос: 5 сек.
- 100 запросов: 10 мин с параллелью.
- Лимит: 2-3 запроса/мин на IP.
Когда скрипт покажет зубы
Этот DIY-скрипт бьёт платные сервисы по свежести - парсит live-выдачу без кэша. Осталось доработать: геотаргетинг, мобильная выдача, интеграцию с GA4. Подумай о комбо с LangChain - агент сам решит, какие ключи копать глубже. Технологии рулят, когда экономят часы и нервы.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.