Ë
    ºç‚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ZddlZej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZdZdZdZdZdd	„Zdd
„Zd„ Zedk(  r e«        yy)u~  
crawl_ahtxq_tzgg.py - å±¯æºªåŒº-é€šçŸ¥å…¬å‘Š (www.ahtxq.gov.cn)
ç«™ç‚¹: å¸�è�”NWAF + ç‘žæ•°4ä»£å�ŒWAF (ä¸Ž ahshx/é»„å±± å�Œæ¬¾)
è¿‡ç›¾: playwright + playwright-stealth
åˆ—è¡¨: é¦–é¡µ /zxzx/tzgg/index.html (10æ�¡/é¡µ) + ç¿»é¡µ API GET /content/column/6793870?pageIndex=N
  è¿”å›ž HTML ç‰‡æ®µ (li åˆ—è¡¨), é¡µé�¢å†… fetch å�³å�¯
  åˆ—è¡¨é¡¹: <li><span class="right date">YYYY-MM-DD</span><a href="/zxzx/tzgg/{id}.html">æ ‡é¢˜</a></li>
è¯¦æƒ…: /zxzx/tzgg/{id}.html, meta ArticleTitle/PubDate/ContentSource, æ­£æ–‡ div.wzcon.j-fontContent
  å†…å®¹å�«: çª�å‡ºç”Ÿæ€�çŽ¯å¢ƒé—®é¢˜æ•´æ”¹éªŒæ”¶é”€å�·å…¬ç¤º / æŽ¥è®¿å®‰æŽ’ / å¸®æ‰¶å��å�•å…¬ç¤º ç­‰
é    N)Úpush_to_searchdbzhttps://www.ahtxq.gov.cnz/https://www.ahtxq.gov.cn/content/column/6793870u   å±¯æºªåŒº-é€šçŸ¥å…¬å‘Šz/tmp/ahtxq_tzgg.lockzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36c                 ó,  — t        t        d«      }	 t        j                  |t        j                  t        j
                  z  «       |S # t        $ rÁ t        d| › d�«       t        j                  «       | z   }t        j                  «       |k  rv	 t        j                  |t        j                  t        j
                  z  «       |cY S # t        $ r t        j                  d«       Y nw xY wt        j                  «       |k  rŒvt        d«       Y y w xY w)NÚwu<     [LOCK] å�¦ä¸€ ahtxq å®žä¾‹è¿�è¡Œä¸­, ç­‰å¾…é‡Šæ”¾ (æœ€å¤š zs)...é
   u     [LOCK] ç­‰å¾…è¶…æ—¶, æ”¾å¼ƒ)
