Ë
    æiŸjt  ã                   óz  — 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ddlmZm	Z	 ddl
mc mZ  ej                  dd«      ZdZdZdZd	Z ej(                  «        e	d
¬«      z
  j+                  d«      ZdedœZ ej0                  «       Zej4                  j7                  e«       d„ Zd„ Zd„ Zedk(  r e«        yy)u  Crawl ä¿®æ°´åŽ¿ - é¡¹ç›®çŽ¯è¯„ (TRS JS åˆ—è¡¨ â†’ data_<year>.xml + x-api-key)

2026-09-08 ä¿®å¤�: é�™æ€� index.html åˆ—è¡¨å·²æ”¹å‰�ç«¯ JS(data_<year>.xml + enc.js å¼‚æ­¥æ¸²æŸ“),
requests æ‹¿åˆ°çš„ HTML æ— è¡Œ â†’ æ”¹ä¸ºç›´æŽ¥æŠ“å�Œç›®å½• data_<å¹´ä»½>.xml (éœ€ x-api-key å¤´)ã€‚
é    N)ÚdatetimeÚ	timedeltaÚ	SEARCH_DBz/root/search.dbu   ä¿®æ°´åŽ¿ - é¡¹ç›®çŽ¯è¯„zhttps://www.xiushui.gov.cnz/fdzdxxgk/01/04/04/11/03/z********^^^^^^^^iG  )Údaysz%Y-%m-%dzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)z
User-Agentz	x-api-keyc                 óÚ  ‡— t         › t        › d| › d�}	 t        j                  |d¬«      }d|_        |j
                  }	 t        j                  |«      }g }|j                  d«      D ]l  Šˆfd„} |d«       |d«       |d«      }}
}	|	r|
sŒ%|
j                  d«      st         t        z   |
j                  d«      z   }
|j                  |	|
|d d dœ«       Œn |S # t        $ r}t        d| › d|› �«       g cY d }~S d }~ww xY w# t        $ r_ 	 t        j                  dd	|d
¬«      }t        j                  |«      }n+# t        $ r}t        d| › d|› �«       g cY d }~cY S d }~ww xY wY �Œw xY w)NÚdata_z.xmlé   ©Útimeoutúutf-8z  [ERROR] data_z.xml: z^[^<]*<ú<é   )Úcountz.xml parse: ÚITEMc                 óˆ   •— ‰j                  | «      }|�-dj                  |j                  «       «      j                  «       S dS )NÚ )ÚfindÚjoinÚitertextÚstrip)ÚtagÚeÚits     €ú"/root/gov_crawler/crawl_xiushui.pyÚgzfetch_items_xml.<locals>.g.   s7   ø€ Ø—‘˜“ˆAØ45°M�2—7‘7˜1Ÿ:™:›<Ó(×.Ñ.Ó0ÐIÀrÐIó    ÚTITLEÚPUBURLÚRELTIMEÚhttpz./é
   )ÚtitleÚurlÚdate)ÚBASE_URLÚXML_DIRÚsessionÚgetÚencodingÚtextÚ	ExceptionÚprintÚETÚ
