
    _h9h                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	Z	d dl
mZ d dlmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZd dl m!Z! d dl"Z"d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z)  e!         e       ZdZ( e	jT                  d      Z+d a,d a-d a.d a/ ed      Z0 ejb                  dd      je                         dk(  Z3ddZ4ddZ5d Z6d Z7d Z8d Z9d dZ:dZ;de)fdZ<y)!    N)ThreadPoolExecutor)urljoin)NoSuchElementExceptionTimeoutException ElementClickInterceptedExceptionWebDriverException)Faker)ValidationError)r   )By)WebDriverWait)expected_conditions)load_dotenv)ParserLogger)ParserStatusEnumParsedProductSchema)ProxyManagerparser   )max_workersIS_LOCALfalsetruec                    t         j                         }t         j                         }t        j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d|        |j                  d|        |r|j                  d       | j                  d	      }| j                  d
      }d| d| }t        d|z          |j                  d|        	 t        j                  |      }t        d       j                  d       |j                  dddi       t        d       	 |j                  d       |j                  j                  d      t!        d      z   }
|j                  j                  d      }|j                  |
| }t#        j$                  |      }t        |d          |S # t        $ r,}	t        d|	        t        j                          Y d }	~	d }	~	ww xY w# t        $ r}	t        d|	        Y d }	~	|S d }	~	ww xY w)Nz--no-sandboxz---disable-blink-features=AutomationControlledz--disable-dev-shm-usagez--disable-extensionszstart-maximizedz--user-agent=z--lang=z
--headlessproxyportzhttp://:u   Прокси: z--proxy-server=)optionsu4   Ошибка запуска веб драйвера u$   Веб Драйвер запущен   z%Page.addScriptToEvaluateOnNewDocumentsourcea  
        Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
        Object.defineProperty(navigator, 'languages', { get: () => ['uk-UA', 'uk', 'en-US', 'en'] });
        Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5] });
        Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => 4 });
        Object.defineProperty(navigator, 'deviceMemory', { get: () => 8 });
        Object.defineProperty(window, 'screen', {
          get: () => ({
            width: 1920,
            height: 1080,
            availWidth: 1920,
            availHeight: 1040,
            colorDepth: 24,
            pixelDepth: 24
          })
        });
        HTMLCanvasElement.prototype.toDataURL = function() {
          return "data:image/png;base64,fakebase64canvas==";
        };
        const getParameter = WebGLRenderingContext.prototype.getParameter;
        WebGLRenderingContext.prototype.getParameter = function(param) {
          if (param === 37445) return 'Intel Inc.';
          if (param === 37446) return 'Intel Iris OpenGL Engine';
          return getParameter(param);
        };
        const originalGetFloatFrequencyData = AnalyserNode.prototype.getFloatFrequencyData;
        AnalyserNode.prototype.getFloatFrequencyData = function(array) {
          for (let i = 0; i < array.length; i++) array[i] = 100;
        };
        Object.defineProperty(window, 'RTCPeerConnection', { get: () => undefined });
        u   Проверяю проксиzhttps://api.2ip.ua/geo.json?ip=z<pre>z</pre>ipu,   Ошибка проверки прокси: )faker
user_agentlanguage_codeucChromeOptionsadd_argumentgetprintChrome	Exception	traceback	print_excset_page_load_timeoutexecute_cdp_cmdpage_sourcefindlenjsonloads)
proxy_infoheadlessfake_user_agent	fake_langr   r    r   
proxy_authdriverestartend	json_datas                /var/www/html/parser.pycreate_driverr?   +   s4   &&(O##%I G(HI23/0*+=(9:;79+./\*		 B>>&!D2$av&J	
Z
'(?:,787+ 

01
  $ B  E  H 

)*	B

45""''03w<?  %%h/&&uS1	ZZ	"bh Mo  DQCHIh  B<QC@AAMBs1   G3 ,BH+ 3	H(<"H##H(+	I4IIc                     t        | |      }|j                  d       t        j                  t	        j
                  dd             |S )N)r4   r5   zhttps://hotline.ua/      )r?   r'   timesleeprandomuniform)r4   r5   r9   s      r>   create_and_prepare_driverrG      s7    j8DF
