---
name: avtero_harvest_sources_v2
description: avtero новые харвест-источники охвата (china-parts/MAHLE/MANN) — пути, схемы, статус интеграции; ZF отложен
metadata:
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

avtero макс-охват, 2026-06-30 (после [[avtero_coverage_free_expansion]]). Юзер: «сразу 3 с проверками». Все базы на `/Volumes/Ext` (constraint). Категории авто→детали расширены: `_CAT_VEH` 37→~67 cat (закоммичено `56b8c7d`), каждый локальный хит make-корректен.

**2026-07-02 (v0.7.19) — url-якорь china для «поздних» китайцев (Exeed/Omoda/Jaecoo/Tank/Voyah/Zeekr).** Юзер: «максимально обширная локальная база, меньше жечь квоту, но особенности каждого авто не забывать». Замер до = 26/400 (6.5%). **Баг матчинга, не данных:** `_china_vehicle_oe` матчил по `model_name`/`model_code`, а каталог филит суб-бренд под шасси-донором Chery (колодки Exeed → model_name 'Tiggo 8') + гейт `len<3` рубил LX/VX/C5/S5/J7. Фикс (`local_brands.py`, `*.bak-cnmatch-*`): **путь1** (legacy model_name/code, гейт `mtok.isalpha() and len>=4` — сохраняет Chery/Haval/Geely 1:1) **∪ путь2** (новый: чистый latin-`url` LIKE %бренд% AND %модель%, любая длина). Категория RU-паттерном по `name`. **Закрыт КЛАСС ложняков:** числовой токен через legacy цеплял чужое — Zeekr 009→90915YZZE2 (фильтр TOYOTA!); путь1 теперь только alpha≥4, числовые идут через бренд-якорный путь2. `_CN_MAKES` += zeekr/jetta/tenet. Результат: 6.5→11.5% ЧЕСТНЫХ (мусор убран); Tank 300=7кат (genuine 1109103XKM01A/FSP34618), Omoda C5=6 (термостат E4G16-1306020), Exeed LX PF1073/PBD1490; baseline Chery/Haval/Geely 67→74/90 (не просел). **НЕ фабрикуем sibling** (специфика авто!) — genuine-строка каталога именно для модели. **Предел данных:** до-харвест china-parts → `to harvest:0` (sitemap не вырос); Voyah 2 OE/Zeekr 0/Jaecoo J8 0 тонкие ВЕЗДЕ → live-путь по VIN + [[avtero_live_harvest_selffill]] + bilstein/Febi (make-строгий). Регресс `tests/test_china_url_anchor.py` (5). 862 passed, e2e Exeed LX без VIN → фильтр из локали.

**3 новых источника (recon фан-аутом 4 субагентов; харвестеры в `~/` и `~/Services/avtero/`):**
- **china-parts.ru (Китаяна)** — китай-new-EV genuine, ГЛАВНАЯ дыра закрыта. SSR Bitrix, без антибота, **прямой RU-IP** (`trust_env=False`), sitemap 85 088 продуктов. Продукт-страница: JSON `properties` (NUMBER/EXT_NUMBERS/BRAND/ORIGINAL=Y/N) + `car_models[]` (модель+год). Харвестер `~/china_parts_harvest.py` → `china_parts/china_parts.sqlite` (table parts: brand,model_name,model_code,year,oe,oe_norm,ext_numbers,original,category). 55 брендов (BYD/Zeekr/Voyah/Li/Exeed/Omoda/Geely/Haval/Chery…). Резюмируемо, nohup.
- **MAHLE** — ✅ ЗАВЕРШЁН. НЕ на сайте бренда (`qr.mahle.com` мёртв) — на **TecAlliance WebCat30** `webservice.tecalliance.services/pegasus-3-0/services/TecdocToCatDLB.jsonEndpoint`, provider **22620**, анонимно, **httpx+EU-прокси socks5 2080**. ⚠️ TecDoc-данные = серая зона (юзер одобрил, как дамп 2018). `getArticles{dataSupplierIds:[287 MAHLE,34 KNECHT],includeOEMNumbers,includeGenericArticles}` пагинацией — **API cap 10000** из 32910. Харвестер `~/mahle_harvest.py` → `mahle/mahle.sqlite`: **10000 арт / 62355 OE** + категория(genericArticle). Полная выборка — партицией по genericArticleId (TODO).
- **MANN-FILTER** — SSR mann-filter.com, без антибота, EU-прокси. commerce-sitemap `uk-en.sitemap-commerce.xml` = 13 048 продуктов. Страница: OE-аккордеон (reuse `app/scrapers/aftermarket_mann._parse_mann_html`) + `data-g-binding-params` (фитмент make/model/series/engineCode/год, URL-кодир.). Харвестер `~/Services/avtero/mann_harvest.py` → `mann/mann.sqlite` (products/product_oe/fitment). NB: OE-группа в парсе = «OE Numbers» (без марки) → make-match через fitment, не oe_mfr. Смоук w712/94 = 2 OE+86 фитмент. nohup.
- **ZF — ОТЛОЖЕН:** агент упал на ложном сейфгарде; `webcat.zf.com` = Nuxt-SPA со своим `/api/` → нужен браузерный XHR-захват (cloakbrowser). Перекрытие с bilstein(febi/SWAG)+MAHLE → низкая маржа. Отдельный заход.