ÚopenÚ	LOCK_FILEÚfcntlÚflockÚLOCK_EXÚLOCK_NBÚBlockingIOErrorÚprintÚtimeÚsleep)Úmax_waitÚfdÚdeadlines      ú%/root/gov_crawler/crawl_ahtxq_tzgg.pyÚacquire_lockr      sÐ   € Ü	Œi˜Ó	€BðÜ�‰�BœŸ™¬¯©Ñ5Ô6Øˆ	øÜò 
ÜÐLÈXÈJÐV[Ð\Ô]Ü—9‘9“; Ñ)ˆÜ�i‰i‹k˜HÒ$ðÜ—‘˜B¤§¡´·±Ñ =Ô>Ø’	øÜ"ò Ü—
‘
˜2–ðúô	 �i‰i‹k˜HÓ$ô 	Ð-Ô.Ùð
ús<   ’6A	 Á	ADÂ6C	ÃDÃ	C*Ã'DÃ)C*Ã*DÄDÄDc              ƒ   ón  K  — ddl m} ddlm}  |«       4 ƒd {  –—† }|j                  j                  ddg d¢¬«      ƒ d {  –—† }|j                  t        dd	d
dœd¬«      ƒ d {  –—† } |«       }|j                  |«      ƒ d {  –—†  |j                  «       ƒ d {  –—† }	 |j                  t        dz   dd¬«      ƒ d {  –—† }|j                  d«      ƒ d {  –—†  |j                  «       ƒ d {  –—† }	t        j                  d|	«      }
t!        d|r|j"                  nd› d|
r|
j%                  d«      nd› dt'        |	«      › �«       |
r[d|
j%                  d«      v sd|
j%                  d«      v r5t!        d«       |j)                  «       ƒ d {  –—†  	 d d d «      ƒd {  –—†  yg }t/        «       }d„ }|j                  «       ƒ d {  –—† }	 ||	«      }|s|j1                  d«      ƒ d {  –—† }t!        d t'        |«      › d!�«       |D ]5  }|d"   sŒ	|d"   |vsŒ|j3                  |d"   «       |j5                  |«       Œ7 t7        d#| dz   «      D ]ê  }t8        › d$|› �}|j1                  d%|› d&�«      ƒ d {  –—† }t;        |t,        «      r'|j=                  d'«      rt!        d(|› d)|d d* › �«        n‹ ||«      }|st!        d(|› d+�«        npt!        d,|› d-t'        |«      › d!�«       |D ]5  }|d"   sŒ	|d"   |vsŒ|j3                  |d"   «       |j5                  |«       Œ7 |j                  d.«      ƒ d {  –—†  Œì t!        d/t'        |«      › d!�«       g }t?        |«      D �]  \  }}t!        d0|dz   › d1t'        |«      › d2|d3   d d4 › d5�«       	 |j                  |d"   dd6¬«      ƒ d {  –—† }|j                  d7«      ƒ d {  –—†  |j                  «       ƒ d {  –—† }	|d3   }t        j                  d:|	«      }
|
r>|
j%                  d«      jA                  «       r|
j%                  d«      jA                  «       }|d;   }t        j                  d<|	«      }
|
r7t        j                  d=|
j%                  d«      «      }|r|j%                  «       }d>}t        j                  d?|	«      }
|
r|
j%                  d«      jA                  «       }|s3|	jC                  d@«      }|dkD  r|	jC                  dA|«      dz   }|	||dBz    }|jA                  «       st!        dC«       �Œ¹t        jD                  dDdEt        z   d1z   |«      }t        jD                  dFdGt        z   d1z   |«      }|j5                  ||d"   |tF        |d>dHœ«       �Œ |j)                  «       ƒ d {  –—†  d d d «      ƒd {  –—†  t!        dIt'        «      › dJ�«       |rtI        |dK«       t'        |«      S 7 �ŒÂ7 �Œ�7 �Œ|7 �Œ_7 �ŒJ7 �Œ)7 �Œ7 �Œþ7 �Œb7 �ŒT# t*        $ rN}t!        dt-        |«      d d › �«       |j)                  «       ƒ d {  –—†7   Y d }~d d d «      ƒd {  –—†7   yd }~ww xY w7 �Œ‰7 �Œi7 �Œà7 �Œ#7 �Œ±7 �Œ›7 �Œ†# t*        $ r%}t!        d8t-        |«      d d9 › �«       Y d }~�Œ,d }~ww xY w7 �Œ7 Œö# 1 ƒd {  –—†7  sw Y   �ŒxY w­w)LNr   )Úasync_playwright)ÚStealthTz>/root/.cache/ms-playwright/chromium-1228/chrome-linux64/chrome)z--no-sandboxz--disable-setuid-sandboxz---disable-blink-features=AutomationControlled)ÚheadlessÚexecutable_pathÚargszzh-CNi   i„  )ÚwidthÚheightzAsia/Shanghai)Ú
user_agentÚlocaleÚviewportÚtimezone_idz/zxzx/tzgg/index.htmlÚdomcontentloadedi¸ˆ  )Ú
wait_untilÚtimeouti@  z<title>([^<]*)</title>z  [LOAD] status=ú?z title=é   z len=ÚNWAFÚEnvironmentu     [WAF] ä»�è¢«æ‹¦æˆªz  [LOAD ERR] éx   c                 óX  — g }t        j                  d| «      D ]Ž  }|j                  d«      j                  «       |j                  d«      j                  «       |j                  d«      j                  «       }}}|j	                  d«      r	t
        |z   }|j                  |||dœ«       Œ� |S )NzQ<li[^>]*>\s*<span[^>]*>([^<]*)</span>\s*<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"r&   é   é   ú/)ÚurlÚtitleÚdate)ÚreÚfinditerÚgroupÚstripÚ