fromstringÚreÚsubÚiterÚ
startswithÚlstripÚappend)Úyearr#   ÚrespÚrawr   ÚrootÚsÚitemsr   r"   ÚpubÚrelr   s               @r   Úfetch_items_xmlr=      ss  ø€ ÜˆJ”w�i˜u T F¨$Ð
/€CðÜ�{‰{˜3¨ˆ{Ó+ˆØˆŒØ�i‰iˆðÜ�}‰}˜SÓ!ˆð €EØ�i‰i˜Óò 	Eˆô	Jñ ˜G›*¡a¨£k±1°Y³<�CˆsˆÙ™CØØ�~‰~˜fÔ%ÜœWÑ$ s§z¡z°$Ó'7Ñ7ˆCØ�‰˜u¨S¸#¸c¸r¸(ÑCÕDð	Eð €Løô/ ò Ü� ˜v V¨A¨3Ð/Ô0Ø�	ûðûô
 ò ð	Ü—‘�z 3¨°1Ô5ˆAÜ—=‘= Ó#‰DøÜò 	Ü�O D 6¨°a°SÐ9Ô:Ø�Iûð	úò ðús_   •*C Á D Ã	C?Ã"C:Ã4C?Ã:C?Ä	E*Ä.D;Ä:E*Ä;	E#ÅEÅE#ÅE*ÅE#Å#E*Å)E*c                 óÒ  — 	 t         j                  | 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%t        j                  d|t
        j                  «      }|s%t        j                  d|t
        j                  «      }|s)t        j                  d|t
        j                  «      }|r|}|r¢|j                  d«      j                  «       }	t        j                  dd|	t
        j                  t
        j                  z  ¬«      }	t        j                  dd|	t
        j                  t
        j                  z  ¬«      }	|||	j                  «       fS ||dfS # t        $ r Y yw xY w)Nr	   r
   r   )r   r   r   z+<meta name="ArticleTitle" content="([^"]*)"r   r   z&<meta name="PubDate" content="([^"]*)"r!   zQ<div class="view TRS_UEDITOR[^>]* id="article-box">(.*?)</div>\s*</div>\s*</font>z><div[^>]* id="article-box"[^>]*>(.*?)</div>\s*</div>\s*</font>z&<font[^>]* id="Zoom"[^>]*>(.*?)</font>z]<div[^>]*class="[^"]*(?:view\s+TRS_UEDITOR|TRS_Editor|trs_editor_view)[^"]*"[^>]*>(.*?)</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)r'   r(   r)   r*   r+   r/   ÚsearchÚgroupr   ÚDOTALLr0   ÚI)
r#   r6   ÚhtmlÚtmr"   ÚdmÚdate_strÚmÚm2Úcontent_raws
             r   Úfetch_detailrK   :   s§  € ðÜ�{‰{˜3¨ˆ{Ó+ˆØˆŒØ�y‰yˆô 
�‰ÐAÀ4Ó	H€BÙ#%ˆB�H‰H�Q‹K×ÑÔ¨2€EÜ	�‰Ð<¸dÓ	C€BÙ#%ˆr�x‰x˜‹{˜3˜BÑ¨2€Hä
�	‰	ÐfÐhlÔnp×nwÑnwÓx€AÙÜ�I‰IÐWÐY]Ô_a×_hÑ_hÓiˆÙÜ�I‰IÐ?ÀÄrÇyÁyÓQˆÙä�Y‰YÐwÐy}ô  @B÷  @Iñ  @Ió  JˆÙØˆAáØ—g‘g˜a“j×&Ñ&Ó(ˆÜ—f‘fÐ9¸2¸{ÔRT×R[ÑR[Ô^`×^bÑ^bÑRbÔcˆÜ—f‘fÐ7¸¸[ÔPR×PYÑPYÔ\^×\`Ñ\`ÑP`ÔaˆØ�h × 1Ñ 1Ó 3Ð3Ð3Ø�(˜BÐÐøô1 ò Ùðús   ‚*G Ç	G&Ç%G&c                  óú  — dt         j                  v } t        dt        › d�«       t	        j
                  t        «      }|j                  «       }d\  }}}t        j                  «       }t        j                  «       j                  }t        t        d d «      }| st        t        ||dz
  d«      «      n|g}	g }
|	D ]9  }t!        |«      }t        d|› d	t#        |«      › d
�«       |
j%                  |«       Œ; t        dt#        |
«      › �«       |
D �]~  }|d   r|d   t        k  r|dz  }Œ|j'                  d|d   f«      j)                  «       }|r|dz  }ŒG	 t+        |d   «      \  }}}|s|s|dz  }t        d|d   d d › �«       Œx|xs |d   }|xs |d   }t        t1        j2                  |d   j5                  «       «      j7                  «       d d d«      dz  }|rt        |j9                  dd«      «      nd}|rt;        j<                  dd|«      d d n|}t;        j<                  dd|«      j?                  «       }	 |j'                  d|t        |d   |d   |||||f	«       |j@                  dkD  r|dz  }t        j.                  d«       �Œ� |jC                  «        	 |j                  «       }|j'                  d t        f«       |j'                  d!t        f«      jE                  «       }|D ]  }|j'                  d"|«       Œ |jC                  «        t        d#t#        |«      › d$�«       |jG                  «        t        j                  «       |z
  }t        d&|d'›d(|› d)|› d*|› �«       y # t,        $ r3}t        d|› �«       t        j.                  d«       |dz  }Y d }~�Œ—d }~ww xY w# t,        $ r}t        d|› �«       |dz  }Y d }~�ŒWd }~ww xY w# t,        $ r}t        d%|› �«       Y d }~ŒÅd }~ww xY w)+NÚincrementalz=== z ===)r   r   r   é   r   éÿÿÿÿz  z: z items from xmlz  total items: r$   zNSELECT 1 FROM gov_raw WHERE page_url=? AND content IS NOT NULL AND content!=''r#   z  [ERROR] Detail: z
  [EMPTY] r"   é(   é   é   l            ú-r   r   z<[^>]+>éÈ   z\s+ú zŽINSERT OR IGNORE INTO gov_raw(id, site_name, source_url, page_url, title, publish_date, content, summary, date_rank) VALUES(?,?,?,?,?,?,?,?,?)z  [DB] g333333Ó?zPDELETE FROM gov_search WHERE rowid IN (SELECT id FROM gov_raw WHERE site_name=?)zCSELECT id, title, site_name, summary FROM gov_raw WHERE site_name=?zRINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES(?,?,?,?)z  FTS: z records rebuiltz  FTS error: z
