Merge pull request 'fix(browser): camoufox reads AVITO_PROXY_URL → real avito data not soft-block stub (#905)' (#911) from fix/905-browser-proxy-env into main
All checks were successful
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / test (push) Has been skipped
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / build-browser (push) Successful in 2m4s
Deploy Trade-In / deploy (push) Successful in 1m8s
All checks were successful
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / test (push) Has been skipped
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / build-browser (push) Successful in 2m4s
Deploy Trade-In / deploy (push) Successful in 1m8s
Reviewed-on: #911
This commit is contained in:
commit
c43a25ef42
1 changed files with 13 additions and 4 deletions
|
|
@ -18,7 +18,8 @@ WS-сервер) несовместим с современными версия
|
||||||
BROWSER_RECYCLE_PAGES — страниц в одном сеансе браузера до перезапуска (default: 15)
|
BROWSER_RECYCLE_PAGES — страниц в одном сеансе браузера до перезапуска (default: 15)
|
||||||
BROWSER_NAV_TIMEOUT_MS — таймаут page.goto в мс (default: 60000)
|
BROWSER_NAV_TIMEOUT_MS — таймаут page.goto в мс (default: 60000)
|
||||||
BROWSER_WAIT_MS — ожидание после DOMContentLoaded в мс (default: 2500)
|
BROWSER_WAIT_MS — ожидание после DOMContentLoaded в мс (default: 2500)
|
||||||
SCRAPER_PROXY_URL — прокси URL формата ``http://user:pass@host:port`` (опционально)
|
AVITO_PROXY_URL — прокси ``http://user:pass@host:port`` (mobileproxy, #623);
|
||||||
|
SCRAPER_PROXY_URL — generic-fallback. Без него — soft-block.
|
||||||
|
|
||||||
Эндпоинт /fetch доступен из Docker-сети как ``http://tradein-browser:3000/fetch``.
|
Эндпоинт /fetch доступен из Docker-сети как ``http://tradein-browser:3000/fetch``.
|
||||||
"""
|
"""
|
||||||
|
|
@ -39,7 +40,13 @@ BROWSER_PORT: int = int(os.environ.get("BROWSER_PORT", "3000"))
|
||||||
BROWSER_RECYCLE_PAGES: int = int(os.environ.get("BROWSER_RECYCLE_PAGES", "15"))
|
BROWSER_RECYCLE_PAGES: int = int(os.environ.get("BROWSER_RECYCLE_PAGES", "15"))
|
||||||
BROWSER_NAV_TIMEOUT_MS: int = int(os.environ.get("BROWSER_NAV_TIMEOUT_MS", "60000"))
|
BROWSER_NAV_TIMEOUT_MS: int = int(os.environ.get("BROWSER_NAV_TIMEOUT_MS", "60000"))
|
||||||
BROWSER_WAIT_MS: int = int(os.environ.get("BROWSER_WAIT_MS", "2500"))
|
BROWSER_WAIT_MS: int = int(os.environ.get("BROWSER_WAIT_MS", "2500"))
|
||||||
SCRAPER_PROXY_URL: str | None = os.environ.get("SCRAPER_PROXY_URL")
|
# Прокси: основной источник — AVITO_PROXY_URL (mobileproxy, #623, лежит в
|
||||||
|
# backend/.env.runtime, тот же что у curl_cffi-avito). SCRAPER_PROXY_URL —
|
||||||
|
# опциональный generic-fallback на будущее (cian/yandex). Без прокси camoufox
|
||||||
|
# фетчит с датацентр-IP → avito отдаёт soft-block заглушку.
|
||||||
|
SCRAPER_PROXY_URL: str | None = os.environ.get("AVITO_PROXY_URL") or os.environ.get(
|
||||||
|
"SCRAPER_PROXY_URL"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_proxy(proxy_url: str | None) -> dict[str, str] | None:
|
def _parse_proxy(proxy_url: str | None) -> dict[str, str] | None:
|
||||||
|
|
@ -80,7 +87,7 @@ async def _launch_browser() -> None:
|
||||||
"""Запускает AsyncCamoufox и сохраняет browser + CM в модульных переменных."""
|
"""Запускает AsyncCamoufox и сохраняет browser + CM в модульных переменных."""
|
||||||
global _browser, _browser_cm, _page_counter
|
global _browser, _browser_cm, _page_counter
|
||||||
|
|
||||||
from camoufox.async_api import AsyncCamoufox # noqa: PLC0415
|
from camoufox.async_api import AsyncCamoufox
|
||||||
|
|
||||||
proxy = _parse_proxy(SCRAPER_PROXY_URL)
|
proxy = _parse_proxy(SCRAPER_PROXY_URL)
|
||||||
kwargs: dict[str, object] = {
|
kwargs: dict[str, object] = {
|
||||||
|
|
@ -173,7 +180,9 @@ async def fetch_handler(request: web.Request) -> web.Response:
|
||||||
try:
|
try:
|
||||||
html = await _do_fetch(url)
|
html = await _do_fetch(url)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error("tradein-browser: fetch error url=%r: %s: %s", url, type(exc).__name__, exc)
|
logger.error(
|
||||||
|
"tradein-browser: fetch error url=%r: %s: %s", url, type(exc).__name__, exc
|
||||||
|
)
|
||||||
return web.json_response({"error": f"{type(exc).__name__}: {exc}"}, status=500)
|
return web.json_response({"error": f"{type(exc).__name__}: {exc}"}, status=500)
|
||||||
|
|
||||||
return web.json_response({"html": html})
|
return web.json_response({"html": html})
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue