Ë
    65xj¿  ã                   ó   — 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mZ ddlm	Z	 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ  ej"                  «        ed¬«      z
  j%                  d«      Zd	Zd
ZdZedz   ZddgZdZdedœZd„ Zd„ Zd„ Zedk(  r e«        yy)uE  crawl_lianxi_tzgg.py - æ¿‚æºªåŒºäººæ°‘æ”¿åºœ-æ”¿åŠ¡èµ„è®¯-é€šçŸ¥å…¬å‘Š (MS UI åŠ¨æ€�åˆ—è¡¨)

ç«™ç‚¹: https://www.lianxi.gov.cn/zwzx/tzgg/
CMS: TRS è¯¦æƒ… (zwdetail_3_1 TRS_UEDITOR div#content) + MS UI (ms-controller) åŠ¨æ€�å¹´ä»½åˆ—è¡¨
åˆ—è¡¨: <li><span class="bf-pass">æ—¥æœŸ</span><a href="./YYYYMM/tYYYYMMDD_ID.html?dD1..." title="æ ‡é¢˜">
      å¹´ä»½ç­›é€‰ ?year=YYYY&page=N (ä»…2026:4é¡µ61æ�¡/2025:2é¡µ23æ�¡, è¶Šç•Œé¡µå›žé€€é»˜è®¤é�žç©º!)
      æ··å�ˆå¤–é“¾ api.phxazx.cn (æ¿‚æºªæ–°é—»ç½‘) â†’ è¿‡æ»¤å�ªç•™æœ¬åŸŸ /zwzx/tzgg/\d{6}/t\d+_\d+\.html
è¯¦æƒ…: meta[ArticleTitle] + meta[PubDate] + div#content å¹³è¡¡div (requests ç›´æŠ“, æ— éœ€playwright)
é™„ä»¶: ./P0...docx/pdf ç›¸å¯¹è·¯å¾„ â†’ urljoin ç»�å¯¹åŒ–
æ ·æœ¬: æ¿‚æºªåŒº2025å¹´çœ�çº§è´¢æ”¿æ”¯æŒ�ç¬¬äºŒè½®åœŸåœ°æ‰¿åŒ…åˆ°æœŸå�Žå†�å»¶é•¿30å¹´è¯•ç‚¹é¡¹ç›®å®žæ–½æ–¹æ¡ˆ (2026-08-07)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úpush_to_searchdbiG  )Údaysz%Y-%m-%du"   æ¿‚æºªåŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   æ±Ÿè¥¿zhttps://www.lianxi.gov.cnz/zwzx/tzgg/iê  ié  é   úoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)z
User-AgentÚRefererc                 ó¼  — ddl m} t        › d| › d|› �} |«       5 }|j                  j	                  d¬«      }|j                  dd¬	«      }|j                  «       }|j                  |d
d¬«       |j                  d«       |j                  «       }|j                  «        ddd«       t        j                  d«      }	g }
|	D ]Š  \  }}}t        j                  dd|«      j                  «       }t        |«      dk  rŒ;t        j                   d|«      }|sŒTt#        t        |j%                  d«      d   «      }|
j'                  |||dœ«       ŒŒ |
S # 1 sw Y   Œ²xY w)u*   MS UI åŠ¨æ€�åˆ—è¡¨å¿…é¡» playwright æ¸²æŸ“r   )Úsync_playwrightz?year=z&page=T)Úheadlessr	   zzh-CN)Ú
user_agentÚlocalei`ê  Únetworkidle)ÚtimeoutÚ
wait_untiliÄ	  NzN<li><span class="bf-pass">([\d-]+)</span><a href="([^"]+)"[^>]*title="([^"]*)"z\s+Ú r   z\.?/?(\d{6}/t\d+_\d+\.html)ú?)ÚurlÚpub_dateÚtitle)Úplaywright.sync_apir   ÚLIST_URLÚchromiumÚlaunchÚnew_contextÚnew_pageÚgotoÚwait_for_timeoutÚcontentÚcloseÚreÚfindallÚsubÚstripÚlenÚmatchr   ÚsplitÚappend)ÚyearÚpage_numr   r   ÚpÚbrowserÚctxÚpageÚhtmlÚitemsÚresultsÚdÚhrefr   ÚmÚfulls                   ú&/root/gov_crawler/crawl_lianxi_tzgg.pyÚfetch_list_with_playwrightr8   !   sQ  € å3ÜˆJ�f˜T˜F &¨¨
Ð
3€CÙ	Ó	ð 	˜aØ—*‘*×#Ñ#¨TÐ#Ó2ˆØ×!Ñ!ð IØð "ó ˆð �|‰|‹~ˆØ�	‰	�#˜u°ˆ	Ô?Ø×Ñ˜dÔ#Ø�|‰|‹~ˆØ�‰Œ÷	ô �J‰JÐhÐjnÓo€EØ€GØò 	E‰ˆˆ4�Ü—‘�v˜r 5Ó)×/Ñ/Ó1ˆÜˆu‹:˜Š>Øä�H‰HÐ3°TÓ:ˆÙØÜ”x §¡¨C£°Ñ!3Ó4ˆØ�‰˜t°¸UÑCÕDð	Eð €N÷-	ð 	ús   œBEÅEc                 óœ  ‡ — dd l }|j                  j                  j                  «        	 |j	                  ‰ dt
        d¬«      }d|_        |j                  }t        j                  d	|«      }|r|j                  d
«      j                  «       nd}t        j                  d|«      }|r|j                  d
«      d d nd}t        j                  d|t        j                   «      }|sy |j#                  d|j%                  «       «      }|d
z   }	d
}
d}t        j&                  d||	d  t        j                   «      D ]J  }|j                  d«      j)                  d«      r|
d
z  }
Œ)|
d
z  }
|
dk(  sŒ4||	|	|j%                  «       z    } n |j                  «       sy t        j*                  dd|t        j,                  t        j                   z  ¬«      }t        j*                  dd|t        j,                  t        j                   z  ¬«      }t        j*                  dd|«      }t        j*                  dˆ fd„|«      }t        j*                  dˆ fd„|«      }t        j*                  dd|«      }t        j*                  dd|«      }|j                  «       }|sy |||dœS # t        $ r+}t        d‰ › d|› �t        j                  ¬«       Y d }~y d }~ww xY w)Nr   )é   é   F)r   ÚheadersÚverifyzutf-8z[WARN] fetch failed: z - )Úfilez+<meta name="ArticleTitle" content="([^"]*)"é   r   z&<meta name="PubDate" content="([^"]*)"é
   z<div[^>]*id="content"[^>]*>ú>z<div[\s>]|</div>z<divz<script.*?</script>)Úflagsz<style.*?</style>z<p[^>]*>z<p>z,href="(?!https?://|//|#|javascript:)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzhref="r?   ú"©r   Úgroup©Úmmr   s    €r7   ú<lambda>zfetch_detail.<locals>.<lambda>c   s    ø€ ˜v¤g¨c°2·8±8¸A³;Ó&?Ð%@ÀÐB€ ó    zsrc="(?!https?://|//)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzsrc="r?   rD   rE   rG   s    €r7   rI   zfetch_detail.<locals>.<lambda>e   s    ø€ ˜u¤W¨S°"·(±(¸1³+Ó%>Ð$?¸qÐA€ rJ   z%^(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+z%(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+$)r   r   r    )ÚrequestsÚpackagesÚurllib3Údisable_warningsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderrr"   ÚsearchrF   r%   ÚIÚfindÚstartÚfinditerÚ
startswithr$   ÚDOTALL)r   rL   Úrr0   Úer5   r   r   ÚgtÚiÚdepthÚbodyrH   s   `            r7   Úfetch_detailre   >   s[  ø€ ÛØ×Ñ×Ñ×.Ñ.Ô0ðØ�L‰L˜ g´wÀuˆLÓMˆØˆŒ
Ø�v‰vˆô 	�	‰	Ð@À$ÓG€AÙ"#ˆA�G‰G�A‹J×ÑÔ¨€EÜ
�	‰	Ð;¸TÓB€AÙ"#ˆq�w‰w�q‹z˜#˜2‰¨€Hä
�	‰	Ð0°$¼¿¹Ó=€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ
ˆQ‰€AØ€EØ€DÜ�k‰kÐ-¨t°A°B¨x¼¿¹Ó>ò ˆØ�8‰8�A‹;×!Ñ! &Ô)Ø�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-�Ùðð �:‰:Œ<ØÜ�6‰6Ð(¨"¨d¼"¿)¹)ÄbÇdÁdÑ:JÔK€DÜ�6‰6Ð&¨¨D¼¿	¹	ÄBÇDÁDÑ8HÔI€Dä�6‰6�+˜u dÓ+€DÜ�6‰6ÐAÛBÀDóJ€Dä�6‰6Ð2ÛAÀ4óI€Dä�6‰6Ð:¸BÀÓE€DÜ�6‰6Ð:¸BÀÓE€DØ�:‰:‹<€DÙØØ¨¸TÑBÐBøôM ò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   «,J Ê	KÊ !KËKc                  óŽ  — t        j                  «       } | j                  dt        t        d¬«       | j                  dt        d¬«       | j                  «       }t        dt        › dt        › �«       g }t        «       }t        D ]ª  }t        d	|j                  d	z   «      D ]Œ  }t        ||«      }|D �cg c]  }|d
   |vsŒ|‘Œ }}t        d|› d|› dt        |«      › dt        |«      › d�	«       |d	kD  r|s Œu|D ]/  }|d
   |v rŒ|j                  |d
   «       |j!                  |«       Œ1 ŒŽ Œ¬ t        dt        |«      › d�«       g }	t#        |«      D ]¢  \  }
}|d   r|d   t        k  rŒt%        |d
   «      }|sŒ)|	j!                  |d   xs |d   |d
   |d
   |d   xs |d   t        |d   dt&        dœ«       |j(                  rt        |	«      |j(                  k\  r nt+        j,                  d«       Œ¤ t        dt        |	«      › d�«       |	rt/        |	d«       t        dt        › dt        |	«      › d�«       y c c}w )Nz--pagesu   æ¯�å¹´ä»½é¡µæ•°)ÚtypeÚdefaultÚhelpz--max-detailr   )rg   rh   z=== z === CUTOFF: r?   r   z  year=z Pz: u    æ�¡ (æ–°å¢ž ú)u   åˆ—è¡¨åŽ»é‡�å�ˆè®¡: u    æ�¡r   r   r    r   )r   r   Ú