**СТАТУС ИНТЕГРАЦИИ — ✅ СДЕЛАНО 2026-06-30 (#103/104/105 closed).** Все три базы под `/Volumes/Ext/avtero/{china_parts,mahle,mann}` подключены в `app/scrapers/local_brands.py` (бэкап `local_brands.py.bak-harvest-*`, исходный sha256 `049db765…`):
- В `_PATHS` добавлены mann/mahle/china. Новые cross-функции `_mann`/`_mahle`/`_china` врезаны в `cross_oe_local_sync` (→ aftermarket+equivalent_oems+genuine). mann: `product_oe.oe_norm→pn→products.description`; mahle: `article_oe.oe_norm→article_number→articles(mfr/generic_desc)`; china: `parts.oe_norm`→genuine(brand/model_name/category) + ext_numbers split→equivalent_oems.
- vehicle-path: `_china_vehicle_oe` врезан в `vehicle_oe_local_sync` (genuine OE для китайцев), **строго под `_CN_MAKES`** (chery/geely/haval/great wall/lifan/faw/changan/exeed/omoda/byd/… — у china нет колонки make, матч по model-token+RU-категории, иначе коллизии). Не-китайские марки → `[]`.
- Вызовы уже были: `cross_oe_local`←`tecdoc_local.py:645` (аналоги), `vehicle_oe_local`←`orchestrator.py:3760` (добивка OE gap-каров). Рестарт avtero обязателен (модуль кешируется в процессе).
- **Проверено живьём:** mann/mahle/china OE резолвятся (юнит на реальных БД), china GM5002→2 equiv из ext_numbers, gate Kia→[], сквозной подбор Skoda Octavia масл.фильтр = 200/74.6с/OEM 03C115561H/7 аналогов (без регрессии).

**Нюансы охвата:** ZF — ОТКЛОНЁН НАВСЕГДА (2026-07-01, #106): TecAlliance для ZF/SACHS/LEMFÖRDER/TRW закрыт (401, нет в анонимном free-слое — только febi/22620/MAHLE/Bilstein/MANN); ZF webcat = гео-блок Nuxt-SPA без анонимного bulk-API; дочки ZF (SACHS/LEMFÖRDER/TRW) уже перекрыты bilstein+febi+MANN+MAHLE → прирост <5% при большой сложности. Не браться повторно без веской причины.

**2026-07-01 — MAHLE добит (шардинг), «10k из 32910» оказалось неверной посылкой.** Дождался, пока TecAlliance Solr-API разгрузился (был «Queue is full»), и добил шардовым харвестером `/tmp/mahle_shard_harvest.py` (лог `~/mahle_shard.log`). Разведка: **KNECHT(34) maxAllowedPage=27** (~2.7k, влезает целиком) — это и был реальный пробел; **MAHLE(287) cap 100=10000**, но шардинг по `assemblyGroupNodeIds` (поле принимается; каждый артикул несёт `assemblyGroupNodeId`) дал **+0 новых по всем 10 группам** → MAHLE целиком ≈10000 (cap ничего не резал; «32910» было НЕ числом артикулов). Итог: articles **10000→12654** (MAHLE 10000 + KNECHT 2654), **OE-строк 62355→132043** (×2 — пересбор с includeOEMNumbers + KNECHT). Интеграция в `local_brands` не менялась (читает sqlite живьём) — KNECHT/MAHLE OE резолвятся (проверено, 14 кроссов). Scheduled-задача авто-добора удалена (работа сделана). Шардовый харвестер + `~/mahle_probe.py` сохранены. Полный getArticles-фильтр подтверждён: `genericArticleIds`+`assemblyGroupNodeIds` работают (для будущих доборов). Паттерн — как [[avtero_coverage_free_expansion]].

**2026-06-30 — china ПОЧИНЕН (был структурно битый, не просто неполный).** Симптом: china давал **0** во `vehicle_oe_local` на ВСЕ запросы (Chery/Geely/Haval × колодки/диски/фильтры). Корень: харвестер брал `category` из embedded `"section"` JSON, который на КАЖДОЙ странице статично-битый («Блок ABS» даже для мотора печки), а `name` (regex `_re_pname` по `"product":{...}`) не матчился → `name` пустой у 100% строк. Матчер `_china_vehicle_oe` фильтрует по `category`/`name` keyword'ам → никогда не совпадал. Фиксы:
1. **Бэкфилл имён без перекачки** (`/tmp/cp_detranslit.py`+`cp_backfill.py`): реальное имя = транслит URL-слага → де-транслитерация в кириллицу (lossy: теряет «ь», y→й, но стемы категорий восстанавливаются: kolodki→колодки, disk→диск, amortizator→амортизатор). Обновлены **125 646 строк** `parts.name`.
2. **Матчер** (`local_brands.py`, бэкап `*.bak-china-*`): `_china_vehicle_oe` матчит ТОЛЬКО по `name` (category выкинут как ненадёжный), **ь/ъ-нечувствительно** (`REPLACE(REPLACE(lower(name),'ь',''),'ъ','')` + strip ь из паттернов) — иначе фильтр→filtr→филтр не матчит «фильтр масл».
3. **Парсер харвестера** (`~/china_parts_harvest.py`, бэкап `*.bak-namefix`): `name` теперь из `og:title` (обрезка « – купить…»), а не из битого `"product"` regex. Остаток 4683 URL дозапущен в фоне (`~/china_tail.out`) — получит чистые кириллические имена с «ь».
**Проверено живьём (deployed):** Chery Tiggo 7 Pro колодки=6 OE, Tiggo 4 диски=6, Geely Coolray колодки=6, Geely Emgrand возд.фильтр=6, Chery аморт=6, Haval Jolion возд.фильтр=3/салон=6. Haval Jolion масл.фильтр=0 — **дыра данных** (нет масляного у модели), не баг. API рестартнут, healthz 200. ⚠️ Категория в china-БД по-прежнему мусор («Блок ABS») — НЕ использовать, матчить по name.
