{"id":499461,"date":"2026-10-20T18:20:07","date_gmt":"2026-10-20T15:20:07","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=499461"},"modified":"2026-10-20T18:20:07","modified_gmt":"2026-10-20T15:20:07","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=499461","title":{"rendered":"SEO-\u043a\u043e\u043c\u0431\u0430\u0439\u043d \u043d\u0430 AI-\u0430\u0433\u0435\u043d\u0442\u0430\u0445"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><strong>\u041a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Screaming Frog, Semrush \u0438 Ahrefs \u0441\u0432\u044f\u0437\u043a\u043e\u0439 LLM \u0438 API-\u0448\u043b\u044e\u0437\u043e\u0432<\/strong><\/p>\n<p>\u0412 SEO-\u0441\u0440\u0435\u0434\u0435 \u0436\u0438\u0432 \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f: LLM \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0443\u0434\u0438\u0442 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043e\u0444\u0442\u043e\u043c. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0437\u0432\u0443\u0447\u0438\u0442 \u0432\u0435\u0441\u043e\u043c\u043e: \u0443 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043e\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435, \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u0437 \u043d\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u043b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u0443\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f: LLM \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b (tool calling), \u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0430, \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0430\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u0432\u044f\u0437\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 SEO-\u0437\u0430\u0434\u0430\u0447 \u2014 \u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0443\u0434\u0438\u0442\u0430 \u0434\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 2026 \u0433\u043e\u0434\u0430, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0438 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442.<\/p>\n<h3>1. \u041a\u0440\u0430\u0443\u043b\u0438\u043d\u0433: LLM \u043a\u0430\u043a \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u0430 \u043d\u0435 \u043f\u0430\u0440\u0441\u0435\u0440<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u043a\u0440\u0430\u0443\u043b\u0435\u0440 (Screaming Frog, Netpeak Spider) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e: HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 HTML, \u0433\u0440\u0430\u0444 \u0441\u0432\u044f\u0437\u0435\u0439. \u0418\u0418 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0438\u043b \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u0435: \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u043b CSV \u0438 \u043f\u0440\u043e\u0441\u0438\u043b ChatGPT \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0445 URL \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438.<\/p>\n<p>\u0410\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0430\u0447\u0435 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0445\u043e\u0434\u0430: [\u0410\u0433\u0435\u043d\u0442 \/ LLM]  \u2014 \u043f\u043b\u0430\u043d \u0437\u0430\u0434\u0430\u0447\u0438: \u00ab\u0441\u043e\u0431\u0440\u0430\u0442\u044c URL, Title, \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb \u2502  tool call \u25bc [\u0421\u043a\u0438\u043b\u043b \u043a\u0440\u0430\u0443\u043b\u0435\u0440\u0430: headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \/ scraping-API] \u2502  \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u0430\u0439\u0442\u0430 \u25bc [\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435: SQLite \/ CSV] \u2502  \u0430\u0433\u0440\u0435\u0433\u0430\u0442, \u0430 \u043d\u0435 \u0441\u044b\u0440\u043e\u0439 HTML \u25bc [LLM] \u2014 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u0432\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u043e\u0432<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u044b\u0440\u043e\u0439 HTML \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435 \u0442\u044b\u0441\u044f\u0447\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0430 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e \u043d\u0438\u0445. \u042d\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043d\u0430 2\u20133 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438 \u0441\u043d\u044f\u0442\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u0439\u0442\u0430.<\/p>\n<h4>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430:<\/h4>\n<p>SPA \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433. \u0421\u0430\u0439\u0442\u044b \u043d\u0430 React\/Vue\/Angular \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u2014 headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 (Playwright) \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0440\u043e\u043b\u043b, \u043a\u043b\u0438\u043a\u0438 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u0416\u0438\u0432\u0443\u0447\u0435\u0441\u0442\u044c. \u0421\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0430\u0434\u0430\u0435\u0442. \u0410\u0433\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e. \u0422\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0433\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451.<\/p>\n<h4>\u0421\u043a\u0438\u043b\u043b \u043a\u0440\u0430\u0443\u043b\u0435\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0434\u043a\u0430, \u0430 \u043d\u0435 \u0441\u044b\u0440\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b:<\/h4>\n<pre><code># pip install playwright aiohttp beautifulsoup4# playwright install chromiumimport asyncio, sqlite3from dataclasses import dataclass, asdictfrom urllib.parse import urljoin, urlparsefrom urllib.robotparser import RobotFileParserimport aiohttpfrom bs4 import BeautifulSoupfrom playwright.async_api import async_playwright@dataclassclass PageRecord:    url: str    status: int    title: str    depth: intclass CrawlerSkill:    \"\"\"\u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a tool. HTML \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u2014    \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0434\u043a\u0430 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0411\u0414.\"\"\"    def __init__(self, start_url: str, max_pages: int = 500,                 delay: float = 1.0, render_js: bool = False):        self.start = start_url        self.max_pages = max_pages        self.delay = delay        self.render_js = render_js        self.domain = urlparse(start_url).netloc        self.robots = RobotFileParser(start_url + \"\/robots.txt\")        try:            self.robots.read()        except OSError:            pass  # robots.txt \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u2014 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u043c, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c    def _allowed(self, url: str) -&gt; bool:        return self.robots.can_fetch(\"SEOAgent\", url)    async def _extract_links(self, html: str) -&gt; list[str]:        soup = BeautifulSoup(html, \"html.parser\")        for tag in soup([\"script\", \"style\", \"noscript\"]):            tag.decompose()        links = set()        for a in soup.find_all(\"a\", href=True):            href = urljoin(self.start, a[\"href\"].split(\"#\")[0])            if urlparse(href).netloc == self.domain and href.startswith(\"http\"):                links.add(href)        return list(links)    async def run(self) -&gt; dict:        db = sqlite3.connect(\"crawl.db\")        db.execute('''CREATE TABLE IF NOT EXISTS pages                      (url TEXT PRIMARY KEY, status INT, title TEXT, depth INT)''')        seen, queue, done = {self.start}, [(self.start, 0)], []        async with aiohttp.ClientSession(            headers={\"User-Agent\": \"SEOAgent\/1.0 (contact@example.com)\"}) as s:            if self.render_js:  # SPA \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440                self._pw = await async_playwright().start()                self._browser = await self._pw.chromium.launch()            while queue and len(done) &lt; self.max_pages:                url, depth = queue.pop(0)                if not self._allowed(url):                    continue                try:                    if self.render_js:                        page = await self._browser.new_page()                        resp = await page.goto(url, timeout=30000)                        html = await page.content()                        status = resp.status if resp else 0                        await page.close()                    else:                        async with s.get(url, timeout=30) as r:                            html, status = await r.text(), r.status                except (aiohttp.ClientError, asyncio.TimeoutError):                    continue                title = BeautifulSoup(html, \"html.parser\").title                title = title.text.strip()[:200] if title else \"\"                db.execute(\"INSERT OR REPLACE INTO pages VALUES (?,?,?,?)\",                           (url, status, title, depth))                db.commit()                done.append(asdict(PageRecord(url, status, title, depth)))                if depth &lt; 5:                    queue += [(l, depth + 1) for l in await self._extract_links(html)                              if l not in seen]                    seen |= {l for l, _ in queue}                await asyncio.sleep(self.delay)  # \u0432\u0435\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443        # \u0410\u0433\u0435\u043d\u0442\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0410\u0413\u0420\u0415\u0413\u0410\u0422, \u0430 \u043d\u0435 \u0441\u044b\u0440\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432        report = {            \"crawled\": len(done),            \"status_codes\": dict(db.execute(                \"SELECT status, COUNT(*) FROM pages GROUP BY status\").fetchall()),            \"duplicate_titles\": [t for t, c in db.execute(                \"SELECT title, COUNT(*) c FROM pages GROUP BY title HAVING c &gt; 1\")],            \"sample_errors\": db.execute(                \"SELECT url, status FROM pages WHERE status &gt;= 400 LIMIT 20\").fetchall(),        }        db.close()        return report```\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0442 \u0441\u043a\u0438\u043b\u043b \u00ab\u0432\u0435\u0436\u043b\u0438\u0432\u044b\u0439\u00bb \u2014 \u043e\u043d \u0447\u0438\u0442\u0430\u0435\u0442 robots.txt, \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 User-Agent \u0441 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u043c. \u042f \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e \u0432 \u043d\u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434 \u0430\u043d\u0442\u0438\u0431\u043e\u0442-\u0441\u0438\u0441\u0442\u0435\u043c \u2014 \u043f\u043e\u0447\u0435\u043c\u0443, \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.## 2. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0447\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Screaming FrogFirecrawl \u2014 API, \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 LLM-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439: \u0441\u0430\u043c \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430, \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 JavaScript \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 Markdown \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u044b\u0440\u043e\u0433\u043e HTML. \u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u044d\u0442\u043e \u043f\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430:```# pip install firecrawl-pyfrom firecrawl import FirecrawlAppapp = FirecrawlApp(api_key=\"fc-***\")# \/crawl \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430 \u0441\u0430\u043c \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Markdownresult = app.crawl_url(    \"https:\/\/example-catalog.ru\/catalog\",    params={\"limit\": 200, \"scrapeOptions\": {\"formats\": [\"markdown\"]}},)pages = result[\"data\"]          # \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 Markdown```Crawl4AI \u2014 open-source \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0434\u043b\u044f self-hosted-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432: \u0435\u0441\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.Browserless.io \u2014 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 Chrome \u043f\u043e API: \u0430\u0433\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0446\u0435\u043b\u044c (\u00ab\u0434\u043e\u0436\u0434\u0438\u0441\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 X, \u043a\u043b\u0438\u043a\u043d\u0438, \u0432\u0435\u0440\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u00bb), \u0430 \u043d\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b.\u041e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043f\u043e\u0434\u0430\u0447\u0435 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c. \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442\u043e\u0432, \u0440\u043e\u0442\u0430\u0446\u0438\u044f User-Agent \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0430\u043d\u0442\u0438\u0431\u043e\u0442-\u0441\u0438\u0441\u0442\u0435\u043c (Cloudflare \u0438 \u0442. \u043f.) \u2014 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0435\u0440\u0430\u044f \u0437\u043e\u043d\u0430: \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u043e \u043e\u0431\u0445\u043e\u0434 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0430\u0439\u0442\u0430 \u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 ToS \u2014 \u044d\u0442\u043e \u0440\u0438\u0441\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u00ab\u0444\u0438\u0447\u0430\u00bb \u0430\u0433\u0435\u043d\u0442\u0430. \u042f \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0447\u044c\u0451 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434 \u0437\u0430\u0449\u0438\u0442, \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, robots.txt \u0438 \u0432\u0435\u0436\u043b\u0438\u0432\u044b\u043c\u0438 rate limits. \u042d\u0442\u043e \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u00ab\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0447\u0443\u0436\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u00bb: \u043e\u043d \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 ToS \u044d\u0442\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e, \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u043f\u0443\u0442\u044c \u043a \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.## 3. \u0414\u0430\u043d\u043d\u044b\u0435: Just-in-Time \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u044b\u0445 \u0431\u0430\u0437Semrush \u0438 Ahrefs \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0431\u0430\u0437\u044b \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a. \u0414\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u0430\u044f \u0434\u043e\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u0435 \u0432\u044b \u0437\u0430 \u0432\u0441\u044e \u0431\u0430\u0437\u0443.\u0410\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0438:\u0421\u0431\u043e\u0440 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438: \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043a DataForSEO \u0438\u043b\u0438 Keys.so. \u041f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u00ab\u0441\u043e\u0431\u0435\u0440\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 X\u00bb \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 JSON \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432, \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 CPC, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u043c\u0443\u0441\u043e\u0440 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0438\u043d\u0442\u0435\u043d\u0442\u0443. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 (\u0430 \u043d\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e URL \u0432 \u0422\u041e\u041f-10) \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433-\u043c\u043e\u0434\u0435\u043b\u044c:```# cluster.py \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443, \u0430 \u043d\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e URL# pip install sentence-transformers scikit-learnimport csvfrom sentence_transformers import SentenceTransformerfrom sklearn.cluster import KMeanswith open(\"queries.csv\", encoding=\"utf-8\") as f:        # \u043a\u043e\u043b\u043e\u043d\u043a\u0430: keyword    queries = [row[\"keyword\"] for row in csv.DictReader(f)]model = SentenceTransformer(\"intfloat\/multilingual-e5-base\")X = model.encode([f\"query: {q}\" for q in queries], normalize_embeddings=True)k = max(3, len(queries) \/\/ 25)                          # ~25 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440labels = KMeans(n_clusters=k, n_init=10).fit_predict(X)groups = {}for q, label in zip(queries, labels):    groups.setdefault(int(label), []).append(q)with open(\"clusters.csv\", \"w\", newline=\"\", encoding=\"utf-8\") as f:    writer = csv.writer(f)    for label, q in sorted(groups.items()):        writer.writerow([label] + q)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u0441\u0441\u044b\u043b\u043e\u043a: \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435 API \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u044d\u043a\u043b\u0438\u043d\u043a\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0434\u043e\u043d\u043e\u0440\u0430, \u043d\u043e \u0438 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u0443\u044e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u2014 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0438 \u0442\u0435\u043c\u044b \u0434\u043e\u043d\u043e\u0440\u0430 \u0438 \u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 DR-\u043e\u0442\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442:<\/p>\n<pre><code>import numpy as npfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer(\"intfloat\/multilingual-e5-base\")def embed(text: str) -&gt; np.ndarray:    prefix = \"passage: \" if len(text) &gt; 50 else \"query: \"    return model.encode(prefix + text, normalize_embeddings=True)# \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043e\u043d\u043e\u0440\u043e\u0432 \u0438 \u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440\u0430 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0441\u043a\u0438\u043b\u043b\u043e\u043c \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 1links = [    {\"url\": \"https:\/\/forum-auto.ru\/t\/123\",     \"context\": \"\u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0412\u0410\u0417\"},    {\"url\": \"https:\/\/kitchen-recipes.info\/post\/9\",     \"context\": \"\u0440\u0435\u0446\u0435\u043f\u0442\u044b \u0441\u0430\u043b\u0430\u0442\u043e\u0432\"},]acceptor = embed(\"\u043a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u0440\u043c\u043e\u0437\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u0434\u043a\u0438 \u0434\u043b\u044f \u0412\u0410\u0417\")for link in links:    link[\"score\"] = round(float(np.dot(acceptor, embed(link[\"context\"]))), 3)print(sorted(links, key=lambda x: -x[\"score\"]))# \u0434\u043e\u043d\u043e\u0440 \u0441 score &lt; 0.5 \u2014 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0441\u043f\u0430\u043c \u0432 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435, \u0432 \u0430\u0443\u0442\u0440\u0438\u0447 \u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u043c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438: \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u0451\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 \u0434\u043e\u043d\u043e\u0440\u0430 \u0438 \u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440\u0430 \u0432\u044b\u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u00ab\u0430\u043d\u043a\u043e\u0440 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u0435\u043d, \u043d\u043e \u043e\u043a\u043e\u043b\u043e\u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u043c\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443\u00bb \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0441\u043e\u0444\u0442, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e embedding-\u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0443\u043d\u0435\u0442\u043e\u0432\u0441\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 SpyWords \u0438 Keys.so \u0434\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0439 \u0440\u0435\u043a\u043b\u0430\u043c\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0437\u0430\u043f\u0430\u0434\u043d\u044b\u0445 \u0431\u0430\u0437\u0430\u0445 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<h3>4. \u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f: \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0446\u0438\u043a\u043b \u0438 No-Code<\/h3>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0446\u0438\u043a\u043b \u043d\u0430 tool calling \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0430\u043c\u0430 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0443\u043b\u0435\u0440 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<pre><code># pip install openai \u2014 API \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 DeepSeek, OpenAI, vLLM \u0438 \u0434\u0440.import jsonfrom openai import OpenAIfrom crawler_skill import CrawlerSkillclient = OpenAI(base_url=\"https:\/\/api.deepseek.com\", api_key=\"sk-***\")tools = [{    \"type\": \"function\",    \"function\": {        \"name\": \"crawl_site\",        \"description\": \"\u041a\u0440\u0430\u0443\u043b\u0438\u0442 \u0441\u0430\u0439\u0442, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0434\u043a\u0443: \u043a\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \"                       \"\u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b title, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438\",        \"parameters\": {\"type\": \"object\", \"properties\": {            \"url\": {\"type\": \"string\"},            \"max_pages\": {\"type\": \"integer\", \"default\": 300},            \"render_js\": {\"type\": \"boolean\", \"default\": False},        }, \"required\": [\"url\"]},    },}]def execute(name: str, args: dict) -&gt; str:    if name == \"crawl_site\":        crawler = CrawlerSkill(args[\"url\"], max_pages=args.get(\"max_pages\", 300),                               render_js=args.get(\"render_js\", False))        return json.dumps(crawler.run(), ensure_ascii=False)    raise ValueError(f\"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 tool: {name}\")messages = [{\"role\": \"user\",             \"content\": \"\u041f\u0440\u043e\u0432\u0435\u0434\u0438 \u0442\u0435\u0445\u0430\u0443\u0434\u0438\u0442 https:\/\/example.ru. \u0415\u0441\u043b\u0438 \u0441\u0430\u0439\u0442 \u043d\u0430 JS \u2014 \"                        \"\u0432\u043a\u043b\u044e\u0447\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433. \u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u0434\u0430\u0439 \u0442\u043e\u043f-5 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.\"}]while True:    resp = client.chat.completions.create(model=\"deepseek-chat\",                                          messages=messages, tools=tools)    msg = resp.choices[0].message    messages.append(msg.model_dump(exclude_none=True))    if not msg.tool_calls:        print(msg.content)  # \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442        break    for call in msg.tool_calls:        args = json.loads(call.function.arguments)        messages.append({\"role\": \"tool\", \"tool_call_id\": call.id,                         \"content\": execute(call.function.name, args)})```\u0415\u0441\u043b\u0438 \u043a\u043e\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438:Dify \u2014 open-source, self-host \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439; \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u00abURL \u2192 Firecrawl \u2192 LLM \u2192 \u043e\u0442\u0447\u0451\u0442\u00bb.n8n \u2014 self-hosted \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0441 AI-\u0443\u0437\u043b\u0430\u043c\u0438. \u0421\u043a\u0435\u043b\u0435\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u0430\u0443\u0434\u0438\u0442\u0430 (\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0430; \u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0443\u0437\u043b\u043e\u0432 \u0441\u0432\u0435\u0440\u044f\u044e \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c):```{  \"name\": \"SEO-\u0430\u0443\u0434\u0438\u0442 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e\",  \"nodes\": [    { \"name\": \"Cron\", \"type\": \"n8n-nodes-base.scheduleTrigger\" },    { \"name\": \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0430\u0439\u0442\u043e\u0432\", \"type\": \"n8n-nodes-base.googleSheets\",      \"parameters\": { \"operation\": \"read\", \"range\": \"sites!A2:A\" } },    { \"name\": \"Firecrawl\", \"type\": \"n8n-nodes-base.httpRequest\",      \"parameters\": { \"method\": \"POST\", \"url\": \"https:\/\/api.firecrawl.dev\/v1\/crawl\",                      \"jsonBody\": \"={{ {\\\"url\\\": $json.site, \\\"limit\\\": 200} }}\" } },    { \"name\": \"LLM\", \"type\": \"@n8n\/n8n-nodes-langchain.openAi\",      \"parameters\": { \"model\": \"deepseek-chat\",                      \"messages\": [{ \"role\": \"user\",                        \"content\": \"\u041d\u0430\u0439\u0434\u0438 SEO-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u0435\u0440\u043d\u0438 JSON: issue, severity, fix\" }] } },    { \"name\": \"Telegram\", \"type\": \"n8n-nodes-base.telegram\" }  ],  \"connections\": {    \"Cron\": { \"main\": [[{ \"node\": \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0430\u0439\u0442\u043e\u0432\" }]] },    \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0430\u0439\u0442\u043e\u0432\": { \"main\": [[{ \"node\": \"Firecrawl\" }]] },    \"Firecrawl\": { \"main\": [[{ \"node\": \"LLM\" }]] },    \"LLM\": { \"main\": [[{ \"node\": \"Telegram\" }]] }  }}```CrewAI \/ LangGraph \u2014 \u0435\u0441\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u0430: \u043c\u043d\u043e\u0433\u043e\u0440\u043e\u043b\u0435\u0432\u0430\u044f \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.## 5. \u041c\u043e\u0434\u0435\u043b\u0438 \u0432 2026 \u0433\u043e\u0434\u0443: \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c\u0412\u0430\u0436\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0430\u043b\u0438\u044f\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e\u0434\u043d\u0438\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442:\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 Gemini \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u00ab\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439\u00bb. \u0412 \u0434\u0435\u043a\u0430\u0431\u0440\u0435 2025 \u0433\u043e\u0434\u0430 Google \u0443\u0440\u0435\u0437\u0430\u043b \u043a\u0432\u043e\u0442\u044b Free Tier \u043d\u0430 50\u201392% \u2014 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u043a\u0430\u043a \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043b\u043e\u0448\u0430\u0434\u043a\u0443 \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f.DeepSeek \u2014 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. V4 Pro: $0.44 \u0437\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 $0.88 \u0437\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0441 \u0443\u0434\u0432\u043e\u0435\u043d\u0438\u0435\u043c \u0446\u0435\u043d\u044b \u0432 \u043f\u0438\u043a\u043e\u0432\u044b\u0435 \u0447\u0430\u0441\u044b. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0430\u0443\u0434\u0438\u0442\u0430, \u0433\u0434\u0435 \u0432\u0445\u043e\u0434 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u0435\u0435 \u0432\u044b\u0445\u043e\u0434\u0430, \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 (Llama, Qwen \u0447\u0435\u0440\u0435\u0437 Ollama\/vLLM) \u2014 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 API.\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0445\u043e\u0434 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0430\u0445, \u0435\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u044b\u0440\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0412 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 1 \u044d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0434\u0430\u0451\u0442\u0435 LLM \u043f\u043e\u043b\u043d\u044b\u0439 HTML \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u0447\u0451\u0442 \u0437\u0430 API \u0440\u0430\u0441\u0442\u0451\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0430\u0439\u0442\u0430, \u0438 \u043d\u0430 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0442\u0430 \u043e\u0431\u0433\u043e\u043d\u044f\u0435\u0442 \u0433\u043e\u0434\u043e\u0432\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430.## 6. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0441\u044c**\u0427\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u041d\u0415 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442:**Highload-\u043a\u0440\u0430\u0443\u043b\u0438\u043d\u0433. \u041f\u043e\u0440\u0442\u0430\u043b \u043d\u0430 500 000+ URL \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0443\u043b\u0435\u0440 \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0435\u0435: \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0443 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0448\u0435.\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0421\u043a\u0438\u043b\u043b \u00ab\u0447\u0438\u0441\u0442\u043e\u0433\u043e\u00bb \u043f\u0430\u0443\u043a\u0430 \u0434\u0435\u0448\u0451\u0432\u044b\u0439, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043e\u0441\u043c\u044b\u0441\u043b\u044f\u0442\u044c \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043d\u0430 \u043b\u0435\u0442\u0443, \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0433\u043e\u0434\u043e\u0432\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430.\u0413\u0430\u0440\u0430\u043d\u0442\u0438\u0438. \u0410\u0433\u0435\u043d\u0442 \u2014 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0414\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 (\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438, SLA-\u043e\u0442\u0447\u0451\u0442\u043d\u043e\u0441\u0442\u044c) \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c; \u0430\u0433\u0435\u043d\u0442 \u043b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0432\u0435\u0434\u043a\u0438.### \u0412\u044b\u0432\u043e\u0434\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0430\u043a\u0430\u044f: LLM \u2014 \u043d\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 API \u0438 headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432. \u0414\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 SEO-\u0437\u0430\u0434\u0430\u0447 \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0438 \u0434\u0435\u043d\u044c\u0433\u0438, \u0438 \u0447\u0430\u0441\u044b \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0438 \u0437\u0430\u0434\u0430\u0447 \u0441 \u0436\u0451\u0441\u0442\u043a\u0438\u043c SLA \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043e\u0444\u0442 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432 \u0434\u0435\u043b\u0435.\u0420\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u2014 \u043d\u0435 \u00ab\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0451\u00bb, \u0430 \u0433\u0438\u0431\u0440\u0438\u0434: \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0431\u043e\u0440 \u0441\u044b\u0440\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a + LLM-\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438.*\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u043e\u0435\u0432\u044b\u0445 \u0441\u0430\u0439\u0442\u0430\u0445. \u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430 \u0436\u0438\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u2014 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u041d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043d\u0430\u0439\u0434\u0451\u0442 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u043c\u043d\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0430.*<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1096874\/\">https:\/\/habr.com\/ru\/articles\/1096874\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Screaming Frog, Semrush \u0438 Ahrefs \u0441\u0432\u044f\u0437\u043a\u043e\u0439 LLM \u0438 API-\u0448\u043b\u044e\u0437\u043e\u0432\u0412 SEO-\u0441\u0440\u0435\u0434\u0435 \u0436\u0438\u0432 \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f: LLM \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0443\u0434\u0438\u0442 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043e\u0444\u0442\u043e\u043c. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0437\u0432\u0443\u0447\u0438\u0442 \u0432\u0435\u0441\u043e\u043c\u043e: \u0443 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043e\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435, \u043d\u043e \u0432\u044b\u0432\u043e\u0434 \u0438\u0437 \u043d\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u043b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u0443\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f: LLM \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0445 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b (tool calling), \u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0430, \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0430\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u0432\u044f\u0437\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 SEO-\u0437\u0430\u0434\u0430\u0447 \u2014 \u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0443\u0434\u0438\u0442\u0430 \u0434\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438.\u041d\u0438\u0436\u0435 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 2026 \u0433\u043e\u0434\u0430, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0438 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442.1. \u041a\u0440\u0430\u0443\u043b\u0438\u043d\u0433: LLM \u043a\u0430\u043a \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u0430 \u043d\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u043a\u0440\u0430\u0443\u043b\u0435\u0440 (Screaming Frog, Netpeak Spider) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e: HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 HTML, \u0433\u0440\u0430\u0444 \u0441\u0432\u044f\u0437\u0435\u0439. \u0418\u0418 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0438\u043b \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u0435: \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u043b CSV \u0438 \u043f\u0440\u043e\u0441\u0438\u043b ChatGPT \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0445 URL \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438.\u0410\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0430\u0447\u0435 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0445\u043e\u0434\u0430: [\u0410\u0433\u0435\u043d\u0442 \/ LLM]  \u2014 \u043f\u043b\u0430\u043d \u0437\u0430\u0434\u0430\u0447\u0438: \u00ab\u0441\u043e\u0431\u0440\u0430\u0442\u044c URL, Title, \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb \u2502  tool call \u25bc [\u0421\u043a\u0438\u043b\u043b \u043a\u0440\u0430\u0443\u043b\u0435\u0440\u0430: headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 \/ scraping-API] \u2502  \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u0430\u0439\u0442\u0430 \u25bc [\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435: SQLite \/ CSV] \u2502  \u0430\u0433\u0440\u0435\u0433\u0430\u0442, \u0430 \u043d\u0435 \u0441\u044b\u0440\u043e\u0439 HTML \u25bc [LLM] \u2014 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u0432\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u043e\u0432\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u044b\u0440\u043e\u0439 HTML \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435 \u0442\u044b\u0441\u044f\u0447\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0430 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e \u043d\u0438\u0445. \u042d\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043d\u0430 2\u20133 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438 \u0441\u043d\u044f\u0442\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u0439\u0442\u0430.\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430:SPA \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433. \u0421\u0430\u0439\u0442\u044b \u043d\u0430 React\/Vue\/Angular \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u2014 headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440 (Playwright) \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0440\u043e\u043b\u043b, \u043a\u043b\u0438\u043a\u0438 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u0416\u0438\u0432\u0443\u0447\u0435\u0441\u0442\u044c. \u0421\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0430\u0434\u0430\u0435\u0442. \u0410\u0433\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e. \u0422\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0433\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451.\u0421\u043a\u0438\u043b\u043b \u043a\u0440\u0430\u0443\u043b\u0435\u0440\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0434\u043a\u0430, \u0430 \u043d\u0435 \u0441\u044b\u0440\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b:# pip install playwright aiohttp beautifulsoup4# playwright install chromiumimport asyncio, sqlite3from dataclasses import dataclass, asdictfrom urllib.parse import urljoin, urlparsefrom urllib.robotparser import RobotFileParserimport aiohttpfrom bs4 import BeautifulSoupfrom playwright.async_api import async_playwright@dataclassclass PageRecord:    url: str    status: int    title: str    depth: intclass CrawlerSkill:    &#171;&#187;&#187;\u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043a\u0430\u043a tool. HTML \u043d\u0430\u0440\u0443\u0436\u0443 \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u2014    \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0434\u043a\u0430 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0411\u0414.&#187;&#187;&#187;    def __init__(self, start_url: str, max_pages: int = 500,                 delay: float = 1.0, render_js: bool = False):        self.start = start_url        self.max_pages = max_pages        self.delay = delay        self.render_js = render_js        self.domain = urlparse(start_url).netloc        self.robots = RobotFileParser(start_url + &#171;\/robots.txt&#187;)        try:            self.robots.read()        except OSError:            pass  # robots.txt \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u2014 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u043c, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c    def _allowed(self, url: str) -&gt; bool:        return self.robots.can_fetch(&#171;SEOAgent&#187;, url)    async def _extract_links(self, html: str) -&gt; list[str]:        soup = BeautifulSoup(html, &#171;html.parser&#187;)        for tag in soup([&#171;script&#187;, &#171;style&#187;, &#171;noscript&#187;]):            tag.decompose()        links = set()        for a in soup.find_all(&#171;a&#187;, href=True):            href = urljoin(self.start, a[&#171;href&#187;].split(&#171;#&#187;)[0])            if urlparse(href).netloc == self.domain and href.startswith(&#171;http&#187;):                links.add(href)        return list(links)    async def run(self) -&gt; dict:        db = sqlite3.connect(&#171;crawl.db&#187;)        db.execute(&#187;&#8217;CREATE TABLE IF NOT EXISTS pages                      (url TEXT PRIMARY KEY, status INT, title TEXT, depth INT)&#187;&#8217;)        seen, queue, done = {self.start}, [(self.start, 0)], []        async with aiohttp.ClientSession(            headers={&#171;User-Agent&#187;: &#171;SEOAgent\/1.0 (contact@example.com)&#187;}) as s:            if self.render_js:  # SPA \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c headless-\u0431\u0440\u0430\u0443\u0437\u0435\u0440                self._pw = await async_playwright().start()                self._browser = await self._pw.chromium.launch()            while queue and len(done) &lt; self.max_pages:                url, depth = queue.pop(0)                if not self._allowed(url):                    continue                try:                    if self.render_js:                        page = await self._browser.new_page()                        resp = await page.goto(url, timeout=30000)                        html = await page.content()                        status = resp.status if resp else 0                        await page.close()                    else:                        async with s.get(url, timeout=30) as r:                            html, status = await r.text(), r.status                except (aiohttp.ClientError, asyncio.TimeoutError):                    continue                title = BeautifulSoup(html, &#171;html.parser&#187;).title                title = title.text.strip()[:200] if title else &#171;&#187;                db.execute(&#171;INSERT OR REPLACE INTO pages VALUES (?,?,?,?)&#187;,                           (url, status, title, depth))                db.commit()                done.append(asdict(PageRecord(url, status, title, depth)))                if depth &lt; 5:                    queue += [(l, depth + 1) for l in await self._extract_links(html)                              if l not in seen]                    seen |= {l for l, _ in queue}                await asyncio.sleep(self.delay)  # \u0432\u0435\u0436\u043b\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443        # \u0410\u0433\u0435\u043d\u0442\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0410\u0413\u0420\u0415\u0413\u0410\u0422, \u0430 \u043d\u0435 \u0441\u044b\u0440\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u2014 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432        report = {            &#171;crawled&#187;: len(done),            &#171;status_codes&#187;: dict(db.execute(                &#171;SELECT status, COUNT(*) FROM pages GROUP BY status&#187;).fetchall()),            &#171;duplicate_titles&#187;: [t for t, c in db.execute(                &#171;SELECT title, COUNT(*) c FROM pages GROUP BY title HAVING c &gt; 1&#187;)],            &#171;sample_errors&#187;: db.execute(                &#171;SELECT url, status FROM pages WHERE status &gt;= 400 LIMIT 20&#8243;).fetchall(),        }        db.close()        return report&#171;`\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0442 \u0441\u043a\u0438\u043b\u043b \u00ab\u0432\u0435\u0436\u043b\u0438\u0432\u044b\u0439\u00bb \u2014 \u043e\u043d \u0447\u0438\u0442\u0430\u0435\u0442 robots.txt, \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 User-Agent \u0441 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u043c. \u042f \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e \u0432 \u043d\u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434 \u0430\u043d\u0442\u0438\u0431\u043e\u0442-\u0441\u0438\u0441\u0442\u0435\u043c \u2014 \u043f\u043e\u0447\u0435\u043c\u0443, \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.## 2. \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0447\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Screaming FrogFirecrawl \u2014 API, \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 LLM-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439: \u0441\u0430\u043c \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430, \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 JavaScript \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 Markdown \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u044b\u0440\u043e\u0433\u043e HTML. \u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u044d\u0442\u043e \u043f\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430:&#171;`# pip install firecrawl-pyfrom firecrawl import FirecrawlAppapp = FirecrawlApp(api_key=&#187;fc-***&#187;)# \/crawl \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0430\u0439\u0442\u0430 \u0441\u0430\u043c \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Markdownresult = app.crawl_url(    &#171;https:\/\/example-catalog.ru\/catalog&#187;,    params={&#171;limit&#187;: 200, &#171;scrapeOptions&#187;: {&#171;formats&#187;: [&#171;markdown&#187;]}},)pages = result[&#171;data&#187;]          # \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 Markdown&#171;`Crawl4AI \u2014 open-source \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0434\u043b\u044f self-hosted-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432: \u0435\u0441\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.Browserless.io \u2014 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 Chrome \u043f\u043e API: \u0430\u0433\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0446\u0435\u043b\u044c (\u00ab\u0434\u043e\u0436\u0434\u0438\u0441\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 X, \u043a\u043b\u0438\u043a\u043d\u0438, \u0432\u0435\u0440\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u00bb), \u0430 \u043d\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b.\u041e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043f\u043e\u0434\u0430\u0447\u0435 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c. \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442\u043e\u0432, \u0440\u043e\u0442\u0430\u0446\u0438\u044f User-Agent \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0430\u043d\u0442\u0438\u0431\u043e\u0442-\u0441\u0438\u0441\u0442\u0435\u043c (Cloudflare \u0438 \u0442. \u043f.) \u2014 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0435\u0440\u0430\u044f \u0437\u043e\u043d\u0430: \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u043e \u043e\u0431\u0445\u043e\u0434 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0430\u0439\u0442\u0430 \u0438 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 ToS \u2014 \u044d\u0442\u043e \u0440\u0438\u0441\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u00ab\u0444\u0438\u0447\u0430\u00bb \u0430\u0433\u0435\u043d\u0442\u0430. \u042f \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0447\u044c\u0451 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434 \u0437\u0430\u0449\u0438\u0442, \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, robots.txt \u0438 \u0432\u0435\u0436\u043b\u0438\u0432\u044b\u043c\u0438 rate limits. \u042d\u0442\u043e \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u00ab\u0445\u043e\u0434\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043d\u0430 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0447\u0443\u0436\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u00bb: \u043e\u043d \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 ToS \u044d\u0442\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e, \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u043f\u0443\u0442\u044c \u043a \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.## 3. \u0414\u0430\u043d\u043d\u044b\u0435: Just-in-Time \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u044b\u0445 \u0431\u0430\u0437Semrush \u0438 Ahrefs \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0431\u0430\u0437\u044b \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a. \u0414\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u0430\u044f \u0434\u043e\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u0435 \u0432\u044b \u0437\u0430 \u0432\u0441\u044e \u0431\u0430\u0437\u0443.\u0410\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0438:\u0421\u0431\u043e\u0440 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438: \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043a DataForSEO \u0438\u043b\u0438 Keys.so. \u041f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u00ab\u0441\u043e\u0431\u0435\u0440\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 X\u00bb \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 JSON \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432, \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 CPC, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u043c\u0443\u0441\u043e\u0440 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0438\u043d\u0442\u0435\u043d\u0442\u0443. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 (\u0430 \u043d\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e URL \u0432 \u0422\u041e\u041f-10) \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433-\u043c\u043e\u0434\u0435\u043b\u044c:&#171;`# cluster.py \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443, \u0430 \u043d\u0435 \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e URL# pip install sentence-transformers scikit-learnimport csvfrom sentence_transformers import SentenceTransformerfrom sklearn.cluster import KMeanswith open(&#171;queries.csv&#187;, encoding=&#187;utf-8&#8243;) as f:        # \u043a\u043e\u043b\u043e\u043d\u043a\u0430: keyword    queries = [row[&#171;keyword&#187;] for row in csv.DictReader(f)]model = SentenceTransformer(&#171;intfloat\/multilingual-e5-base&#187;)X = model.encode([f&#187;query: {q}&#187; for q in queries], normalize_embeddings=True)k = max(3, len(queries) \/\/ 25)                          # ~25 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440labels = KMeans(n_clusters=k, n_init=10).fit_predict(X)groups = {}for q, label in zip(queries, labels):    groups.setdefault(int(label), []).append(q)with open(&#171;clusters.csv&#187;, &#171;w&#187;, newline=&#187;&#187;, encoding=&#187;utf-8&#8243;) as f:    writer = csv.writer(f)    for label, q in sorted(groups.items()):        writer.writerow([label] + q)\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u0441\u0441\u044b\u043b\u043e\u043a: \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435 API \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u044d\u043a\u043b\u0438\u043d\u043a\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-499461","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=499461"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499461\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=499461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=499461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=499461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}