source_urlr   Ú	site_namer    ÚsummaryÚ
group_nameg333333Ó?u   çª—å�£å†…: Úlianxi_tzggz	[RESULT] z items)ÚargparseÚArgumentParserÚadd_argumentÚintÚPAGES_PER_YEARÚ
parse_argsrU   Ú	SITE_NAMEÚCUTOFFÚsetÚYEARSÚrangeÚpagesr8   r&   Úaddr)   Ú	enumeratere   Ú
GROUP_NAMEÚ
max_detailÚtimeÚsleepr   )ÚapÚargsÚall_recsÚseen_urlr*   Úpgr1   ÚitÚ	new_itemsÚrecordsrb   r3   s               r7   ÚmainrŠ   n   sH  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C´ÐFW€OÔXØ‡O�O�N¬°a€OÔ8Ø�=‰=‹?€Dä	ˆD”�˜=¬¨Ð
1Ô2à€HÜ‹u€HÜò $ˆÜ˜˜4Ÿ:™:¨™>Ó*ò 	$ˆBÜ.¨t°RÓ8ˆEà&+ÖI ¨r°%©yÀÒ/HšÐIˆIÐIÜ�G˜D˜6  B 4 r¬#¨e«*¨°]Ä3ÀyÃ>ÐBRÐRSÐTÔUØ�AŠv™iÙØò $�Ø�e‘9 Ñ(ØØ—‘˜R ™YÔ'Ø—‘ Õ#ñ	$ñ	$ð$ô 
Ð ¤ X£ ¨tÐ
4Ô5ð €GÜ˜8Ó$ò ‰ˆˆ2ØˆjŠ>˜b ™n¬vÒ5ØÜ˜˜E™Ó#ˆÙØØ�‰Ø�w‘ZÒ. 2 g¡;Ø�e‘9Ø˜U™)Ø˜*™Ò7¨¨J©Ü"Ø˜‘|ØÜ$ñ	
ô 		ð �?Š?œs 7›|¨t¯©Ò>ÙÜ�
‰
�3�ð%ô& 
ˆKœ˜G›�~ TÐ
*Ô+áÜ˜ -Ô0Ü	ˆI”i�[ ¤3 w£< .°Ð
7Õ8ùòI Js   Â4IÃIÚ__main__)Ú__doc__rV   Úosr"   rp   r€   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimerw   rv   r~   ÚBASEr   ry   rt   rQ   r8   re   rŠ   Ú__name__© rJ   r7   ú<module>rš      sÉ   ðñ
÷ #× "Ó "ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø0€	Ø€
Ø"€Ø�-Ñ€Ø	ˆtˆ€Ø€ð DØñ€òò:-Cò`29ðj ˆzÒÙ…Fð rJ   