Путь от объявления в браузере до карточки на aframedomik.ru. Занимает минут десять, из них девять — ожидание тестов.
Автоматический Catalog update в репозитории сайта сюда не годится: он гоняет
только glamping_rf, а страницы Авито сохраняет человек, и в CI их нет.
браузер → pages/*.html → парсер → generated/avito → синк сайта → PR → мерж → прод
Открыть объявление в браузере → «Сохранить как» → «Веб-страница полностью».
Класть в pages/ внутри репозитория парсера — эта папка закрыта в .gitignore.
Страницу коммитить нельзя. Она сохранена под вашим логином и содержит ваши
email и имя. На случай промаха есть страж: go test ./providers/avito/ упадёт,
если такой файл попадёт под git.
Папку <имя>_files рядом можно не трогать, парсер её не читает.
cd parse-iframes
go run ./app --provider=avito --input=pagesВ логе — по строке на объявление. Результат: generated/avito/objects.json.
Проверить глазами главное — цену и регион:
python3 -c "
import json
for o in json.load(open('generated/avito/objects.json')):
print(o['slug'], '|', o['cabins'][0]['price'] if o['cabins'] else 'ЦЕНЫ НЕТ', '|', o['region'] or 'РЕГИОНА НЕТ')"Регион обязан совпадать с формой каталога — «Ивановская область», а не «Ивановская обл.».
Пустой регион чинить обязательно, и не «когда-нибудь». Пустоту синк не пропускает дальше — он подставляет догадку по адресу, и догадка бывает неверной: у объявления в Москве регионом станет «Московская область», а у адреса, форму которого разбор не узнал, — вся строка целиком, вместе с улицей и номером дома. Ни то ни другое проверкой «число регионов не выросло» не ловится: регион-то не новый. Пустой регион означает одно из двух — первым сегментом стоит город федерального значения (тогда проставьте регион через админ-таблицу сайта) либо разбор не знает такой формы записи (тогда её нужно завести в словарь, см. раздел «Если что-то пошло не так»).
Нужен Node 22 — на 20-м скрипты .ts не запускаются вовсе:
cd ../iv-iframes
nvm use # берёт 22.22.3 из .nvmrc
git checkout -b catalog/avito-<дата>
SYNC_ONLY_NEW=1 SYNC_ONLY_PROVIDER=avito \
PARSER_GENERATED_DIR=../parse-iframes/generated npm run sync-catalogSYNC_ONLY_NEW=1 — режим «только добавление»: карточки, которые уже в каталоге,
остаются нетронутыми, добавляются лишь новые. Без него один прогон ради одного
домика тащит за собой всё, что источники поменяли с прошлого раза, — такой дифф
не проверить глазами.
SYNC_ONLY_PROVIDER=avito сужает добавление до объявлений Авито: свежий прогон
приносит и новые объекты глэмпинги.рф, а они к сегодняшней задаче отношения не
имеют. Уберите переменную, если хотите добавить всё новое сразу.
Скрипт печатает, что именно добавил, и что пропустил:
режим ТОЛЬКО ДОБАВЛЕНИЕ (источник: avito) — добавлено 3, сохранено без изменений 320
+ otdyh-dlya-dvoih
+ otdyh-s-furako-v-priyute-muzykanta
+ otdyh-v-lesu-s-kupelyu
пропущено новых из других источников: 6 (doma-v-tumane, …)
Полный пересбор (обновить цены и тексты у всех) — обычный запуск без этих двух переменных.
В конце скрипт печатает число объектов и регионов. Число регионов не должно вырасти — новый регион в списке означает, что появился двойник вроде «Ивановская обл.» рядом с «Ивановская область», и объекты спрячутся от фильтра.
go test ./catalog/... # каталог собирается, дублей слагов нет
npx vitest run # ~890 тестов фронта
npm run build # гейт типов (именно build, не tsc --noEmit)Коммитить три файла — их меняет синк:
git add catalog/data/objects.json catalog/data/summary.json src/constants/project.json
git commit -m "данные: +N объектов с Авито"
git push -u origin HEADДальше PR → мерж в main → выкладка на сервер идёт сама по push.
«повторяющиеся slug» — синк упал на гейте. Значит объявление получило тот же
адрес, что и объект из другого источника (например, medvezhiy-zaliv есть и у
глэмпинги.рф). Внутри одного источника тёзки разводятся автоматически, между
источниками — нет. Лечится переименованием: правьте заголовок в админ-таблице
сайта или заводите объект вручную.
Регионов стало больше — см. шаг 3. Сокращение из адреса не развернулось в
полную форму: добавьте его в словарь regionSuffixExpansions
(providers/avito/mapper.go) и пересоберите.
Описание пустое на странице объекта — проверьте cabins[0].property.summary
в generated/avito/objects.json. Страница берёт описание как
summary ?? about, и пустая строка в summary затирает about молча.
Тесты паритета ругаются на specs/удобства — у объявлений Авито структурных удобств нет физически, тесты сайта это допускают (iframes#125). Если ругань вернулась — значит правку откатили.
Телефона (площадка отдаёт только маску, номер показывает картинкой), окружения, типов домов, признака «можно с питомцами». Всё это заполняется после разговора с владельцем — через админ-таблицу сайта.