gendesign/tradein-mvp/packages/scraper-kit/src/scraper_kit
bot-backend 0a4e126b30
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 2m28s
fix(tradein/scraper): проставлять город объявления из контекста развёртки (#2594)
Скрапер знает город в момент сбора (city_slug из CITY_LOCATIONS/CITY_ANCHORS,
scraper_kit.orchestration.pipeline), но раньше нигде его не записывал. Провайдеры
(avito/cian) часто отдают адрес БЕЗ города в тексте ("ул. Победы, 30" вместо
"Нижний Тагил, ул. Победы, 30" — cian даже явно вырезает location-часть перед
записью, providers/cian/serp.py _format_address skip_types={"location",...}).
Без города такой адрес при геокодинге считался "город не назван" и коллизировал
с одноимённой екатеринбургской улицей (Ленина/Победы/Тенистая — сотни совпадений
в ЕКБ-реестрах) → объявление получало координаты Екатеринбурга.

Fix: отдельная колонка listings.city (196_listings_city.sql), проставляется из
sweep-контекста через save_listings(..., city=...) — НЕ парсингом/дописыванием
в address. Раздельная колонка не портит исходный текст адреса: downstream
text-парсеры (geocoder._parse_street_house/_names_non_ekb_city, estimator
house-matching) продолжают работать на исходном сыром тексте неизменёнными —
дописывание города в address ломало бы bare-form адреса без street-маркера
("Дружинина, 33" без "ул.") в этих же парсерах.

Симметрия: EKB-варианты city-sweep функций (city_slug=None) тоже получают
city="Екатеринбург" — resolve_city_name(None) даёт тот же ЕКБ-дефолт, что и
get_city_location/get_city_anchors. Проставлено во всех продовых write-путях:
run_avito_city_sweep/run_yandex_city_sweep/run_cian_city_sweep (city_slug-aware),
run_avito_newbuilding_sweep/run_cian_full_load/run_yandex_full_load/
run_avito_full_load (подтверждённо EKB-only по докстрингам), run_domclick_city_sweep
(EKB city_id, oblast B2 ещё не wired — честный None для неизвестного city_id).

Scope: только write-path для НОВЫХ листингов. Бэкфилл накопленных строк и
консультация city в geocode_missing_listings/backfill_coords_from_geoportal
(gate там пока text-only, _names_non_ekb_city) — geocoder.py намеренно не
тронут (#2582/#2580) — отдельные follow-up задачи.
2026-07-31 22:14:47 +03:00
..
orchestration fix(tradein/scraper): проставлять город объявления из контекста развёртки (#2594) 2026-07-31 22:14:47 +03:00
pricing refactor(scraper-kit): unify price bisection engine across providers + dedup (#2134) 2026-07-02 16:41:04 +00:00
providers fix(tradein/scrapers): детекция дрейфа разметки вместо тихой пустоты (#2535) 2026-07-26 22:33:54 +00:00
__init__.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00
avito_exceptions.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00
base.py fix(tradein/scraper): проставлять город объявления из контекста развёртки (#2594) 2026-07-31 22:14:47 +03:00
browser_fetcher.py feat(tradein/domclick): cookie-injection MVP для обхода QRATOR-блока (#2000) (#2433) 2026-07-04 17:49:40 +00:00
cian_state_parser.py fix(tradein/cian): extract_all_states — discover new .concat() format, not just legacy .push() (#2438) 2026-07-04 21:03:32 +00:00
contracts.py feat(proxy-pool): P4 — browser dynamic pool-proxy (acquire→/fetch→relaunch) + orchestration wiring, ship-dark (#2164) 2026-07-02 19:20:29 +00:00
domclick_exceptions.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00
geo.py feat(tradein/scraper): per-city sweep capability для 5 городов области (schedules disabled) 2026-07-12 20:06:46 +03:00
house_type_normalizer.py feat(scraper-kit): copy cian providers with protocol injection, strangler (#2133 cian) 2026-07-02 16:11:31 +00:00
offer_price_history.py fix(tradein/scraper-kit): клампить diff_percent перед INSERT offer_price_history (#2404) 2026-07-04 10:44:26 +00:00
price_brackets.py feat(tradein/scraper): per-city sweep capability для 5 городов области (schedules disabled) 2026-07-12 20:06:46 +03:00
py.typed chore(scraper-kit): scaffold internal package + uv workspace, build-safe (#2128) 2026-07-02 14:06:07 +00:00
repair_state_normalizer.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00
snapshot_writer.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00
yandex_helpers.py feat(scraper-kit): copy core layer (base/save_listings/transport) with protocol injection, strangler (#2132) 2026-07-02 15:43:15 +00:00