Ë
    ±!ƒj¢  ã                   óä   — d 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m	Z	 dZ
e
› d�ZdZej                  j                  dd«       dd	lmZ d
„ Zd„ Zedk(  r ej(                   e«       «       yy)u�  
å¨�æµ·å�—æµ·æ–°åŒºæ”¿åŠ¡æœ�åŠ¡å¹³å�° - é€šçŸ¥å…¬å‘Š (whnhzwfw.sd.gov.cn/nanhai/govservice/notice)
ç«™ç‚¹: å±±ä¸œæ”¿åŠ¡æœ�åŠ¡ç½‘ å¨�æµ·å¸‚Â·å�—æµ·æ–°åŒº (icity æ¡†æž¶)
åˆ—è¡¨: /nanhai/govservice/notice -> JS onQuery(N) ç¿»é¡µ (limit=8, å®žé™…æ¸²æŸ“10å�«ç½®é¡¶)
      API: POST /nanhai/api-v2/app.icity.govservice.GovProjectCmd/getPoliciList/execute
      (AES-ECBåŠ å¯† + URLç­¾å��, ç›´æŽ¥åœ¨é¡µé�¢ä¸Šä¸‹æ–‡æ‰§è¡Œ onQuery ç»•å¼€)
è¯¦æƒ…: /nanhai/icity/publishdetail?id={uuid}
      æ ‡é¢˜ #title, å�‘å¸ƒæœºå…³ #deptname, æˆ�æ–‡æ—¥æœŸ #writetime, å�‘å¸ƒæ—¥æœŸ #ctime, æ­£æ–‡ #contentDetail
æ³¨æ„�: https è¢« TLS æ‹¦æˆª, å¿…é¡»ç”¨ http + playwright stealth
é    N)Úasync_playwright)ÚStealthzhttp://whnhzwfw.sd.gov.cnz/nanhai/govservice/noticeu   å¨�æµ·å�—æµ·æ–°åŒº-é€šçŸ¥å…¬å‘Šz/root/gov_crawler)Úpush_to_searchdbc              ƒ   ó†  K  — |4 ƒd{  –—†  t        d«      D ]…  }	 t        j                  | j                  |dd¬«      d¬«      ƒ d{  –—†  | j	                  d«      ƒ d{  –—†  | j                  d	«      ƒ d{  –—† }|d
   s|d   r|c cddd«      ƒd{  –—†  S Œ‡ 	 ddd«      ƒd{  –—†  y7 Œ©7 Œk7 ŒT7 Œ=7 Œ!# t        $ ra}|dk(  r1t        dt        |«      j                  › dt        |«      dd › �«       n | j	                  d|dz   z  «      ƒ d{  –—†7   Y d}~�Œ	d}~ww xY w7 Œ|# 1 ƒd{  –—†7  sw Y   yxY w­w)u"   æŠ“è¯¦æƒ…é¡µ: æ ‡é¢˜/æ—¥æœŸ/æ­£æ–‡Né   ÚdomcontentloadedéÈ¯  ©Ú
wait_untilÚtimeouté2   ©r   i   uÑ  () => {
                    const g = (id) => { const el = document.getElementById(id); return el ? el.textContent.trim() : ""; };
                    const body = document.getElementById("contentDetail");
                    let html = "";
                    if (body) {
                        // ç§»é™¤è„šæœ¬/style, ä¿�ç•™è¡¨æ ¼ä¸Žæ®µè�½
                        const clone = body.cloneNode(true);
                        clone.querySelectorAll("script,style,iframe,object").forEach(e => e.remove());
                        html = clone.innerHTML;
                    }
                    return { title: g("title"), dept: g("deptname"), ctime: g("ctime"), writetime: g("writetime"), html: html };
                }ÚhtmlÚtitleé   z    [DETAIL ERR] ú éx   iÐ  é   )ÚrangeÚasyncioÚwait_forÚgotoÚwait_for_timeoutÚevaluateÚ	ExceptionÚprintÚtypeÚ__name__Ústr)ÚpageÚurlÚsemÚattemptÚinfoÚes         ú$/root/gov_crawler/crawl_whnh_tzgg.pyÚfetch_detailr'      sN  è ø€ à÷ ñ Ü˜Q“xò 	FˆGðFÜ×&Ñ& t§y¡y°ÐASÐ]b yÓ'cÐmoÔp×pÐpØ×+Ñ+¨CÓ0×0Ð0Ø!Ÿ]™]ð ,ó ÷ �ð ˜’< 4¨¢=Ø‘K÷%÷ ñ ð" $1ð!	Fð. ÷1÷ ñ øð qøØ0øðøðùô& ò FØ˜a’<ÜÐ-¬d°1«g×.>Ñ.>Ð-?¸qÄÀQÃÈÈÀÀÐOÕPà×/Ñ/°¸À!¹Ñ0DÓE×EÑEÿùð	Fúð'ø÷ ÷ ñ üsÎ   ‚E‰B3ŠE�D,�,B=Á	B5Á
B=Á"B7Á#B=Á;B9Á<B=ÂD,ÂEÂB;ÂEÂD,Â"EÂ-D*Â.EÂ5B=Â7B=Â9B=Â;EÂ=	D'ÃAD"ÄD
ÄD"ÄD,Ä"D'Ä'D,Ä*EÄ,D>Ä2D5Ä3D>Ä:Ec               ƒ   ó¸
  K  — t        j                  «       } | j                  dt        dd¬«       | j                  dt        dd¬«       | j	                  «       }g }t        «       4 ƒd {  –—† }|j                  j                  dd	g¬
«      ƒ d {  –—† }|j                  ddddœd¬«      ƒ d {  –—† }t        «       }|j                  |«      ƒ d {  –—†  |j                  «       ƒ d {  –—† }t        d«      D ]€  }	 t        j                  |j                  t         dd¬«      d¬«      ƒ d {  –—†  |j#                  d«      ƒ d {  –—†  |j%                  d«      ƒ d {  –—† }	|	r nt'        d|dz   › d�«       Œ‚ t1        «       }t        d|j2                  dz   «      D �]L  }|dkD  r6|j%                  d"|› d#�«      ƒ d {  –—†  |j#                  d$«      ƒ d {  –—†  |j5                  d%d&«      ƒ d {  –—† }d}|D ]e  }|d'   j7                  «       }|d(   j7                  «       }|r|sŒ.d)|v rŒ3||v rŒ8|j9                  |«       |j;                  |||d*   d+œ«       |dz  }Œg t'        d,|› d-t=        |«      › d.|› d/t=        |«      › �«       |j>                  rt=        |«      |j>                  k\  r n<|dk(  r|dkD  r n0|j%                  d0«      ƒ d {  –—† }|s�Œ=t=        |«      |k\  s�ŒM n t'        d1t=        |«      › d2�«       |j                  «       ƒ d {  –—† }t        j@                  d3«      }d}|D ]r  }tC        ||d4   |«      ƒ d {  –—† }|dz  }|r)||d5<   t'        d6|› d7t=        |«      › d8|d9   d d: › �«       ŒKd |d5<   t'        d6|› d7t=        |«      › d;|d9   d d: › �«       Œt |jE                  «       ƒ d {  –—†  d d d «      ƒd {  –—†  g }|D ]Ÿ  }|jG                  d5«      xs i }|jG                  d9«      xs |d9   }|jG                  d<«      xs	 |d*   xs d=}|jG                  d>d=«      }|s	d?|d9   › d@�}|j;                  tH        ||d4   |d4   |||d dA |jG                  dBd=«      dCœ«       Œ¡ tK        |dD¬E«       t'        dFt=        |«      › dG�«       y 7 �Œ87 �Œ7 �Œù7 �ŒÙ7 �ŒÄ7 �Œƒ7 �Œm7 �ŒW# t(        $ rg}
t'        d|dz   › dt+        |
«      j,                  › dt/        |
«      d d › �«       |d k(  r‚ |j#                  d!|dz   z  «      ƒ d {  –—†7   Y d }
~
�Œ+d }
~
ww xY w7 �Œl7 �ŒV7 �Œ?7 �Œb7 �Œ7 �Œí7 �Œ~7 �Œq# 1 ƒd {  –—†7  sw Y   �Œ‚xY w­w)HNz--pagesé   u   æœ€å¤§é¡µæ•°)r   ÚdefaultÚhelpz--maxr   u   æœ€å¤§æ�¡æ•°(0=å…¨éƒ¨)Tz--no-sandbox)ÚheadlessÚargszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36iV  i„  )ÚwidthÚheightzzh-CN)Ú
user_agentÚviewportÚlocaleé   r   r	   r
   r   r   i   ztypeof onQuery === 'function'z  [RETRY] page r   z loaded but no onQueryz
  [RETRY] z/5 r   éd   é   iˆ  zonQuery(ú)iÄ	  z#roll_list1 tra  els => els.map(e => {
                const a = e.querySelector("a");
                const tds = e.querySelectorAll("td");
                return { t: a ? a.textContent.trim() : "", h: a ? a.href : "", date: tds.length > 1 ? tds[tds.length-1].textContent.trim() : "" };
            })ÚtÚhzwhzwfw.sd.gov.cn/wh/Údate)r   r!   r9   z[LIST] page z: rows=z new=z total=zlayerpageAllTotal || 0u   å…± u    æ�¡åˆ—è¡¨, å¼€å§‹æŠ“è¯¦æƒ…...r   r!   Údetailz  [ú/z] r   é(   z] FAIL ÚctimeÚ r   z<p>z</p>éÈ   Údept)Ú	site_namer   Ú
