
    4i                     ^    S SK r S SKrS SKJr  / SQrS\S\4S jrS\S\4S jr	S\S\4S	 jr
g)
    N)async_playwright)z--no-sandboxz--disable-dev-shm-usagez--disable-gpuz--single-processurlreturnc                   #    [        5        ISh  vN nUR                  R                  S[        S9I Sh  vN nUR	                  5       I Sh  vN n UR                  U SSS9I Sh  vN   UR                  S5      I Sh  vN =(       d    0  UR                  5       I Sh  vN   sSSS5      ISh  vN   $  N N Nn NV N? N  N! [         aE  n[        SU 35        0 s SnAUR                  5       I Sh  vN    sSSS5      ISh  vN    $ SnAff = f! UR                  5       I Sh  vN    f = f! , ISh  vN  (       d  f       g= f7f)	zDExtrait window.__INITIAL_STATE__ d'une fiche individuelle mobile.de.NT)headlessargsnetworkidlei0u  )
wait_untiltimeoutzwindow.__INITIAL_STATE__z[Playwright] fiche erreur: )
r   chromiumlaunch_LAUNCH_ARGSnew_pagegotoevaluateclose	Exceptionprint)r   pbrowserpagees        /app/mobilede_playwright.pyextract_mobilede_urlr   
   s    !!Q

))4l)KK%%''	"))CM5)III'ABBHbH
 --/!! "!!K'IB
 " "  	/s34I--/!! "!!	 --/!! "!!s  EB:E"D8B<D8B>D8C)C *CCCD8#C$D8(E4C5E<D8>D8 CCD8E
DD!D"D&D89C<:D8?EDEDDD5.D1
/D55D88E>E?EEc                 8  #     SSK Jn  [        R                  R	                  SS5      nU(       a  UR                  S5      (       a  [        S5        / $ U" US9nUR                  U S/S	9n[        US5      (       a  UR                  OSnU(       d)  [        U[        5      (       a  UR	                  SS5      OSnU(       d  [        S
5        / $ [        U5      n[        S[        U5       S35        U$ ! [         a  n[        SU 35        / s SnA$ SnAff = f7f)u   Scrape une page de résultats mobile.de via Firecrawl (Playwright bloqué anti-bot).
Retourne une liste de dicts {title, prix, km, annee, url, photo, devise}.r   )	FirecrawlFIRECRAWL_API_KEY 	REMPLACERu-   [Firecrawl] FIRECRAWL_API_KEY non configurée)api_keymarkdown)formatsz[Firecrawl] Markdown videu   [Firecrawl search] ✅ u    annonces parséesu   [Firecrawl search] ❌ Erreur: N)	firecrawlr   osenvironget
startswithr   scrapehasattrr!   
isinstancedict_parse_mobilede_markdownlenr   )r   r   r    fcresultmdlistingsr   s           r   search_mobileder2      s     '**..!4b9',,[99ABIw'35 '
 ; ;V__/9&$/G/GJ+RB-.I+B/'H6HIJ /s34	sN   DAC3 DA9C3 D$C3 2D3
D=DDDDDr0   c                    / n[        5       n[        R                  " S5      nUR                  U 5       Vs/ s H#  oDR	                  S5      UR                  5       4PM%     nn[        U5       GH`  u  nu  pxXr;   a  M  UR                  U5        US:  a  XVS-
     S   S-   OSn	[        XS-
  5      n
X
U nSU 3nSn[        R                  " SU5       H]  n[        R                  " S	SU5      R                  5       n[        R                  " S
SU5      nU(       d  MJ  [        U5      S:  d  M[  Un  O   U(       dM  [        R                  " SU5      nU(       a/  UR	                  S5      R                  SS5      R                  5       n[        R                  " SU5      nU(       a*  [        UR	                  S5      R                  SS5      5      OSn[        R                  " SU5      nU(       a  [        UR	                  S5      5      OSn[        R                  " SU5      nU(       a*  [        UR	                  S5      R                  SS5      5      OSn[        R                  " SU5      nU(       a!  UR	                  S5      R                  SS5      OSnU(       d
  U(       d  GM;  Ub	  US:  d  GMG  UR!                  UUUUUUSS.5        GMc     U$ s  snf )ux   Parse le markdown Firecrawl de mobile.de.
Stratégie : découper par URL d'annonce et remonter dans le bloc précédent.zE\(https://suchen\.mobile\.de/fahrzeuge/details\.html\?id=(\d+)[^)]*\)   r   d   i  z3https://suchen.mobile.de/fahrzeuge/details.html?id=r   z\*\*([^*]{4,})\*\*uF   ^(Gesponsert|NEU(?=[A-ZÄÖÜ])|Unfallfrei|Reparierter Unfallschaden)+u   ([a-zäöü])([A-ZÄÖÜ0-9])z\1 \2   z+!\[([^\]]{4,})\]\(https://img\.classistaticz\*u   ([\d]{1,3}(?:\.[\d]{3})*)\s*€.NzEZ\s+\d{2}/(\d{4})z ([\d]{1,3}(?:\.[\d]{3})*)\s*km\bz5(https://img\.classistatic\.de/[^\s)\]]+rule=mo-\d+w)zmo-160wzmo-640wi  EUR)titleprixkmanneer   photodevise)setrecompilefinditergroupstart	enumerateaddmaxfindallsubstripr-   searchreplaceintappend)r0   r1   seen_idsurl_patternm	positionsi
listing_idurl_posprev_endblock_startblockr   r9   boldcleanedalt_mprice_mr:   ez_mr<   km_mr;   photo_mr=   s                            r   r,   r,   6   s    HuH **PK 3>2F2Fr2JK2JQ''!*aggi(2JIK$-i$8  J!Z  12A9U#A&,1(dN3w'CJ<P JJ4e<DffYD eg 
 ff=xQGw3w<!+ = IILeTEA..ub9??A ))>F9@s7==#++C45d yy.6&*DJJqM" yy<eD48SA&&sB/0d ))De
 CJa ((I>t TTOO e %9x O} Ls   *K)r$   r@   playwright.async_apir   r   strr+   r   listr2   r,        r   <module>re      sQ    	 	 1
"C "D "&s t 2I I Ird   