fix(scrape-kn): real documents endpoints (5x) + skip obj_checks + sem 3→8 #325
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#325
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/domrf-real-doc-endpoints-skip-checks-sem6"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug — run #19 (release
c80d79e) showed 2 endpoint placeholders fail 404kn_scrape_failuresgroup_by endpoint:documents/сервисы/api/object/{id}/documentsobj_checks/сервисы/api/object/{id}/checksPer Playwright network inspection (
наш.дом.рф/.../объект/65136):/documents(plural) — не существует, документы это 5 разных endpoints/checks— не существует, 6 chekboxов "Проверено" inline в основном payloadFix — 3 hunks
1. Documents → 5 параллельных endpoints
Каждый —
_fetch_doc_*_safewrapper. В parallelasyncio.gather— 5 corutines вместо 1. После gather — merge всех результатов черезextract_documents+ единыйupsert_documentsper obj.2. obj_checks — skip (commented + TODO)
/checksendpoint не существует. Закомментил_fetch_obj_checks_safeвызов + importsextract_obj_checks/upsert_obj_checks. Файлservices/scrapers/obj_checks.pyоставлен для future re-wire когда найдём реальный источник (вероятно inline в main object payload).3. BrowserSession
Semaphore(3) → Semaphore(8)Концurrency limit поднят с 3 до 8 для intra-object
asyncio.gather(12 endpoints/obj после fix). Run #19 показал что 3 одновременных request — слишком мало, gather'у нечего распараллеливать.Ожидаемый speedup: ~2.5× относительно run #19 (4.4 sec/obj → ~1.8 sec/obj) → ~50 мин на 1532 obj vs 3.5 ч в run #14.
Acceptance после merge + deploy
kn_scrape_failuresдля нового run: 0 documents 404, 0 obj_checks 404 (закомментирован)domrf_kn_documentscount growing (cumulative across 5 doc types)Risk
Semaphore(8): 8 параллельных fetch на dom.рф из одной browser session. Rate-limit dom.рф не задокументирован. Если 429 — снизим обратно до 6.Tech debt
obj_checks endpoint URL — отдельный PR после investigation основного payload объекта. 6 chekboxов вероятно поля типа
has_problems,documents_complete,bankruptcy_flagв bulkkn/objectresponse.Deep Code Review — verdict APPROVE
Status: APPROVE
Files: 2 (P1:
backend/app/services/scrapers/domrf_kn.py+128/-24,backend/app/services/scrapers/stealth.py+1/-1)Head SHA:
2aa33e0eMergeable: true
Hunk 1 — Documents → 5 endpoints
_fetch_doc_endpointhelper DRYs the 5 wrappers; each correctly returns(kind_tag, full_url, items_or_exception)and 404/JSON failure routes through_classify_and_logvia the existing exception path._fetch_doc_endpointhandles 3 payload shapes (list,dict.data=list,dict.datamissing or wrong type →[]) — strictly safer than oldfetch_documentswhich.get("data") or []would crash if payload wereNone(httpx returns dict, but defensive form is correct).all_docs.extend(extract_documents(doc_items or []))is correct becauseextract_documentsis pure-per-payload (no obj_id baked in — that's passed toupsert_documents).domrf_kn_documents (UNIQUE obj_id, doc_type, doc_num, file_url)— verified atdata/sql/112_22i_domrf_documents.sql:18.doc_typediscriminator is payload-derived (docTypeName→ canonical via_DOC_TYPE_MAP), NOT endpoint-derived. This means same doc_type can come from different endpoints — UNIQUE still holds becausefile_urlis part of the key.upsert_documentsafter the loop is correct and efficient (one transaction withbegin_nestedSAVEPOINT per row).Hunk 2 — obj_checks skip
extract_obj_checks/upsert_obj_checkson the PR branch (onlyobj_checks.pymodule retained for future re-wire — good).extras_counts["checks_rows"]stays initialized at 0 and is never incremented. Log lines still printchecks=0— cosmetic only, not worth touching in this PR.Hunk 3 — Semaphore 3 → 8
stealth.py:107, per-instance attribute (not module-level) — correct.BrowserContextshares the connection pool, low WAF risk. Fallback plan (drop to 6 on 429) is documented.Convention checks
psycopg2imports.requests, allhttpxthrough existingBrowserSession.print(), onlylogger.*.:x::typeSQL casts (extract_documentsuses pure Python).text(...)+:params).Speedup math sanity
Semaphore(8)→ 2 batches (~8 + ~4) per obj → theoretical ~1.5×.Pre-flight
fix/domrf-real-doc-endpoints-skip-checks-sem6, not main.--no-verify/--force/--amendindicators.mergeable=true, no conflicts.Risk / reversibility
Merging via squash.