{
 "№": 137,
 "заголовок": "Источник данных, который закрыт и для меня, и для веб-архива",
 "площадка": "Habr",
 "статус": "Опубликовано",
 "тип": "разбор",
 "контур": "спутник · разбор",
 "рубрика": "Франшизы",
 "кластер": "А1",
 "волна": "П1",
 "приоритет": "P1",
 "создана": "2026-09-30",
 "выход": null,
 "просмотры": 5426,
 "ключи": [
  {
   "фраза": "каталог франшиз",
   "показы": 1704,
   "главный": true
  }
 ],
 "ключи_нота": "",
 "ключи_кластер": "Каталог франшиз",
 "ключи_замер": "из шапки материала",
 "описание": null,
 "ключи_из_текста": [],
 "знаков": 7125,
 "слов": 1116,
 "файл": "завод/публикации/habr-04-veb-arhiv-katalog.md",
 "статус_текста": "ОПУБЛИКОВАНО на Habr 30.09.2026 руководителем, статья 1088562",
 "ссылки": {
  "опубликована": "https://habr.com/ru/articles/1088562/",
  "витрина": [
   "portal-frantlas/statyi-ploshchadok/habr-post-4.html"
  ],
  "документ": null,
  "документ_локальный": false,
  "страница": true
 },
 "картинки": [
  {
   "файл": "habr-04-oborot-vitriny.jpg",
   "alt": "Схема: каталог франшиз в январе 2024 и в августе 2026 - 285 карточек против 201, дожили 62. Иллюстрация автора",
   "подпись": null,
   "адрес": "данные/картинки/habr-04-oborot-vitriny.jpg",
   "блок": 23,
   "обложка": false,
   "ключи": [
    "каталог франшиз"
   ]
  }
 ],
 "картинки_нота": null,
 "иллюстрации": {
  "слов": 1195,
  "норма": 12,
  "в_тексте": 1,
  "ключи": [
   {
    "фраза": "каталог франшиз",
    "в_подписи": true
   }
  ],
  "повторы": []
 },
 "площадка_правила": {
  "имя": "Habr",
  "адрес": "https://habr.com/ru/",
  "как_публикуем": "руками",
  "ссылки_вес": null,
  "ссылки_правило": null,
  "картинки": null,
  "объём": null,
  "регистрация": [
   "почта",
   "никнейм",
   "пароль дважды",
   "капча",
   "согласие с соглашением и политикой"
  ],
  "телефон": "нет",
  "аккаунт": "заведён",
  "статус_площадки": "РАБОТАЕТ, ЧЕТЫРЕ МАТЕРИАЛА. 16.09.2026 первый (регулярки, 8500 просмотров - лучший результат среди всех наших площадок), 21.09.2026 второй («Парсер, который не падает, а врёт», 6200), 30.09.2026 третий - «Источник данных, который закрыт и для меня, и для веб-архива»: https://habr.com/ru/articles/1088562/ , 13.10.2026 четвёртый - «Пять тысяч строк одного списка: собираю франчайзинговую сеть 1С по открытым данным и сверяю с ЕГРЮЛ»: https://habr.com/ru/articles/1093722/ . Отказов не было ни разу, второй, третий и четвёртый материалы вышли сразу в ленту, без песочницы. Ссылку на портал здесь не ставим вовсе - не из-за прогрева, а по правилам площадки: самопиар разрешён только в корпоративном блоге",
  "ограничения": [
   "для публикации нужна карма или инвайт - новый аккаунт пишет в песочницу, оттуда выпускают модераторы",
   "аудитория враждебна к маркетинговым текстам, наказывает кармой",
   "тематика франшиз ей чужая: заходить только с разборами с цифрами и без продающего тона",
   "есть платный корпоративный блог - отдельная статья расходов, решение руководителя",
   "проверено чужим опытом: у PR-завода Adonis четыре статьи подряд не прошли модерацию, площадку припарковали как неподходящую по теме (созвон 27.08.2026, материалы/разбор-видео-27.08.md)",
   "ПРОВЕРЕНО 09.09.2026, страница о Песочнице: полноправный аккаунт даётся через Песочницу, первая статья проходит модерацию и ждёт приглашения. Точно не пройдут: пресс-релизы, рекламные материалы, СГЕНЕРИРОВАННЫЕ материалы, тексты из списков более чем наполовину и статьи, слабо относящиеся к тематике сайта. Уникальность ниже 75% - почти отказ",
   "ПРОВЕРЕНО 09.09.2026: форма на account.habr.com - почта, никнейм, пароль дважды, капча и два чекбокса. Телефон не спрашивают",
   "ЧАСТОТА ПУБЛИКАЦИЙ, из справки Хабра 17.09.2026 (раздел «Публикации»). Формальный лимит мягкий: «если пользователь опубликовал три материала с интервалами менее 24 часов, то следующий он сможет опубликовать не ранее чем через 24 часа с момента последнего». То есть до трёх статей в сутки, дальше пауза сутки. Отдельно: в хаб «Я пиарюсь» нельзя две и более публикации подряд - но мы туда и не ходим. РЕАЛЬНОЕ ОГРАНИЧЕНИЕ НЕ В ЛИМИТЕ, А В КАРМЕ. Публиковать без модерации может только полноправный аккаунт с положительной кармой, а карму ставят читатели. Аудитория наказывает кармой за маркетинговый тон, и при уходе в минус публиковать станет нельзя. Поэтому темп держим по качеству темы, а не по лимиту: одна сильная техническая статья в неделю-полторы"
  ]
 },
 "чеклист": [
  {
   "что": "Ссылка на портал в тексте",
   "готово": false
  },
  {
   "что": "Заголовок совпадает с тем, что в плане",
   "готово": true
  },
  {
   "что": "Текст написан и лежит в заводе",
   "готово": true
  },
  {
   "что": "Черновик выложен на витрину - можно показать до публикации",
   "готово": true
  },
  {
   "что": "alt у каждой картинки",
   "готово": true
  },
  {
   "что": "Ключ статьи в подписи кадра",
   "готово": true
  },
  {
   "что": "Дисклеймер про доход и окупаемость, если в тексте есть такие цифры",
   "готово": true
  }
 ],
 "письмо": null,
 "размещение": [],
 "анонс": null,
 "текст_html": "<blockquote> Третий материал для Habr, написан взамен отложенного habr-03 про счётчик по логам: руководителю нужна тема ближе к нашей и с ключом ядра. Здесь и то, и другое: метод технический, а предмет - каталог франшиз, ключ А1 «каталог франшиз».  <b>Отказов на Habr у нас не было ни разу</b>: первая статья прошла песочницу за два дня, вторая вышла сразу в ленту. Четыре отказа, которые лежат в карточке площадки, - это чужой опыт PR-завода Adonis, не наш.  <b>Чего нет намеренно:</b> названия портала и любых ссылок. Правила площадки запрещают самопиар прямо. Название каталога-источника тоже не звучит: статья про метод, а не про конкретный сайт, и претензий к нему у нас нет.</blockquote>\n<h2>Источник данных, который закрыт и для меня, и для веб-архива</h2>\n<p>Задача звучала просто. Есть большой каталог франшиз - витрина, где сотни карточек с ценами входа. Надо понять, насколько быстро эта витрина обновляется: сколько предложений, которые человек видел два года назад, дожили до сегодня.</p>\n<p>Вопрос не праздный. Каталог франшиз читают как справочник, и возраст предложения в нём воспринимается как возраст бизнеса за ним. Проверить это можно только одним способом - сравнить два состояния каталога в разные годы.</p>\n<p>Ниже история про то, как я это сделал, и почему повторить уже не смогу: источник закрылся не только от меня, но и от веб-архива.</p>\n<h3>Живой сайт меня не пускает</h3>\n<p>Первая мысль была очевидной: обойти каталог сейчас, а прошлое достать из архива. Не вышло сразу.</p>\n<p>На любом адресе, вплоть до корня сайта, мой сервер получает <b>421</b>. Не 403, не капчу, а именно 421 - Misdirected Request. Этот код обычно означает, что запрос пришёл на сервер, который не обслуживает этот домен; на практике его часто отдаёт защитный слой перед сайтом, когда решает, что соединение ему не нравится.</p>\n<p>Проверил через обычный браузер Playwright с честным user-agent - тот же 421. Попробовал с другой машины - страница открывается нормально. То есть дело в адресе сервера, а не в способе запроса.</p>\n<p>Здесь важно назвать вещи своими именами, а не заявить «сайт лежит». <b>Доступность с сервера и доступность для читателя - разные вещи.</b> У меня сервер за границей, и половина рунета встречает его совсем не так, как встречает домашний интернет. Я на этом уже обжигался: пара площадок, которые «не работали», прекрасно открывались у человека из дома.</p>\n<p>Раз живой сайт закрыт, остаётся архив.</p>\n<h3>Два снимка вместо обхода</h3>\n<p>Веб-архив оказался не запасным вариантом, а лучшим.</p>\n<p>Если брать данные из архива с обеих сторон, оба среза сняты <b>одним способом</b>. Это важнее, чем свежесть: когда один срез собран обходом живого сайта, а другой из архива, любое расхождение можно списать на разницу методов. А так метод один, различаются только даты.</p>\n<p>Взял два состояния: январь 2024 года и август 2026-го. Двенадцать категорий каталога, одни и те же в обоих срезах - если категории поедут, поедет и выборка.</p>\n<p>Дальше разбор страниц и сопоставление. Считается ровно одно: совпадают ли адреса карточек. Не названия - названия переписывают, - а именно адреса.</p>\n<p>```python было = {з[\"путь\"]: з for з in старое[\"записи\"]} стало = set(новое[\"пути\"])</p>\n<p>осталось = sorted(п for п in было if п in стало) ушло     = sorted(п for п in было if п not in стало) пришло   = sorted(п for п in стало if п not in было) ```</p>\n<p>Три множества, ничего сложного. Сложное начинается там, где надо решить, что эти множества означают.</p>\n<h3>Что число значит, а что нет</h3>\n<p>Получилось так:</p>\n<ul><li>в январе 2024 года на витрине <b>285</b> карточек;</li><li>в августе 2026-го - <b>201</b>;</li><li>из прежних дожили <b>62</b>, это 22 процента;</li><li>исчезли <b>223</b>;</li><li>появились <b>139</b> новых, то есть 69 процентов нынешней витрины.</li></ul>\n<figure class=\"статья-кадр\" data-файл=\"habr-04-oborot-vitriny.jpg\"><img src=\"данные/картинки/habr-04-oborot-vitriny.jpg\" alt=\"Схема: каталог франшиз в январе 2024 и в августе 2026 - 285 карточек против 201, дожили 62. Иллюстрация автора\" loading=\"lazy\"><figcaption>Схема: каталог франшиз в январе 2024 и в августе 2026 - 285 карточек против 201, дожили 62. Иллюстрация автора</figcaption></figure>\n<p>И вот тут главный соблазн, которому нельзя поддаваться. Число 22 процента просится в заголовок «три четверти франшиз закрываются за два года». Так писать нельзя, потому что измерено не это.</p>\n<p>Исчезнувшая карточка означает ровно одно: <b>этого адреса во втором снимке нет.</b> За таким исчезновением стоит что угодно: франчайзер закрылся, перестал продавать франшизу, ушёл в другой каталог, поссорился с площадкой или просто перестал платить за размещение. Данные не позволяют выбрать между этими версиями, и значит выбирать нельзя.</p>\n<p>Это общее правило работы с чужими витринами: <b>вы меряете витрину, а не рынок за ней.</b> Я держу эту формулировку прямо в скрипте, в строке документации, чтобы она попадала в глаза раньше, чем результат.</p>\n<h3>Цены: где выборка честно схлопывается</h3>\n<p>Отдельный срез - что стало с ценой входа у тех, кто дожил.</p>\n<p>Переживших 62. Казалось бы, вот и выборка. Но цена нашлась в обоих снимках только у <b>24</b> из них: где-то строка стартовых инвестиций в старом снимке не сохранилась, где-то формат записи изменился так, что сравнивать нечего.</p>\n<p>Из этих 24 подорожали 8, подешевели 3, а 13 остались при своей цифре. Медианный рост - ноль процентов.</p>\n<p>Соблазн здесь обратный: хочется вытянуть выборку до 62, дописав пропуски «примерно». Нельзя. Двадцать четыре - это и есть честный размер, и его надо назвать вслух рядом с результатом, иначе читатель решит, что речь про все шестьдесят два.</p>\n<h3>Третий срез: как источник закрылся окончательно</h3>\n<p>К сентябрю захотелось третьей точки. Тут выяснилось, что архив обходил каталог последний раз 15 августа, и сам по себе новых снимков не сделает.</p>\n<p>У веб-архива есть механизм заказа снимка - Save Page Now. Нужны ключи, дальше это обычный запрос: просишь сохранить адрес, получаешь номер задания, потом проверяешь статус. Написал скрипт на все двенадцать категорий.</p>\n<p>Первая же ловушка - предел одновременных заданий:</p>\n<p>``<code> You have already reached the limit of active Save Page Now </code>``</p>\n<p>Это не ошибка запроса, а очередь. Правильная реакция - подождать и повторить, а не считать категорию несобранной. Первый прогон у меня взял ровно половину категорий именно потому, что на эту строку скрипт реагировал как на отказ.</p>\n<p>Починил, запустил заново - и получил на каждом задании одно и то же:</p>\n<p>``<code> The target server blocks access to <a href=\"https://...\" target=\"_blank\" rel=\"noopener\">https://...</a>  (HTTP status=403) </code>``</p>\n<p>Архив принял задания, честно сходил за страницами и получил отказ. То есть каталог блокирует не только мой сервер, но и обходчик веб-архива.</p>\n<p>Третьего среза не будет. Не потому, что я неправильно попросил, а потому, что источник закрыт для сохранения в принципе - пока сайт не изменит правила.</p>\n<h3>Что я из этого забрал</h3>\n<p><b>Источник может исчезнуть, и данные надо считать скоропортящимися.</b> Два снятых среза остались в силе, потому что они сняты. Ряд оборвался не на моей стороне.</p>\n<p><b>Снимать обе точки одним способом важнее, чем снять свежую.</b> Если бы я в 2024-м обошёл сайт напрямую, а в 2026-м взял архив, любое расхождение пришлось бы объяснять разницей методов, и результат никого бы не убедил.</p>\n<p><b>Ошибка очереди и ошибка отказа - разные вещи.</b> «Достигнут предел активных заданий» означает «подожди», а «target server blocks access» означает «никогда». Скрипт, который не различает эти два случая, врёт дважды: сначала теряет половину данных, потом не замечает, что источник умер.</p>\n<p><b>Формулировку результата надо держать рядом с кодом.</b> Строка «считаются адреса карточек, а не судьбы компаний» живёт у меня прямо в документации скрипта. Через месяц, когда цифра попадёт в чужой текст, никто не вспомнит оговорку - а так она едет вместе с числом.</p>\n<p>И последнее, уже не техническое. Когда витрина за два года обновляется на две трети, каталог франшиз перестаёт быть справочником и становится лентой. Читать его как каталог с историей - значит приписывать предложениям возраст, которого у них нет.</p>\n<p>Данные разбора: 12 категорий, снимки 23 января 2024 года и 15 августа 2026 года, оба из веб-архива. Скрипты сбора, сравнения и заказа снимков лежат вместе с результатом - без них числа выше пришлось бы принимать на слово.</p>",
 "есть_текст": true
}