source_urlr!   ÚcontentÚpub_dateÚsummaryÚsourceÚ	whnh_tzgg)Úbatch_labelzDone: z records)&ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr   ÚchromiumÚlaunchÚnew_contextr   Úapply_stealth_asyncÚnew_pager   r   r   r   ÚLIST_URLr   r   r   r   r   r   r   ÚsetÚpagesÚeval_on_selector_allÚstripÚaddÚappendÚlenÚmaxÚ	Semaphorer'   ÚcloseÚgetÚ	SITE_NAMEr   )Úparserr-   ÚresultsÚpÚbrowserÚctxÚstealthr    r#   Úokr%   ÚseenÚpgÚrowsÚnew_cntÚrr7   r8   ÚtotalÚpage2r"   ÚdoneÚitemr$   ÚrecordsÚitÚdr   r9   rC   s                                 r&   Úmainrs   4   sŠ  è ø€ Ü×$Ñ$Ó&€FØ
×Ñ˜	¬°R¸nÐÔMØ
×Ñ˜¤c°1Ð;SÐÔTØ×ÑÓ€Dà€GÜÓ!÷ Ið I QØŸ
™
×)Ñ)°4¸~Ð>NÐ)ÓO×OˆØ×'Ñ'ð IØ#¨sÑ3¸Gð (ó E÷ Eˆô “)ˆØ×)Ñ)¨#Ó.×.Ð.Ø—\‘\“^×#ˆô ˜Q“xò 	BˆGðBÜ×&Ñ& t§y¡y´ÐFXÐbg yÓ'hÐrtÔu×uÐuØ×+Ñ+¨DÓ1×1Ð1ØŸ=™=Ð)HÓI×I�ÙÙÜ˜¨°©	 {Ð2HÐIÕJð	Bô ‹uˆÜ˜˜4Ÿ:™:¨™>Ó*ó 	ˆBØ�AŠvØ—m‘m h¨r¨d°!Ð$4Ó5×5Ð5Ø×+Ñ+¨DÓ1×1Ð1Ø×2Ñ2Ð3Cð Fó ÷ ˆDð
 ˆGØò �Ø�c‘F—L‘L“N�Ø�c‘F—L‘L“N�Ù¡Øà)¨QÑ.ØØ˜‘9ØØ—‘˜”Ø—‘¨°1¸aÀ¹iÑHÔIØ˜1‘‘ðô �L   G¬C°«I¨;°e¸G¸9ÀGÌCÐPWËLÈ>ÐZÔ[Ø�xŠxœC ›L¨D¯H©HÒ4ÙØ˜!Š|  Q¢ÙàŸ-™-Ð(@ÓA×AˆEÛœ˜T› eÔ+Ùð?	ôB 	�”S˜“\�NÐ"@ÐAÔBà—l‘l“n×$ˆÜ×Ñ Ó"ˆØˆØò 	NˆDÜ% e¨T°%©[¸#Ó>×>ˆDØ�A‰IˆDÙØ!%��X‘Ü˜˜D˜6 ¤3 w£< .°°4¸±=ÀÀ"Ð3EÐ2FÐGÕHà!%��X‘Ü˜˜D˜6 ¤3 w£< .°¸¸W¹ÀcÀrÐ8JÐ7KÐLÕMð	Nð �m‰m‹o×Ð÷SI÷ IðX €GØò ˆØ�F‰F�8ÓÒ" ˆØ—‘�g“Ò- " W¡+ˆØ�u‰u�W‹~Ò1  F¡Ò1¨rˆØ—%‘%˜ Ó#ˆÙØ˜B˜w™K˜=¨Ð-ˆGØ�‰Ü"ØØ˜U™)Ø�e‘9ØØØ˜T˜c�{Ø—e‘e˜F BÓ'ñ	
õ 		ðô" �W¨+Õ6Ü	ˆF”3�w“<�. Ð
)Õ*ðIùØOùðEùð 	/ùØ#ùð
 vùØ1ùØIúô ò BÜ˜
 7¨1¡9 +¨S´°a³×1AÑ1AÐ0BÀ!ÄCÈÃFÈ4ÈCÀLÀ>ÐRÔSØ˜a’<ØØ×+Ñ+¨D°G¸a±KÑ,@ÓA×A×Aûð	Búð 6ùØ1ùðùð2 Bùð %ùð ?ùð 	ùðSIù÷ I÷ Iò Iüs‘  ‚A'UÁ)R!Á*UÁ-"UÂR$ÂUÂ.R'Â/"UÃR*ÃUÃ)R-Ã*UÃ=0R9Ä-R0Ä.R9ÅR3ÅR9ÅR6Å R9Å&UÅ(R9Å:AUÇ T,ÇUÇT/ÇUÇ3T2Ç4CUËT5ËUËUË,.UÌT8Ì3UÍT;ÍA1UÏ T>ÏUÏUÏUÏCUÒ$UÒ'UÒ*UÒ-UÒ0R9Ò3R9Ò6R9Ò9	T)ÓAT$ÔT
ÔT$ÔUÔ$T)Ô)UÔ/UÔ2UÔ5UÔ8UÔ;UÔ>UÕUÕUÕ
UÕUÕUÚ__main__)Ú__doc__r   ÚjsonÚreÚsysrI   Úplaywright.async_apir   Úplaywright_stealthr   ÚBASErS   r_   ÚpathÚinsertÚcrawler_libr   r'   rs   r   Úrun© ó    r&   ú<module>r‚      ss   ðñ	÷ (× 'Ó 'Ý 1Ý &à"€ØˆVÐ,Ð-€Ø-€	à ‡�‡��Ð&Ô 'Ý (òò8f+ðP ˆzÒØ€G‡K�K‘“Õð r�   