Merge pull request 'refactor(tradein/admin): debug newbuilding endpoints на kit + config=, fix stray await (#2397 Part D4)' (#2414) from refactor/tradein-partD4-admin-newbuilding-kit into main
Some checks failed
Deploy Trade-In / test (push) Blocked by required conditions
Deploy Trade-In / build-backend (push) Blocked by required conditions
Deploy Trade-In / build-frontend (push) Blocked by required conditions
Deploy Trade-In / build-browser (push) Blocked by required conditions
Deploy Trade-In / deploy (push) Blocked by required conditions
Deploy Trade-In / changes (push) Has been cancelled
Some checks failed
Deploy Trade-In / test (push) Blocked by required conditions
Deploy Trade-In / build-backend (push) Blocked by required conditions
Deploy Trade-In / build-frontend (push) Blocked by required conditions
Deploy Trade-In / build-browser (push) Blocked by required conditions
Deploy Trade-In / deploy (push) Blocked by required conditions
Deploy Trade-In / changes (push) Has been cancelled
This commit is contained in:
commit
00a4dca5c0
1 changed files with 16 additions and 15 deletions
|
|
@ -19,15 +19,13 @@ from pydantic import BaseModel, Field, field_validator
|
||||||
|
|
||||||
# scraper_kit-миграция (#2305, Group A): debug run-parser роуты этого файла переключены
|
# scraper_kit-миграция (#2305, Group A): debug run-parser роуты этого файла переключены
|
||||||
# на scraper_kit.providers.* эквиваленты (парность доказана tests/scrapers/parity — см.
|
# на scraper_kit.providers.* эквиваленты (парность доказана tests/scrapers/parity — см.
|
||||||
# vault Scraper_Kit_Legacy_Dependency_Audit_0703). ИСКЛЮЧЕНИЯ (остаются на legacy,
|
# vault Scraper_Kit_Legacy_Dependency_Audit_0703). YandexNewbuildingScraper.fetch_jk и
|
||||||
# намеренно НЕ мигрированы): YandexNewbuildingScraper.fetch_jk и cian_newbuilding
|
# cian_newbuilding.fetch_newbuilding были временно исключены — их kit-эквиваленты
|
||||||
# .fetch_newbuilding — их kit-эквиваленты (providers/yandex/newbuilding.py,
|
# (providers/yandex/newbuilding.py, providers/cian/newbuilding.py) строили
|
||||||
# providers/cian/newbuilding.py) внутри себя строят BrowserFetcher(source=...) БЕЗ
|
# BrowserFetcher(source=...) без обязательного kwarg'а endpoint → TypeError на любом
|
||||||
# обязательного kwarg'а endpoint → TypeError / silently-swallowed exception при любом
|
# вызове. Исправлено в #2322 (endpoint пробрасывается через ScraperConfig,
|
||||||
# вызове, независимо от DI на стороне caller'а. Это баг в scraper_kit provider-коде
|
# config=RealScraperConfig() передаётся явно) — оба debug-роута этого файла
|
||||||
# (endpoint не прокинут через config, в отличие от SERP-классов и BaseScraper.__aenter__
|
# (#2397 Part D4) теперь тоже на kit.
|
||||||
# соседних провайдеров) — вне scope этой задачи (см. "только consume, не трогать
|
|
||||||
# scraper_kit provider-логику"), фиксируем как follow-up.
|
|
||||||
#
|
#
|
||||||
# scraper_kit-миграция (#2397 slice A, эпик #2277): 5 debug city-sweep/full-load
|
# scraper_kit-миграция (#2397 slice A, эпик #2277): 5 debug city-sweep/full-load
|
||||||
# роутов (avito-city-sweep, cian-city-sweep, cian-full-load, yandex-city-sweep,
|
# роутов (avito-city-sweep, cian-city-sweep, cian-full-load, yandex-city-sweep,
|
||||||
|
|
@ -61,6 +59,7 @@ from scraper_kit.providers.avito.imv import (
|
||||||
from scraper_kit.providers.avito.serp import AvitoScraper
|
from scraper_kit.providers.avito.serp import AvitoScraper
|
||||||
from scraper_kit.providers.cian.serp import CianScraper
|
from scraper_kit.providers.cian.serp import CianScraper
|
||||||
from scraper_kit.providers.yandex.detail import YandexDetailScraper
|
from scraper_kit.providers.yandex.detail import YandexDetailScraper
|
||||||
|
from scraper_kit.providers.yandex.newbuilding import YandexNewbuildingScraper
|
||||||
from scraper_kit.providers.yandex.serp import YandexRealtyScraper
|
from scraper_kit.providers.yandex.serp import YandexRealtyScraper
|
||||||
from scraper_kit.providers.yandex.valuation import YandexValuationScraper
|
from scraper_kit.providers.yandex.valuation import YandexValuationScraper
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
|
|
@ -80,7 +79,6 @@ from app.services.scraper_adapters import (
|
||||||
RealScraperConfig,
|
RealScraperConfig,
|
||||||
)
|
)
|
||||||
from app.services.scraper_settings import get_scraper_delay, invalidate_cache
|
from app.services.scraper_settings import get_scraper_delay, invalidate_cache
|
||||||
from app.services.scrapers.yandex_newbuilding import YandexNewbuildingScraper
|
|
||||||
from app.tasks.avito_detail_backfill import run_avito_detail_backfill
|
from app.tasks.avito_detail_backfill import run_avito_detail_backfill
|
||||||
from app.tasks.geocode_missing import GeocodeBackfillResult, geocode_missing_listings
|
from app.tasks.geocode_missing import GeocodeBackfillResult, geocode_missing_listings
|
||||||
|
|
||||||
|
|
@ -1542,8 +1540,9 @@ async def scrape_yandex_newbuilding(
|
||||||
|
|
||||||
URL: /{city}/kupit/novostrojka/<slug>-<id>/
|
URL: /{city}/kupit/novostrojka/<slug>-<id>/
|
||||||
"""
|
"""
|
||||||
# fetch_jk использует внутренний BrowserFetcher, httpx-клиент BaseScraper не нужен
|
# fetch_jk использует внутренний BrowserFetcher, httpx-клиент BaseScraper не нужен.
|
||||||
scraper = YandexNewbuildingScraper()
|
# config= обязателен (#2322 fix) — иначе BrowserFetcher строится без endpoint=.
|
||||||
|
scraper = YandexNewbuildingScraper(config=RealScraperConfig())
|
||||||
result = await scraper.fetch_jk(jk_slug=slug, jk_id=id, city=city)
|
result = await scraper.fetch_jk(jk_slug=slug, jk_id=id, city=city)
|
||||||
if result is None:
|
if result is None:
|
||||||
raise HTTPException(404, f"Could not parse Yandex JK: {slug}-{id} in {city}")
|
raise HTTPException(404, f"Could not parse Yandex JK: {slug}-{id} in {city}")
|
||||||
|
|
@ -1756,18 +1755,20 @@ async def scrape_cian_newbuilding(
|
||||||
Without it → debug-only (no DB write).
|
Without it → debug-only (no DB write).
|
||||||
"""
|
"""
|
||||||
_assert_allowed_url(zhk_url)
|
_assert_allowed_url(zhk_url)
|
||||||
from app.services.scrapers.cian_newbuilding import (
|
from scraper_kit.providers.cian.newbuilding import (
|
||||||
fetch_newbuilding,
|
fetch_newbuilding,
|
||||||
save_newbuilding_enrichment,
|
save_newbuilding_enrichment,
|
||||||
)
|
)
|
||||||
|
|
||||||
enrichment = await fetch_newbuilding(zhk_url)
|
enrichment = await fetch_newbuilding(zhk_url, config=RealScraperConfig())
|
||||||
if enrichment is None:
|
if enrichment is None:
|
||||||
raise HTTPException(404, f"Could not parse Cian newbuilding page: {zhk_url}")
|
raise HTTPException(404, f"Could not parse Cian newbuilding page: {zhk_url}")
|
||||||
|
|
||||||
saved = False
|
saved = False
|
||||||
if house_id is not None:
|
if house_id is not None:
|
||||||
await save_newbuilding_enrichment(db, house_id, enrichment)
|
# save_newbuilding_enrichment — sync (def, returns None); await на sync-функции
|
||||||
|
# раньше поднимал TypeError на любом вызове с house_id.
|
||||||
|
save_newbuilding_enrichment(db, house_id, enrichment)
|
||||||
saved = True
|
saved = True
|
||||||
|
|
||||||
return CianNewbuildingTriggerResp(
|
return CianNewbuildingTriggerResp(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue