
    _Pi>4                     P   d Z ddlZddlZddlmZ ddlZ G d d      Zedk(  r ed      Z	 ej                          ej                         s* ed	        ed
        ed       ej                  d       dZej                  e      Zerd ed	        ed        eed           ed        eed   red   dd dz   nd        ed        eed   d      D ]  \  ZZ ee de          ed       ej)                          yy#  ed       ej)                          w xY w)uc   
Scraper do Mercado Livre com autenticação persistente
Mantém login ativo para evitar bloqueios
    N)sync_playwrightc                   @    e Zd Zd
dZd ZddZd Zd Zd Zd Z	d Z
y	)MercadoLivreScraperc                 J    || _         || _        d| _        d| _        d| _        y)u   
        Inicializa o scraper
        
        Args:
            cookies_file: Arquivo para salvar/carregar cookies
            headless: True para rodar sem interface gráfica
        N)cookies_fileheadlessbrowsercontextpage)selfr   r   s      3/var/www/get-produtos-api/ml_scraper_autenticado.py__init__zMercadoLivreScraper.__init__   s(     ) 	    c                    t               j                         }|j                  j                  | j                  g d      | _        | j
                  j                  dddddd	      | _        t        j                  j                  | j                        rgt        d
| j                          t        | j                  d      5 }t        j                  |      }| j                  j!                  |       ddd       | j                  j#                         | _        | j$                  j'                  d       y# 1 sw Y   DxY w)z1Inicia o navegador e carrega cookies se existirem)z---disable-blink-features=AutomationControlledz--disable-dev-shm-usagez--no-sandbox)r   argszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36i  i8  )widthheightzpt-BRzAmerica/Sao_Paulo)
user_agentviewportlocaletimezone_idu   📂 Carregando cookies de rNzz
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            });
        )r   startchromiumlaunchr   r	   new_contextr
   ospathexistsr   printopenjsonloadadd_cookiesnew_pager   add_init_script)r   
playwrightfcookiess       r   iniciar_navegadorz%MercadoLivreScraper.iniciar_navegador   s   $&,,.
 "**11]] 2 
 ||// I#t4+	 0 
 77>>$++,/0A0A/BCDd''- 2))A,((12 LL))+	 			!! # 	2 2s   1D99Ec                     t        d       | j                  j                  d       t        d| d       t        d       t        d       t        j                  |       | j                          t        d       y)	u   
        Abre o navegador para você fazer login manualmente
        
        Args:
            tempo_espera: Tempo em segundos para fazer login (padrão: 60s)
        u/   🌐 Abrindo Mercado Livre para login manual... https://www.mercadolivre.com.br/u   
⏰ Você tem z' segundos para fazer login manualmente!u9   👉 Clique em 'Entre' e faça login com suas credenciaisuR   👉 Após login bem-sucedido, aguarde e os cookies serão salvos automaticamente
u@   ✅ Cookies salvos! Você não precisará fazer login novamente.N)r    r   gototimesleepsalvar_cookies)r   tempo_esperas     r   fazer_login_manualz&MercadoLivreScraper.fazer_login_manualB   sf     	?@		9: .UVWIJcd

<  	PQr   c                     t        d       | j                  j                  d       	 | j                  j                  dd       t	        j
                  d       | j                  j                  d|       | j                  j                  d       t	        j
                  d       | j                  j                  d	|       | j                  j                  d
       t        d       t	        j
                  d       | j                  j                  d      j                         dkD  rt        d       | j                          yt        d       y# t        $ r#}t        d|        t        d       Y d}~yd}~ww xY w)z
        Tenta fazer login automaticamente (pode precisar de ajustes nos seletores)
        
        Args:
            email: Seu email do Mercado Livre
            senha: Sua senha
        u   🌐 Acessando Mercado Livre...r,   z
text=Entrei  timeout   zinput[id="user_id"]zbutton:has-text("Continuar")zinput[id="password"]zbutton[type="submit"]u   ⏳ Aguardando login...   text=Minha contar   u    ✅ Login realizado com sucesso!Tu>   ⚠️ Login pode ter falha. Verifique captcha ou credenciais.Fu   ❌ Erro no login automático: u:   💡 Use fazer_login_manual() para fazer login manualmenteN)r    r   r-   clickr.   r/   filllocatorcountr0   	Exception)r   emailsenhaes       r   fazer_login_automaticoz*MercadoLivreScraper.fazer_login_automaticoV   s"    	/0		9:	IIOOL$O7JJqM IINN0%8IIOO:;JJqM IINN159IIOO34 +,JJqM yy  !34::<q@89##%VW 	3A378NO	s   DE E 	E=E88E=c                     | j                   j                         }t        | j                  d      5 }t	        j
                  ||d       ddd       t        d| j                          y# 1 sw Y   "xY w)u!   Salva os cookies da sessão atualwr6   )indentNu   💾 Cookies salvos em )r
   r)   r!   r   r"   dumpr    )r   r)   r(   s      r   r0   z"MercadoLivreScraper.salvar_cookies   sb    ,,&&($##S) 	,QIIgq+	,'(9(9':;<	, 	,s   A++A4c                 8   	 | j                   j                  dd       t        j                  d       | j                   j	                  d      j                         dkD  rt        d       yt        d	       y
# t        $ r}t        d|        Y d}~y
d}~ww xY w)u   Verifica se está logador,   i'  r4   r6   r8   r   u'   ✅ Sessão ativa - você está logado!Tu,   ❌ Não está logado. Faça login primeiro.Fu    ⚠️ Erro ao verificar login: N)r   r-   r.   r/   r;   r<   r    r=   )r   r@   s     r   verificar_loginz#MercadoLivreScraper.verificar_login   s    	IINN=uNMJJqM yy  !34::<q@?@DE 	4QC89	s   A)A8 ,A8 8	BBBc                 R
   t        d|        	 | j                  j                  |d       t        j                  d       d}	 | j                  j                  d      j                  j                         }d}	 | j                  j                  d       t        j                  d	       g d
}|D ]L  }| j                  j                  |      j                  }|j                         dkD  s<|j                         } n |sI| j                  j                  d      j                  }|j                         dkD  r|j                  d      }g }		 | j                  j                  d      j                         }
|
D ]L  }|j                  d      xs |j                  d      }|s*|j                  d      s<|	j                  |       N t        t         j#                  |	            }	g }	 | j                  j                  d       t        j                  d	       | j                  j                  d      j                         }|rt%        |      dk(  r)| j                  j                  d      j                         }|rt%        |      dk(  r+| j                  j                  d      j                         }|}|D ]  }	 |j                  d      j                  }|j                  d      j                  }|j                         dkD  rg|j                         dkD  rT|j                         j'                         }|j                         j'                         }|r|r|j                  ||d        t%        |      dk(  r| j                  j                  d      j                         }t)        dt%        |      d	      D ]q  }	 |dz   t%        |      k  r]||   j                         j'                         }||dz      j                         j'                         }|r|r|j                  ||d       s t        dt%        |              |||	||d}t        d t%        |	       d!t%        |       d"       |S #  t        d       Y xY w# t        $ r}t        d|        Y d}~Yd}~ww xY w# t        $ r}t        d|        Y d}~d}~ww xY w#  Y xY w#  Y #xY w# t        $ r}t        d|        Y d}~d}~ww xY w# t        $ r}t        d#|        Y d}~yd}~ww xY w)$z
        Extrai dados de um produto do Mercado Livre
        
        Args:
            url: URL do produto
            
        Returns:
            dict com titulo, descricao e imagens
        u   🔍 Extraindo dados de: i0u  r4      Nzh1.ui-pdp-titleu+   ⚠️ Não foi possível extrair o títulozwindow.scrollTo(0, 1000)r6   )zp.ui-pdp-description__contentzdiv.ui-pdp-description__contentzdiv.ui-pdp-descriptionzdiv[class*="description"]zp[class*="description"]r   zmeta[name="description"]contentu1   ⚠️ Não foi possível extrair a descrição: z(figure img.ui-pdp-gallery__figure__imagez	data-zoomsrchttpu    ⚠️ Erro ao extrair imagens: zwindow.scrollTo(0, 1500)ztable.andes-table trz-div.ui-pdp-container__row div.ui-pdp-specs trz0[class*="specs"] tr, [class*="specification"] trthtd)name
value_namezG[class*="spec"] [class*="label"], [class*="attribute"] [class*="label"]   u   📋 Atributos extraídos: u"   ⚠️ Erro ao extrair atributos: )titulo	descricaoimagens	atributosurlu   ✅ Dados extraídos: z
 imagens, z
 atributosu   ❌ Erro ao extrair dados: )r    r   r-   r.   r/   r;   first
inner_textevaluater<   get_attributer=   all
startswithappendlistdictfromkeyslenstriprange)r   rV   rR   rS   	seletoresseletor	desc_elem	desc_metar@   rT   imgsimgurl_imgrU   	spec_rows
spec_itemsrowrM   rN   nomevalor	spec_divsi	resultados                           r   extrair_dados_produtoz)MercadoLivreScraper.extrair_dados_produto   s    	)#/0H	IINN3N.JJqM FE**+<=CCNNP
 IO		""#=>

1	  ) G $		 1 1' : @ @I (1,$-$8$8$:		 ! $		 1 12L M S SI (1,$-$;$;I$F	 G>yy(()STXXZ 0C!//<X@Q@QRW@XG7#5#5f#=w/0 t}}W56 I:@		""#=>

1 !II--.DEIIK	 C	Na$7 $		 1 12a b f f hI C	Na$7!%!2!23e!f!j!j!lJ *I$ !C! [[.44 [[.4488:>bhhj1n#%==?#8#8#:D$&MMO$9$9$;E# ) 0 0,0272" !#!& y>Q& $		 1 12{ |  !A  !A  !CI"1c)na8 %% 1us9~5'0|'>'>'@'F'F'H(1!a%(8(C(C(E(K(K(M#'E$-$4$4046;6& %'% 3C	N3CDE !&"&I *3w<.
3y>BRR\]^yECD<  OI!MNNO&  >8<==>L! $%$  @:1#>??@  	/s34	s   4T 3Q4 8T ;A1R -AR T AR, #R, 51R, &T )CS! <B0S,AS! ?A.S-S! -T 4RT 	R)R$T $R))T ,	S5S	T 	ST SS! SS! !	T*S=8T =TT 	T&T!!T&c                 h    | j                   r&| j                   j                          t        d       yy)zFecha o navegadoru   🔒 Navegador fechadoN)r	   closer    )r   s    r   fecharzMercadoLivreScraper.fechar/  s'    <<LL *+ r   N)zml_cookies.jsonF)<   )__name__
__module____qualname__r   r*   r2   rA   r0   rG   rs   rv    r   r   r   r      s/    $LR()V="Tl,r   r   __main__F)r   z=
============================================================u&   PRIMEIRA VEZ - NECESSÁRIO FAZER LOGINz<============================================================rw   )r1   zshttps://produto.mercadolivre.com.br/MLB-5706409880-calcas-cargo-masculinas-casu-com-varios-bolsos-beach-bermuda-_JMu   📌 TÍTULO:rR   u   
📝 DESCRIÇÃO:rS      z...zN/Au   
🖼️ IMAGENS:rT   rQ   z. u2   
⏸️ Pressione ENTER para fechar o navegador...)__doc__r"   r   playwright.sync_apir   r.   r   rx   scraperr*   rG   r    r2   url_produtors   dados	enumeraterq   ri   inputrv   r{   r   r   <module>r      sR  
  	 / f, f,X	 z!51G"!!# &&(- :;&M &&B&7 L--k:- /"%/"'(eK6H%$Tc*U2eT&'#E)$4a8 %32cUm$% 	CDK H 	CDs   CD D%