startswithÚBASEÚappend)ÚhÚoutÚmmr0   Úhrefr/   s         r   Úextract_from_htmlz$run_async.<locals>.extract_from_htmlL   s•   € ØˆCÜ—k‘kÐ"vÐxyÓzò H�Ø$&§H¡H¨Q£K×$5Ñ$5Ó$7¸¿¹À!»×9JÑ9JÓ9LÈbÏhÉhÐWXËk×N_ÑN_ÓNa˜E�d�Ø—?‘? 3Ô'Ü $™;�DØ—
‘
 4°%ÀÑFÕGð	Hð
 ˆJó    aý  () => {
                const out = [];
                document.querySelectorAll('ul li').forEach(li => {
                    const a = li.querySelector('a');
                    if (a && /\d{6,}\.html/.test(a.href)) {
                        const sp = li.querySelector('.date');
                        out.push({url: a.href, title: (a.getAttribute('title')||a.innerText||'').trim(), date: sp ? sp.innerText.trim() : ''});
                    }
                });
                return out;
            }u     ç¬¬1é¡µ: u    æ�¡r.   r+   z?pageIndex=zfetch('z/').then(r=>r.text()).catch(e=>'ERR:'+e.message)ÚERRz  [pz] fetch ERR: éP   u   ] æ— æ›´å¤šu     ç¬¬u   é¡µ: i°  u     [LIST] åŽ»é‡�å�Ž z  [r-   z] r/   é(   z...i0u  iÄ	  z    [DETAIL ERR] éd   z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r0   z*<meta\s+name="PubDate"\s+content="([^"]*)"z\d{4}-\d{2}-\d{2}Ú zAclass="wzcon\s+j-fontContent[^"]*"[^>]*>([\s\S]*?)</div>\s*</div>zclass="wzcon j-fontContent"ú>i N  u       [SKIP] æ­£æ–‡ç©ºzhref="/zhref="zsrc="/zsrc=")r/   r.   Úpub_dateÚ	site_nameÚcontentÚsummaryu     å…± u
    æ�¡æœ‰æ•ˆÚ
ahtxq_tzgg)%Úplaywright.async_apir   Úplaywright_stealthr   ÚchromiumÚlaunchÚnew_contextÚUAÚapply_stealth_asyncÚnew_pageÚgotor6   Úwait_for_timeoutrF   r1   Úsearchr   Ústatusr3   ÚlenÚcloseÚ	ExceptionÚstrÚsetÚevaluateÚaddr7   ÚrangeÚ
COLUMN_APIÚ
isinstancer5   Ú	enumerater4   ÚfindÚsubÚ	SITE_NAMEr   )Úpagesr   r   ÚpÚbrowserÚctxÚstealthÚpageÚrespÚhtmlÚmÚeÚ	items_allÚseenr<   ÚitemsÚitÚpgÚapi_urlÚtxtÚrecordsÚidxr/   rD   ÚdmrF   Úidx2Ústarts                               r   Ú	run_asyncry   )   s�  è ø€ Ý5Ý*ÙÓ!÷ ~ð ~ QØŸ
™
×)Ñ)ØØ\Únð *ó 
÷ 
ˆð
 ×'Ñ'´2¸gØ;?È3Ñ1OÐ]lð (ó n÷ nˆá“)ˆØ×)Ñ)¨#Ó.×.Ð.Ø—\‘\“^×#ˆð	ØŸ™¤4Ð*AÑ#AÐN`Ðjo˜Óp×pˆDØ×'Ñ'¨Ó-×-Ð-ØŸ™›×'ˆDÜ—	‘	Ð3°TÓ:ˆAÜÐ$±D T§[¢[¸cÐ$BÀ'ÑXYÈ!Ï'É'ÐRSÌ*Ð_bÐIcÐchÔilÐmqÓirÐhsÐtÔuÙ�f §¡¨£