Done (z.0fzs). Inserted z
, Skipped z, Old )$ÚsysÚargvr,   Ú	SITE_NAMEÚsqlite3ÚconnectÚDB_PATHÚcursorÚtimer   Únowr5   ÚintÚCUTOFF_DATEÚlistÚranger=   ÚlenÚextendÚexecuteÚfetchonerK   r+   ÚsleepÚhashlibÚmd5ÚencodeÚ	hexdigestÚreplacer/   r0   r   ÚrowcountÚcommitÚfetchallÚclose)Úis_incrementalÚconnÚcÚinsertedÚskippedÚ	old_totalÚ
start_timeÚnow_yearÚcutoff_yearÚyearsÚ	items_allÚyÚrecsÚitemÚhasr"   rG   Úcontentr   Úfinal_titleÚ
final_dateÚint_idÚ	date_rankÚsummaryÚc2ÚrowsÚrÚelapseds                               r   ÚmainrŠ   Z   sô  € Ø"¤c§h¡hÐ.€NÜ	ˆD”�˜4Ð
 Ô!ä�?‰?œ7Ó#€DØ�‰‹€AØ#*Ñ €Hˆg�yÜ—‘“€Jä�|‰|‹~×"Ñ"€HÜ”k " 1�oÓ&€KÙ>LŒD”�x ¨q¡°"Ó5Ô6ÐS[ÐR\€EØ€IØò ˆÜ˜qÓ!ˆÜ��1�#�Rœ˜D›	�{ /Ð2Ô3Ø×Ñ˜Õðô 
ˆOœC 	›NÐ+Ð
,Ô-àó (ˆØ�Š<˜D ™L¬;Ò6Ø˜‰NˆIØà�i‰iÐhÐkoÐpuÑkvÐjxÓy÷  Cñ  Có  EˆÙØ�q‰LˆGØð	Ü'3°D¸±KÓ'@Ñ$ˆE�8˜Wñ ™uØ�q‰LˆGÜ�J˜t G™}¨S¨bÐ1Ð2Ð3Ô4ØàÒ,˜t G™}ˆØÒ-  f¡ˆ
Ü”W—[‘[  e¡×!3Ñ!3Ó!5Ó6×@Ñ@ÓBÀ3ÀBÐGÈÓLÐPUÑVˆÙ8B”C˜
×*Ñ*¨3°Ó3Ô4Èˆ	Ù;B”"—&‘&˜ R¨Ó1°$°3Ñ7ÈˆÜ—&‘&˜  gÓ.×4Ñ4Ó6ˆð		Ø�I‰Ið aØœ D¨¡K°°e±¸kÈ:ÐW^Ð`gÐirÐsôð �z‰z˜AŠ~Ø˜A‘�ô 	�
‰
�3ŽðQ(ðT 	‡K�K„Mð	#Ø�[‰[‹]ˆØ
�
‰
ÐeÔhqÐgsÔtØ�z‰zÐ_ÔbkÐamÓn×wÑwÓyˆØò 	pˆAØ�J‰JÐkÐmnÕoð	pà�‰ŒÜ�œ˜D›	�{Ð"2Ð3Ô4ð 	‡J�J„LÜ�i‰i‹k˜JÑ&€GÜ	ˆH�W˜S�M ¨x¨j¸
À7À)È6ÐR[ÐQ\Ð
]Õ^øôY ò 	ÜÐ& q cÐ*Ô+Ü�J‰J�qŒMØ�q‰LˆGÝûð		ûô2 ò 	Ü�G˜A˜3�-Ô Ø�q‰LŽGûð	ûô ò #Ü�˜a˜SÐ!×"Ñ"ûð#úsI   ÅM0É9N/Ê#BO Í0	N,Í9(N'Î'N,Î/	OÎ8OÏOÏ	O:Ï"O5Ï5O:Ú__main__) Ú__doc__Úrequestsr/   rY   rV   r]   rh   Úosr   r   Úxml.etree.ElementTreeÚetreeÚElementTreer-   Úgetenvr[   rX   r%   r&   ÚXML_API_KEYr^   Ústrftimer`   ÚHEADERSÚSessionr'   ÚheadersÚupdater=   rK   rŠ   Ú__name__© r   r   ú<module>r›      sÆ   ðñ÷
 5× 4× 4Ó 4ß (ß "Ð "à
ˆ"�)‰)�KÐ!2Ó
3€Ø&€	Ø'€Ø
%€Ø €Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€ð DØñ€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òò@ò@K_ð\ ˆzÒÙ…Fð r   