fix(porndoe): scrape przez proxy, bo tub blokuje IP serwerowni (10 dni bez nowych scen)

Watchdog zglaszal "tube:porndoecom (browse) bez nowych tresci (173h, prog 48h)" i
potraktowalem to jako szum razem z alertami dla tubow, ktore faktycznie przestaly
publikowac. Bledna ocena: porndoe to nasze czwarte co do wielkosci zrodlo (356 tys.
zrodel), a ostatnia nowa scena wpadla 2026-08-21.

Przyczyna: porndoe zaczal oddawac HTTP 403 na IP serwerowni. Scraper dostawal strone
bledu, znajdowal zero linkow i konczyl sie bez wyjatku, wiec z zewnatrz wygladalo to na
"tub sie wyczerpal", a nie na awarie. Ten sam ksztalt pomylki co przy porntrex, gdzie
cicha zmiana markupu ukryla 6479 scen.

Sprawdzone 2026-08-31: bez proxy 403 i 0 scen, przez Bright Data ISP proxy 200 i 31 scen
z pierwszej strony, z datami z 30 sierpnia, dlugosciami i obsada. Wzorzec i uzasadnienie
kosztowe jak przy superporn: ISP proxy jest ryczaltowe, wiec deep-crawl nie kosztuje
wiecej, a przez proxy leci sam HTML, nigdy strumien.

Bez skonfigurowanego proxy `crawl_page` zwraca pusta liste zamiast dobijac sie o 403.
This commit is contained in:
goon-foss 2026-08-31 09:46:31 +02:00
parent dd87f646cc
commit 5e41285d44

View file

@ -34,6 +34,7 @@ import logging
import re import re
from datetime import date, datetime from datetime import date, datetime
from app.config import get_settings
from app.connectors.base import ( from app.connectors.base import (
RawFingerprint, RawFingerprint,
RawPerformer, RawPerformer,
@ -144,6 +145,24 @@ def _extract_video_object(html: str) -> dict | None:
class PornDoeScraper(BaseBrowseScraper): class PornDoeScraper(BaseBrowseScraper):
sitetag = "porndoecom" sitetag = "porndoecom"
def __init__(self) -> None:
super().__init__()
# Bright Data ISP proxy, bo porndoe zaczal oddawac 403 na IP serwerowni.
# Objawialo sie to jako "tub sie wyczerpal", a nie jako blad: ostatnia nowa
# scena wpadla 2026-08-21, watchdog krzyczal 173 h, a scraper po cichu dostawal
# 403 i zero linkow. Sprawdzone 2026-08-31: bez proxy 403 i 0 scen, przez proxy
# 200 i 31 scen z pierwszej strony.
self._proxy = get_settings().brightdata_proxy_url
if not self._proxy:
log.warning("porndoe: BRIGHTDATA_PROXY_URL nieustawione, scraper wylaczony")
def crawl_page(self, page: int):
# Bez proxy nie ma po co uderzac (gwarantowane 403). Pusta lista = "wyczerpany",
# dzieki czemu deep-crawl nie ponawia w kolko.
if not self._proxy:
return []
return super().crawl_page(page)
def _listing_url(self, page: int) -> str: def _listing_url(self, page: int) -> str:
if page <= 1: if page <= 1:
return f"{_BASE}/videos/most-recent" return f"{_BASE}/videos/most-recent"