Ñ*¨m¸q¿w¹wÀq»zÑ.IÜÐ,Ô-Ø—m‘m“o×%Ð%Ø÷-~÷ ~ð ~ð: ˆ	Ü‹uˆò	ð —\‘\“^×#ˆÙ! $Ó'ˆÙàŸ-™-ð 
)ó 
÷ 
ˆEô 	�œC ›J˜< tÐ,Ô-Øò 	%ˆBØ�%‹y˜R ™Y¨dÒ2Ø—‘˜˜E™Ô#Ø× Ñ  Õ$ð	%ô ˜˜5 1™9Ó%ò 	.ˆBÜ#˜ K°¨tÐ4ˆGØŸ™¨°¨yÐ8gÐ&hÓi×iˆCÜ˜#œsÔ#¨¯©°uÔ(=Ü˜˜R˜D ¨c°#°2¨h¨ZÐ8Ô9ÙÙ% cÓ*ˆEÙÜ˜˜R˜D Ð,Ô-ÙÜ�E˜"˜˜U¤3 u£: ,¨dÐ3Ô4Øò )�Ø�e“9  E¡°$Ò!6Ø—H‘H˜R ™YÔ'Ø×$Ñ$ RÕ(ð)ð ×'Ñ'¨Ó-×-Ñ-ð	.ô" 	Ð#¤C¨	£NÐ#3°4Ð8Ô9ð ˆÜ  Ó+ó (	‰GˆC�Ü�C˜˜A™�w˜a¤ I£Ð/¨r°"°W±+¸c¸rÐ2BÐ1CÀ3ÐGÔHðØ!ŸY™Y r¨%¡yÐ=OÐY^˜YÓ_×_�Ø×+Ñ+¨DÓ1×1Ð1Ø!Ÿ\™\›^×+�ð �w‘KˆEÜ—	‘	ÐLÈdÓSˆAÙ�Q—W‘W˜Q“Z×%Ñ%Ô'ØŸ™ ›
×(Ñ(Ó*�Ø˜&‘zˆHÜ—	‘	ÐGÈÓNˆAÙÜ—Y‘YÐ3°Q·W±W¸Q³ZÓ@�ÙØ!Ÿx™x›z�HØˆGÜ—	‘	Ð^Ð`dÓeˆAÙØŸ'™' !›*×*Ñ*Ó,�ÙØ—y‘yÐ!>Ó?�Ø˜!’8Ø ŸI™I c¨4Ó0°1Ñ4�EØ" 5¨¨u©Ð5�GØ—=‘=”?ÜÐ,Ô-ÙÜ—f‘f˜Z¨´D©¸3Ñ)>ÀÓHˆGÜ—f‘f˜Y¨´$©¸Ñ(<¸gÓFˆGØ�N‰NØØ˜%‘yØ$Ü&Ø"Øñö ðC(	ðR �m‰m‹o×Ð÷}~÷ ~ô@ 
ˆF”3�w“<�. 
Ð
+Ô,ÙÜ˜ ,Ô/Üˆw‹<ÐðG~ùð
ùð
nùð 	/ùØ#ùð qùØ-ùØ'ùð
 &ùð+~úô. ò 	Ü�M¤# a£&¨¨# , Ð0Ô1Ø—-‘-“/×!Ñ!Û÷5~÷ ~ñ ~ûð.	úð& $ùð
ùð( jùð .ùð `ùØ1ùØ+úÜò ÜÐ)¬#¨a«&°°#¨,¨Ð8Ô9ÝûðúðF 	ùð}~ø÷ ~÷ ~ò ~üsÿ  ‚Z5šW›Z5ž$ZÁWÁ#ZÁ&W"Á'ZÂW%ÂZÂW(ÂZÂ$W:ÃW+ÃW:ÃW.ÃW:Ã3W1Ã4BW:ÆW4ÆW:ÆZ5Æ#W7Æ$Z5Æ)"ZÇYÇ"ZÇ.YÇ/&ZÈZÈAZÉ:YÉ;A;ZË7ZË?;ZÌ:YÌ;AZÎY)Î/Y Î0Y)ÏY#Ï	Y)Ï Y&Ï!Y)Ï%F1ZÖZÖZÖZ5Ö&ZÖ'6Z5×Z×"Z×%Z×(Z×+W:×.W:×1W:×4W:×7Z5×:	YØ-YØ0X3Ø1YØ6ZØ:Z5ÙYÙZ5ÙYÙZÙZÙZÙZÙ Y)Ù#Y)Ù&Y)Ù)	ZÙ2ZÚZÚZÚZÚZ5ÚZ2Ú%Z(Ú&Z2Ú-Z5c                  óž  — dd l } | j                  «       }|j                  dt        d¬«       |j	                  «       }t        «       }|sy 	 t        j                  t        |j                  ¬«      «      }t        d|› d�«       t        j                  |j                  «       «       y # t        j                  |j                  «       «       w xY w)Nr   z--pagesé   )ÚtypeÚdefault)rc   zDone: z records)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr   ÚasyncioÚrunry   rc   r   ÚosrV   Úfileno)r~   Úparserr   ÚlockÚns        r   ÚmainrŠ   ²   s•   € ÛØ×$Ñ$Ó&€FØ
×Ñ˜	¬°QÐÔ7Ø×ÑÓ€DÜ‹>€DÙØð Ü�K‰Kœ	¨¯
©
Ô3Ó4ˆÜ��q�c˜Ð"Ô#ä
�‰�—‘“ÕøŒ�‰�—‘“Õús   Á8B' Â'%CÚ__main__)i  )r{   )Ú__doc__Úsysr…   r1   rƒ   Újsonr	   r   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r6   r]   rb   r   rN   r   ry   rŠ   Ú__name__© r=   r   ú<module>r—      s…   ðñ	÷ /× .× .Ó .Ø ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à!€Ø>€
Ø$€	Ø"€	àv€óó$FòR ð ˆzÒÙ…Fð r=   