Skip to content

Latest commit

 

History

History
140 lines (103 loc) · 8.11 KB

File metadata and controls

140 lines (103 loc) · 8.11 KB

Добавить объект с Авито на сайт

Путь от объявления в браузере до карточки на aframedomik.ru. Занимает минут десять, из них девять — ожидание тестов.

Автоматический Catalog update в репозитории сайта сюда не годится: он гоняет только glamping_rf, а страницы Авито сохраняет человек, и в CI их нет.

Коротко

браузер → pages/*.html → парсер → generated/avito → синк сайта → PR → мерж → прод

1. Сохранить страницу

Открыть объявление в браузере → «Сохранить как» → «Веб-страница полностью». Класть в pages/ внутри репозитория парсера — эта папка закрыта в .gitignore.

Страницу коммитить нельзя. Она сохранена под вашим логином и содержит ваши email и имя. На случай промаха есть страж: go test ./providers/avito/ упадёт, если такой файл попадёт под git.

Папку <имя>_files рядом можно не трогать, парсер её не читает.

2. Собрать данные

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 'РЕГИОНА НЕТ')"

Регион обязан совпадать с формой каталога — «Ивановская область», а не «Ивановская обл.».

Пустой регион чинить обязательно, и не «когда-нибудь». Пустоту синк не пропускает дальше — он подставляет догадку по адресу, и догадка бывает неверной: у объявления в Москве регионом станет «Московская область», а у адреса, форму которого разбор не узнал, — вся строка целиком, вместе с улицей и номером дома. Ни то ни другое проверкой «число регионов не выросло» не ловится: регион-то не новый. Пустой регион означает одно из двух — первым сегментом стоит город федерального значения (тогда проставьте регион через админ-таблицу сайта) либо разбор не знает такой формы записи (тогда её нужно завести в словарь, см. раздел «Если что-то пошло не так»).

3. Влить в каталог сайта

Нужен 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-catalog

SYNC_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, …)

Полный пересбор (обновить цены и тексты у всех) — обычный запуск без этих двух переменных.

В конце скрипт печатает число объектов и регионов. Число регионов не должно вырасти — новый регион в списке означает, что появился двойник вроде «Ивановская обл.» рядом с «Ивановская область», и объекты спрячутся от фильтра.

4. Проверить

go test ./catalog/...     # каталог собирается, дублей слагов нет
npx vitest run            # ~890 тестов фронта
npm run build             # гейт типов (именно build, не tsc --noEmit)

5. Выложить

Коммитить три файла — их меняет синк:

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). Если ругань вернулась — значит правку откатили.

Чего в данных Авито нет

Телефона (площадка отдаёт только маску, номер показывает картинкой), окружения, типов домов, признака «можно с питомцами». Всё это заполняется после разговора с владельцем — через админ-таблицу сайта.