JJ$%JJv~~a#$M    c                 (   t        | d      }t        |        | j                  d      }t        j                  t        j                  dd             	 | j                  t        j                  d      }|r3t        j
                         dk  rt        t        |      t        j                  dd            }t        j                  ||      }| j                  d	       |D ]  }| j                  d
|       t        j                  t        j                  dd             	 |j                  t        j                   |             t        j
                         dk  r|j#                          n| j                  d|       t        j                  t        j                  dd              n)t        j                  t        j                  dd             t        j                  dd      }||z  }	t        j                  dd      }
t1        |
      D ]\  }|	|
z  t        j                  dd      z  }| j                  d| d       t        j                  t        j                  dd             ^ t        j                  t        j                  dd             t1        |
      D ]]  }|	|
z  t        j                  dd      z  }| j                  d|  d       t        j                  t        j                  dd             _ t        j                  t        j                  dd             y # t$        t&        t(        f$ r#}t*        j-                  d|        Y d }~d }~ww xY w# t.        $ r#}t*        j-                  d|        Y d }~d }~ww xY w)N
   z!return document.body.scrollHeight      zdiv.zoom-gallery__nav imggffffff?r      z
                let iframes = document.querySelectorAll('iframe');
                iframes.forEach(f => {
                    f.style.pointerEvents = 'none';
                    f.style.visibility = 'hidden';
                });
            zAarguments[0].scrollIntoView({behavior: 'auto', block: 'center'});g333333?g       @g333333?arguments[0].click();uU   Не вдалося клікнути по зображенню (ігноруємо): g      ?      @   uW   Не вдалося клікнути по зображеннях (ігноруємо): 皙?g?   g?zwindow.scrollBy(0, z);g      ?      ?      ?)r   close_popup_if_presentexecute_scriptrC   rD   rE   rF   find_elementsr   CSS_SELECTORminr1   randintsampleuntilECelement_to_be_clickableclickr   r   r   loggerdebugr*   range)r9   waitheightimagesclick_countimages_to_clickimgr:   scroll_percent	scroll_pxstepsimoves                r>   human_like_interactionrn      s   $D6"""#FGFJJv~~a#$t%%boo7RSfmmo+c&k6>>!Q+?@K$mmFK@O!! #  ' 5%%&ikno

6>>#s34~JJr99#>?}}-		--.EsK 

6>>#s345 JJv~~a+, ^^C-N'INN1b!E5\ .5 6>>#s#;; 3D6<=

6>>$,-.
 	JJv~~c3'(5\ .5 6>>#s#;; 3TE7"=>

6>>$,-.
 	JJv~~a#$1 )*JL^_ ~LL#xyzx{!|}}~
  tnopnqrsstsE   CM% AL+=AM% +M"?MM% M""M% %	N.NNc                    	 | j                  t        j                  d      }|j                         r<| j	                  d|       t
        j                  d       t        j                  d       	 | j                  t        j                  d      }|j                         r<| j	                  d|       t
        j                  d       t        j                  d       | j	                  d
       y # t        $ r Y t        $ r"}t
        j                  d|        Y d }~d }~ww xY w# t        $ r Y Ut        $ r"}t
        j                  d	|        Y d }~zd }~ww xY w# | j	                  d
       w xY w)Nz.grv-unblock-label-hostz$arguments[0].style.display = 'none';uK   🧹 Закрили спливаюче вікно (.grv-unblock-label-host)r   uG   ⚠️ Помилка при закритті .grv-unblock-label-host: zdiv.modal-overlayu?   🧹 Закрили модальне вікно (modal-overlay)rT   u=   ⚠️ Помилка при закритті modal-overlay: document.body.style.zoom='80%')find_elementr   rX   is_displayedrV   r`   inforC   rD   r   r*   warning)r9   popupr:   overlays       r>   rU   rU      s8   	f##BOO5NO!!"H%PKKefJJqM@%%boo7JK!!!"H'RKKYZJJsO 	>?! "  f`ab`cdeef "  \VWXVYZ[[\ 	>?sU   A,C- /A,D% -	D"8D" DD"%	E.E 0E8EE EE E0c           	      >   i }d}t               }	 | j                  t        j                  d      }| j	                  d|      }d}d}d}t        |      D ]  }	| j	                  d||       t        j                  d       |j                  t        j                  d	      }
t        |
      D ]  \  }}	 |j                  t        j                  d
      }t        |      dk(  rW|d   j                  d      }|dk(  r>|d   j                  t        j                  d      }|j                  j                         }t        |      dk\  r|d   j                  j                         j                  dd      j                  dd      j                  d      }|d   j                  t        j                  d      }|r|d   j                  j                         }n<|d   j                  j                         j                  dd      j                  d      }||f}||vr*|s|r&|j!                  |       ||j#                  |i       |<    ||z  }||kD  s n t               }g }|j-                         D ]H  \  }}|j-                         D ]0  \  }}||vs|j!                  |       |j/                  |||d       2 J |S # t$        $ r&}t&        j)                  d| d|        Y d}~=d}~ww xY w# t$        $ r$}t&        j+                  d| d       Y d}~d}~ww xY w)u   
    Плавно скролить контейнер з характеристиками, щоб підвантажити всі.
    Збирає унікальні характеристики, уникаючи дублікатів.
    u-   Технічні характеристикиz"div.about__info div.specificationsz return arguments[0].scrollHeightr   d      z&arguments[0].scrollTop = arguments[1];rQ   z#table.specifications-table tbody trtdr   colspan2h3rM   
 ?z :	au7   ⚠️ Не вдалося обробити рядок z: NuC   ❌ Помилка при скролі характеристик: Texc_info)groupfilter_namevalue)setrq   r   rX   rV   rb   rC   rD   rW   	enumerateTAG_NAMEr1   get_attributetextstripreplaceadd
setdefaultr*   r`   rt   erroritemsappend)r9   characteristics_dictcurrent_groupseen	containercontainer_height
scroll_topstep	max_steps_rowsrl   rowcellsr{   r}   labellinksr   keyr:   seen_filterscharacteristics_listr   attrsr   s                             r>    scroll_characteristics_containerr      s   
 CM5D-o''02	!001SU^_
	y! !	A!!"JIWabJJsO**2??<abD#D/ g3g--bkk4@E5zQ"'("8"8"C"c>!&q!6!6r{{D!IB,.GGMMOM$5zQ %a 3 3 5 = =dB G O OPSUW X ^ ^_e f %a 6 6r{{C H $)!HMM$7$7$9E$)!HMM$7$7$9$A$A$$K$Q$QRX$YE,e4d? HHSMX]0;;M2NuU+g2 $J,,C!	N 5L,224 u"'++- 	K,.  -$++"#."- 	  / ! gNN%\]^\__abcad#effg  oZ[\Z]^imnnosV   B!K/ 2BJ=6K/ 7DJ=K/ K/ =	K,K'!K/ 'K,,K/ /	L8LLc                 ,   | j                  |       t        | d      }| j                  d       | j                  d       t        j                  d       | j                  d       t        j                  d       g }	 |j                  t        j                  t        j                  df             t        j                  d       	 | j                  t        j                  d      }| j                  d	|       t        j                  d
       |j                          t        j                  d       t        j                  d       t        |       }d }	 |j                  t        j                  t        j                  df            j&                  j)                         }d }	 t-        d      D ]  }		 t        j                  t/        j0                  dd             |j                  t        j                  t        j                  df            }
|
j&                  j3                  dd      j)                         }t        j                  d|         n t5        |        d }	 	 | j                  t        j                  d      }| j                  d|       t        j                  d       t        j                  d       | j                  t        j                  d!      }|j&                  j)                         }t7        |        g }	 | j9                  t        j:                  d$      }t=        d% |D        d       }|rtt?        j@                  d&      }|jC                  |      }d' }d(}|D cg c]
  } ||       }}|D cg c]  }||z   	 }}t        j                  d)tE        |       d*       |s|D ]  }|jG                  d+      }t?        jH                  d,|      }|r^|jK                  d      jM                         jO                  d-      }|jQ                  d.      rd(|z   }|g}t        j                  d/        nxt?        jH                  d0|      }|s|jK                  d      jM                         jO                  d-      }|jQ                  d.      rd(|z   }|g}t        j                  d1        n |st        j#                  d2       |xs d|xs d|||d6S # t        $ r t        j                  d       	 | j                  t        j                  d      }| j                  d	|       t        j                  d
       |j                          t        j                  d       t        j                  d       t        |       }n.# t         $ r"}t        j#                  d|        Y d }~nd }~ww xY wY jw xY w# t$        $ r t        j#                  d       Y w xY w# t$        $ r t        j+                  d       Y ew xY w# t$        $ r  t        j#                  d|	dz    d       Y w xY w# t         $ r#}t        j+                  d|        Y d }~d }~ww xY w# t        $ r t        j                  d        Y w xY w# t        $ r t        j#                  d"       Y t         $ r#}t        j+                  d#|        Y d }~d }~ww xY wc c}w c c}w # t         $ r%}t        j+                  d3| d45       Y d }~=d }~ww xY w)7N   rp   zwindow.scrollTo(0, 0);rS   zwindow.scrollBy(0, -150);zdiv.title.text-x-lguD   ✅ Блок 'Характеристики' завантаженийz(span[data-tracking-id="product-79"].linkz/arguments[0].scrollIntoView({block: 'center'});g333333?u1   🟢 Натиснули 'Дивитися усі'rM   uZ   ℹ️ 'Дивитися усі' відсутня — пробуємо 'Про товар'z,div[data-tracking-id="product-19"].tabs-itemu+   🟢 Натиснули 'Про товар'u>   ❌ Не вдалося клікнути 'Про товар': uH   ⚠️ Блок характеристик не завантаживсяzdiv.header h1.title__mainu9   ❌ Повна назва не знайдена (timeout)r   rT   zdiv.offers-list__titleu   Де купитиr   u   ✅ Коротка назва: u>   ⚠️ offers-list__title не зʼявився (спроба )u7   ❌ Помилка при парсингу short_name: zbutton.expand-buttonrN   u;   📖 Натиснули кнопку 'розгорнути'u;   ℹ️ Кнопка 'розгорнути' відсутняz-div.description__content div.text-wrapper divu/   ❌ Опис товару не знайденоu:   ⚠️ Помилка при парсингу опису: scriptc              3   f   K   | ])  }d |j                  d      v s|j                  d       + yw)
imageLinks	innerHTMLN)r   ).0ss     r>   	<genexpr>z parse_product.<locals>.<genexpr>  s*     kalaoo^iNj>jQ__[)ks   11zbig:"(\\u002F[^"]+)"c                 @    | j                         j                  d      S )Nunicode_escape)encodedecode)r   s    r>   decode_unicode_escapesz-parse_product.<locals>.decode_unicode_escapes  s    !((*2C2CDT2U+UrH   zhttps://hotline.uau   🖼️ Знайдено u!    зображень у imageLinksr   z\bbig\s*:\s*"([^"]+)"r   /uU   🖼️ Знайдено головне зображення через поле big:z\bimage\s*:\s*"([^"]+)"uW   🖼️ Знайдено головне зображення через поле image:uO   ❌ Зображення не знайдено в жодному скриптіu?   ❌ Помилка при парсингу зображень: Tr   )	full_name
short_nameproduct_descriptionre   characteristics))r'   r   rV   rC   rD   r\   r]   visibility_of_element_locatedr   rX   r`   rs   rq   r_   r   r   r*   rt   r   r   r   r   rb   rE   rF   r   rn   rU   rW   r   nextrecompilefindallr1   r   searchr   r   r   
startswith)r9   urlrc   r   view_alltabr:   r   r   attemptoffers_titler   expand_buttondesc_divre   scriptsscript_textpatternmatchesr   base_urlmbig_urlsr   r   	match_bigimg_urlmatch_images                               r>   parse_productr     s2   
JJsO$D
:; 23JJsO
56JJsOc

233R__F[4\]^Z[	e**2??<fgH!!"SU]^JJsONNKKKLJJqM#CF#K " IRJJ,,boo?Z-[\

$uuw 	 JTQx 
	pG	p

6>>!S12#zz44booG_5`a  *..667JBOUUW
=j\JK
	p 6" W	W"//AWXM!!"9=IJJsOKKUV
 &&r8gh&mm113 6" F3k&&r{{H= k7k

 jj!89Gook2GU+H;BCa.q1CHC089hn9F9KK3CK=@abc  {3 II&>E	'ooa0779@@AQRG))#."6"@%YFKK wx !ii(BDI)//299;BBCSTG))#."6"@%YFKK yz+2 NNlm _" &B2/ y & 	eKKtu	e))"//;ij%%&WY\]

3		IJ

1'G'O$ e!_`a_bcdde	e  cabc  RPQR $ p!_`gjk`k_llmnop TNqcRSST & 	WKKUV	W " JHI WQRSQTUVVW2 D9B  kVWXVYZeijjks)  >A	W BS! AW' &X8 5BXX8 &AY' :Z 
A$[% .[=[% [ C[% A6[% !V? BVV?	V8V3.V?3V88V?;W >V??W W$#W$'X	X	%X51X8 4X55X8 8	Y$YY$'Z	Z Z		Z [-[5[[
[% %	\.\\c                    K   t        j                         }|j                  t        t        | ||       d {   S 7 w)N)asyncioget_event_looprun_in_executorexecutorr   )r   r4   r5   loops       r>   parse_product_asyncr     s4     !!#D%%hsJPXYYYYs   5><>rA   proxy_manager_extc                   K   | }t        j                  dd      j                         dk(  }| }|j                  }t	        |      }|j                          d {    t        j                  |j                                d }d }	 t        j                  t        _        |j                  dd       d {    |j                         4 d {   }|j                  t         j"                        4 d {   }	|	j%                  d       d {    |	j'                          d {   }
|
sl|r*	 |j)                          t*        j-                  d       d }d }t        j2                  d
       d {    	 d d d       d {    d d d       d {    t        j4                  t        _        |
D ]~  }|d   }|d   }|j                  dd|       d {    |	j%                  dd|f       d {    |j7                          d {    d}t9        dt:        dz         D ]  }|||j=                          d {   }|s|j                  dd       d {    t9        d      D ]r  }t        j2                  d       d {    |j                          d {    |j=                          d {   }|sS|j                  dd|d          d {     n  |j                  dd|       d {     O|r	 |j)                          d }t        j>                         jA                  d tB        ||       d {   }tD        dz  a"	 |j                  dd| ||d          d {    t        j>                         jA                  tF        tH        ||       d {   }tK        d0i | |	j%                  ddd tM        jN                  |d!      |f       d {    |j7                          d {    tP        dz  a(|j                  d"d#||d$   d%       d {    d} ~  d d d       d {    d d d       d {    t        j2                  d       d {    7 7 7 7 7 s7 ^# t.        $ r#}t*        j1                  d	|        Y d }~Yd }~ww xY w7 E7 77 *7 7 7 7 7 l7 D7 /7 7 7 # t.        $ r Y w xY w7 7 ~7 K7 7 7 # tR        $ r}tT        dz  a*|j                  d"d&| ||d$   d%       d {  7   |	j%                  dd'd tM        jN                  d(tW        |      id!      |f       d {  7   |j7                          d {  7   Y d }~ d }~wt.        $ rU}tT        dz  a*tX        dz  a,t[        j\                         }|j                  d"d)| ||d$   d|*       d {  7   |j_                  |d          d {  7   |rY	 |j)                          nC# t.        $ r7}t*        j1                  d	| d+t[        j\                                 Y d }~nd }~ww xY wd }d }|t:        k(  r~|	j%                  dd'd tM        jN                  tW              |d,d!      |f       d {  7   |j7                          d {  7   |j                  d"d-||r|d$   nd        d {  7   Y d }~nd }~ww xY wt        j2                  ta        jb                  d.d/             d {  7   7 # 1 d {  7  sw Y   xY w7 # 1 d {  7  sw Y   xY w7 w)1Nr   r   r   Twaitingu   Очікуємо нові URLz(SELECT * FROM url_queue WHERE status = 0uO   Драйвер закритий, бо посилання закінчилисьu9   Помилка при закритті драйвера: <   url_idr   queueu    Взяли URL в обробку)r   zSUPDATE url_queue SET status = %s, date_modify = CURRENT_TIMESTAMP WHERE url_id = %sr   Fproxy_changeu?   Немає доступних проксі, очікуємо...   rK   u2   Знайдено розбанений проксіusername)r   u9   ❌ Не знайдено доступних проксіparsingu   Спроба парсингу )r   r   zlUPDATE url_queue SET status = %s, date_modify = CURRENT_TIMESTAMP, recived = %s, data = %s WHERE url_id = %srM   r   )ensure_asciiidleu#   ✅ Парсинг успішнийr   )r   r   successzValidationError: rA   validation_erroru"   Парсинг не вдався: )r   r   r   r+   r~   )r   r+   u+   🚫 Всі спроби вичерпаніrO   rB    )2osgetenvlowerdb_poolr   load_proxiesr   create_taskrun_periodic_unbanr   r   stateparser_statuslogacquirecursoraiomysql
DictCursorexecutefetchallquitr`   rs   r*   rt   rD   workingcommitrb   MAX_RETRIES	get_proxyr   r   rG   parse_attemptsr   r   r   r2   dumpsparse_successesr
   parse_failuresstr
proxy_bansr+   
format_exc	ban_proxyrE   rF   )r   proxy_managerr   headless_modepoolparser_loggerr9   current_proxyconnr   r   r:   r   r   r   r   r   r   datavetraces                        r>   parser_loopr    s     &MyyW-335?H LM  D &M

$
$
&&&88:;FM
.33	+JKKK<<> I	D I	DT{{8#6#67 HD HD6nn%OPPP#__..l"KKM"KK(yz "&(,!--+++HD HDI	D I	D I	D$ '7&>&># uDC ]Fe*C'++G5W]`+aaa ..mF   ++-''#G#(K!O#< gD!>]-B2?2I2I2K,KM#0&3&7&7  IJ  'K  !K  !K).r 
!*A*1--*:$:$:*7*D*D*F$F$F:G:Q:Q:S4SM'4.;.?.?  QEFST^F_ /@ /a )a )a(-
!* +8*;*;N  MH  NQ*;  +R  %R  %R$)%!)$*KKM *.+2+A+A+C+S+S $ 9 - -	, &F '!+Dq"/"3"3IA_`g_h?ior:G
:S #4 #U U U *1)?)?)A)Q)Q ( - & #	* $D 07$7"(.. !O!"Atzz$U'KV T#   #'++-//+q0O"/"3"3F<agj:G:P<@ #4 #B B B '+G!sgDuD'HD HDI	D I	DV mmA_  ' 	LI	DHDP.  ) l"NN-fghfi+jkkl
 ,HDI	D0 b ( -L !K$:$F4S)a %R (1 !)$(!)&U$ 0B  / 	"*a/N"/"3"3F>OPRt<TZ]:G:PZ_ #4 #a a a"(.. !O!"Atzz3Es2w2O^c'dfl m#   #'++-//!( q*a/N&!OJ$-$8$8$:E"/"3"3 &"DQC H$'&3G&<(-*/ #4 #   #0"9"9-
:S"TTT%!N$*KKM'0 !N$*NN5nopnqqst}  uI  uI  uK  tL  4M  %N  %N!N)-04&+5&,nn %S()1djj3q6X]9^mr.s(.%0'" !" !" '+kkm 3 3&3&7&7@msvXemG>Tko '8 'q !q !q=qB &mmFNN3,BCCCQHD HD HD HDI	D I	D I	D I	DV 	sj  A]!Q5A]!4Q85]!Q;]!$]5Q>6]9\/R\/&R'\/0%R\/1R62\/7]R9]]!R<]!A \/R?
\/5S
6\/S
5\/S\/S *\/
S\/"S#\/:S;\/\/S\/;S<	\/S/\/S-\/S=2S035S=(S3)=S=&S6'S=>S9?)S=(S;)S=/\/6]\,]]!]]!.]/]!8]!;]!>]\/\/	R3R.(\/.R33\/9]<]!?\/\/\/\/\/\/\/\/\/\/	S*&\/)S**\/0S=3S=6S=9S=;S==	[5(V.T1/>V-U0.VV	V\/[5 A[0&W)'[0X[0X
[0	Y&-Y[0YA
[0'Z*([0 [$[0%[(&[0+\/0[55/\/$\'%\/,]/]	5\86]	=]]!]]]	]!)NT)T)=r2   r   r   rC   r   rE   r+   concurrent.futuresr   loggingurllib.parser   selenium.common.exceptionsr   r   r   r   undetected_chromedriverr$   r!   r	   pydanticr
   selenium.commonselenium.webdriver.common.byr   selenium.webdriver.support.uir   selenium.webdriver.supportr   r]   r   dotenvr   r   r	  r   schemasr   r   r  r   	getLoggerr`   r   r   r  r  r   r   r   r   r?   rG   rn   rU   r   r   r   r   r  r   rH   r>   <module>r     s     	 	     1     $  $ , + 7 @    & 9 & 			8	$
!,299Z)//1V;Qh6%r@2E N\@Z
 _ _rH   