fix resume
This commit is contained in:
@@ -45,6 +45,7 @@ _PAGE_COLLECT_TIMEOUT_S = 90
|
|||||||
_PAGE_NEXT_TIMEOUT_S = 60
|
_PAGE_NEXT_TIMEOUT_S = 60
|
||||||
# Ротация контекста выключена по умолчанию.
|
# Ротация контекста выключена по умолчанию.
|
||||||
_CONTEXT_ROTATE_EVERY_PAGES = int(os.environ.get("IAAI_CONTEXT_ROTATE_EVERY_PAGES", "0") or 0)
|
_CONTEXT_ROTATE_EVERY_PAGES = int(os.environ.get("IAAI_CONTEXT_ROTATE_EVERY_PAGES", "0") or 0)
|
||||||
|
_MAX_LISTING_RECOVERY_ATTEMPTS_PER_SEGMENT = int(os.environ.get("IAAI_MAX_LISTING_RECOVERY_ATTEMPTS_PER_SEGMENT", "3") or 3)
|
||||||
_SMALL_SEGMENT_SUSPICIOUS_PAGINATION_MAX_LINKS = 120
|
_SMALL_SEGMENT_SUSPICIOUS_PAGINATION_MAX_LINKS = 120
|
||||||
_SMALL_SEGMENT_SUSPICIOUS_PAGINATION_MAX_PAGE = 2
|
_SMALL_SEGMENT_SUSPICIOUS_PAGINATION_MAX_PAGE = 2
|
||||||
|
|
||||||
@@ -594,6 +595,7 @@ class IAAIScraper:
|
|||||||
failures: list[dict[str, str]] = []
|
failures: list[dict[str, str]] = []
|
||||||
early_stopped = False
|
early_stopped = False
|
||||||
truncated_by_time_budget = False
|
truncated_by_time_budget = False
|
||||||
|
listing_recovery_attempts = 0
|
||||||
|
|
||||||
known_origin_ids: set[str] | None = None
|
known_origin_ids: set[str] | None = None
|
||||||
threshold = self.settings.listing.early_stop_threshold
|
threshold = self.settings.listing.early_stop_threshold
|
||||||
@@ -725,6 +727,21 @@ class IAAIScraper:
|
|||||||
failures.append({"vehicle_url": f"batch_{batch_start}", "error": str(batch_exc)})
|
failures.append({"vehicle_url": f"batch_{batch_start}", "error": str(batch_exc)})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def _consume_listing_recovery_attempt(*, page_number: int, reason: str) -> None:
|
||||||
|
nonlocal listing_recovery_attempts
|
||||||
|
listing_recovery_attempts += 1
|
||||||
|
logger.warning(
|
||||||
|
"Listing recovery attempt %d/%d at page %d (%s)",
|
||||||
|
listing_recovery_attempts,
|
||||||
|
_MAX_LISTING_RECOVERY_ATTEMPTS_PER_SEGMENT,
|
||||||
|
page_number,
|
||||||
|
reason,
|
||||||
|
)
|
||||||
|
if listing_recovery_attempts > _MAX_LISTING_RECOVERY_ATTEMPTS_PER_SEGMENT:
|
||||||
|
raise ListingResumeError(
|
||||||
|
f"Listing recovery exhausted at page {page_number}: {reason}"
|
||||||
|
)
|
||||||
|
|
||||||
page = None
|
page = None
|
||||||
try:
|
try:
|
||||||
page, applied_filters = self._open_listing_for_stream(
|
page, applied_filters = self._open_listing_for_stream(
|
||||||
@@ -763,6 +780,10 @@ class IAAIScraper:
|
|||||||
pass
|
pass
|
||||||
page = None
|
page = None
|
||||||
try:
|
try:
|
||||||
|
_consume_listing_recovery_attempt(
|
||||||
|
page_number=page_number,
|
||||||
|
reason="context_rotation",
|
||||||
|
)
|
||||||
page, _ = self._reopen_listing_and_resume(
|
page, _ = self._reopen_listing_and_resume(
|
||||||
target_page_number=page_number,
|
target_page_number=page_number,
|
||||||
make=make,
|
make=make,
|
||||||
@@ -794,6 +815,10 @@ class IAAIScraper:
|
|||||||
pass
|
pass
|
||||||
page = None
|
page = None
|
||||||
try:
|
try:
|
||||||
|
_consume_listing_recovery_attempt(
|
||||||
|
page_number=page_number,
|
||||||
|
reason=f"collect_failed:{type(op_exc).__name__}",
|
||||||
|
)
|
||||||
page, _ = self._reopen_listing_and_resume(
|
page, _ = self._reopen_listing_and_resume(
|
||||||
target_page_number=page_number,
|
target_page_number=page_number,
|
||||||
make=make,
|
make=make,
|
||||||
@@ -839,6 +864,10 @@ class IAAIScraper:
|
|||||||
logger.warning("Page %d still empty after retry — reopening listing and resuming", page_number)
|
logger.warning("Page %d still empty after retry — reopening listing and resuming", page_number)
|
||||||
page.close()
|
page.close()
|
||||||
try:
|
try:
|
||||||
|
_consume_listing_recovery_attempt(
|
||||||
|
page_number=page_number,
|
||||||
|
reason="empty_page_after_retry",
|
||||||
|
)
|
||||||
page, _ = self._reopen_listing_and_resume(
|
page, _ = self._reopen_listing_and_resume(
|
||||||
target_page_number=page_number,
|
target_page_number=page_number,
|
||||||
make=make,
|
make=make,
|
||||||
@@ -1069,6 +1098,10 @@ class IAAIScraper:
|
|||||||
pass
|
pass
|
||||||
page = None
|
page = None
|
||||||
try:
|
try:
|
||||||
|
_consume_listing_recovery_attempt(
|
||||||
|
page_number=page_number + 1,
|
||||||
|
reason=f"next_page_failed:{type(nav_exc).__name__}",
|
||||||
|
)
|
||||||
page, _ = self._reopen_listing_and_resume(
|
page, _ = self._reopen_listing_and_resume(
|
||||||
target_page_number=page_number + 1,
|
target_page_number=page_number + 1,
|
||||||
make=make,
|
make=make,
|
||||||
|
|||||||
Reference in New Issue
Block a user