Ë
    ¸¬uj|  ã                   óV  — 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mZm	Z	 ddl
ZddlZej                  j                  dd«      ZdZdZdZed	z   Zd
diZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  r2dej@                  v Z! ee!¬«      Z" e# ejH                  e"d¬«      «       yy)u  
åœŸé»˜ç‰¹å�³æ——äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š çˆ¬è™«
CMS: TRS WCM é�™æ€�åˆ†é¡µ
åˆ—è¡¨: index.html â†’ index_{N-1}.html  (10æ�¡/é¡µ, ~45é¡µ)
è¯¦æƒ…: /ywdt/tzgg/YYYYMM/t2026XXXX.html

è¿�è¡Œ: python3 crawl_tmtyq.py [--full]
  --full: å…¨é‡� (æ‰€æœ‰45é¡µ)
  ä¸�åŠ : ä»…ç¬¬1é¡µ (æ—¥è·‘å¢žé‡�)
é    N)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu(   åœŸé»˜ç‰¹å�³æ——äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   åœŸé»˜ç‰¹å�³æ——äººæ°‘æ”¿åºœzhttp://www.tmtyq.gov.cnz/ywdt/tzgg/z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é2   é   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú /root/gov_crawler/crawl_tmtyq.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                  ó~   — ddl m } m}m} | j                  |j                  «       |d¬«      z
  j                  d«      S )Nr   ©ÚdatetimeÚtimezoneÚ	timedeltaiG  )Údaysz%Y-%m-%d)r   r   r   ÚnowÚutcÚstrftimer   s      r   Ú
get_cutoffr      s0   € ß6Ñ6Ø�L‰L˜Ÿ™Ó&©¸Ô)>Ñ>×HÑHÈÓTÐTr   c                 óˆ  — t        j                  t        «      }|j                  «       }dx}}| D ]I  }	 |j	                  dt
        |d   |d   |d   t        |d   f«       |j                  dkD  r|dz  }n|dz  }ŒK |j                  «        |j                  «        ||fS # t        $ r}t        d|› �«       Y d }~ŒŒd }~ww xY w)	Nr   zrINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, source_url, content) VALUES (?,?,?,?,?,?)ÚtitleÚpage_urlÚpublish_dateÚcontenté   u   DBå†™å…¥é”™è¯¯: )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountÚ	Exceptionr   ÚcommitÚclose)ÚarticlesÚconnÚcÚsavedÚskippedÚartÚes          r   Ú
save_to_dbr2   #   sÒ   € Ü�?‰?œ7Ó#€DØ�‰‹€AØÐ€EˆGØò 	(ˆð	(Ø�I‰Ið EÜ˜C ™L¨#¨j©/¸3¸~Ñ;NÔPVÐX[Ð\eÑXfÐgôð �z‰z˜AŠ~˜u¨™z™uØ˜Q‘,�'øð	(ð 	‡K�K„MØ‡J�J„LØ�'ˆ>Ðøô	 ò 	(ÜÐ" 1 #Ð&×'Ñ'ûð	(ús   ´AB Â 	CÂ)B<Â<Cc                 ó   — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |d¬«      }|j                  «       j                  «       S # t        $ r}t        d| d d › d|› �«       Y d }~y d }~ww xY w)N)Úheadersé   )Útimeoutu   è¯·æ±‚å¤±è´¥ é<   ú: )	ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecoder(   r   )ÚurlÚreqÚrespr1   s       r   Ú
fetch_pagerC   5   s|   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#Ð#øÜò Üˆm˜C  ˜H˜: R¨ sÐ+Ô,Üûðús   §>A& Á&	BÁ/BÂBc                 óŒ  — g }t        j                  dt         j                  «      }|j                  | «      D ]‰  }|j	                  d«      }|j	                  d«      j                  «       }|j	                  d«      }|j                  d«      r|dd }|j                  d«      s	t        |z   n|}|j                  |||f«       Œ‹ |S )u   ä»Žåˆ—è¡¨é¡µæ��å�–æ–‡ç« ä¿¡æ�¯ze<li>.*?<a href="([^"]+)"[^>]*>\s*<span>\s*([^<]+?)\s*</span>\s*<span>\s*(\d{4}-\d{2}-\d{2})\s*</span>r    é   é   z./NÚhttp)	ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithÚLIST_URLÚappend)Ú	html_textÚitemsÚpatternÚmÚhrefr   Úpub_dateÚfull_urls           r   Úextract_list_itemsrX   >   sÂ   € à€EÜ�j‰jð  Bô  DF÷  DMñ  DMó  N€GØ×Ñ˜iÓ(ò 2ˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆØ—7‘7˜1“:ˆà�?‰?˜4Ô Ø˜˜�8ˆDØ*.¯/©/¸&Ô*A”8˜d’?ÀtˆØ�‰�h  xÐ0Õ1ð2ð €Lr   c           	      óŽ  — t        «       }t        d|› �«       g }t        d| «      D �]5  }|dk(  r
t        dz   }nt        d|› d�z   }t        d|dz   › d|› �«       t	        |«      }|s nöt        |«      }t        d	t        |«      › d
�«       |st        d|dz   › d�«        n½|D ���	cg c]  \  }}}	|	|k\  sŒ|||	f‘Œ }
}}}	t        dt        |
«      › dt        |«      › �«       |
D ]  \  }}}	|j                  |||	dœ«       Œ |D ��	cg c]  \  }}}	|	‘Œ
 }}}	|r+t        |«      |k  rt        dt        |«      › d|› d�«        nt        j                  d«       �Œ8 t        «       }g }|D ]/  }|d   |vsŒ|j                  |d   «       |j                  |«       Œ1 t        dt        |«      › d
�«       |S c c}	}}w c c}	}w )u   èŽ·å�–æ‰€æœ‰æ–‡ç« å…ƒä¿¡æ�¯u   æˆªæ­¢æ—¥æœŸ: r   z
index.htmlÚindex_z.htmlu
   åˆ—è¡¨é¡µ r    r8   u	     æ‰¾åˆ° u    æ�¡u     é¡µ u    æ— æ•°æ�®ï¼Œç»ˆæ­¢u     è¿‘3å¹´: ú/)r   r@   rV   u     æœ¬é¡µæœ€æ–°æ—¥æœŸ z < u	   ï¼Œç»ˆæ­¢g333333Ó?r@   u
   å…±æ”¶é›† )r   r   ÚrangerO   rC   rX   ÚlenrP   ÚmaxÚtimeÚsleepÚsetÚadd)Ú	max_pagesÚcutoffÚall_articlesÚpgr@   ÚhtmlrR   ÚuÚtÚdÚvalidÚ_ÚdatesÚseenÚuniqueÚas                   r   Úfetch_article_listrq   M   sí  € ä‹\€FÜˆ.˜˜Ð!Ô"à€Lä�A�yÓ!ó ˆØ�Š7Ü˜\Ñ)‰Cä˜v b T¨Ð/Ñ/ˆCäˆj˜˜A™˜˜b  Ð&Ô'Ü˜#‹ˆÙÙä" 4Ó(ˆÜˆiœ˜E›
�| 4Ð(Ô)áÜ�&˜˜A™˜Ð1Ð2Ô3Ùð +0×?Ð?™w˜q ! Q°1¸³;�!�Q˜’Ð?ˆÒ?Üˆkœ#˜e›*˜ Q¤s¨5£z lÐ3Ô4àò 	G‰GˆAˆq�!Ø×Ñ¨!°AÀ1Ñ EÕFð	Gð #(×(‘w�q˜!˜Q’Ð(ˆÑ(Ù”S˜“Z &Ò(ÜÐ'¬¨E«
 |°3°v°h¸iÐHÔIÙä�
‰
�3Žð?ôD ‹5€DØ€FØò ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�M‰M˜!Õðô
 ˆ*”S˜“[�M Ð&Ô'Ø€Mùô/ @ùó )s   Â)F:
Â8F:
ÄGc                 ó~  — t        | «      }|syt        j                  d|t        j                  «      }|r4t        j                  dd|j                  d«      «      j                  «       nd}t        j                  d|«      }|r|j                  d«      nd}t        j                  d|t        j                  «      }d}|ro|j                  d«      }t        j                  dd|t        j                  ¬	«      }t        j                  d
d|t        j                  ¬	«      }|j                  «       }|| |t        |xs |dœS )u   æŠ“å�–è¯¦æƒ…é¡µNz<h1>(.*?)</h1>z<[^>]+>Ú r    u#   å�‘æ–‡æ—¶é—´:\s*(\d{4}-\d{2}-\d{2})z?<div[^>]*class="trs_editor_view[^"]*"[^>]*>(.*?)</div>\s*</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)r   r   r   Ú
source_urlr   )rC   rH   ÚsearchrJ   ÚsubrL   rM   r&   )	r@   rg   Útmr   ÚdmrV   ÚcmÚcontent_htmlÚraws	            r   Úfetch_detailr}   €   s  € ä�c‹?€DÙØô 
�‰Ð$ d¬B¯I©IÓ	6€BÙ;=ŒB�F‰F�:˜r 2§8¡8¨A£;Ó/×5Ñ5Ô7À2€Eô 
�‰Ð9¸4Ó	@€BÙ ˆr�x‰x˜Œ{ b€Hô 
�‰ÐUÐW[Ô]_×]fÑ]fÓ	g€BØ€LÙ	Ø�h‰h�q‹kˆÜ�f‰fÐ1°2°sÄ"Ç)Á)ÔLˆÜ�f‰fÐ/°°SÄÇ	Á	ÔJˆØ—y‘y“{ˆð ØØ ÜØÒ( 5ñð r   Fc                 óp  — | rt         nd}t        d| rdnd› d|› d�«       t        |«      }|st        d«       dddd	œS t        d
t        |«      › d�«       g }t	        t
        ¬«      5 }|D �ci c]  }|j                  t        |d   «      |“Œ }}t        t        |«      «      D ]}  \  }}||   }		 |j                  «       }
|
r9|j                  |
«       t        d|dz   › dt        |«      › d|	d   d d › d�«       n't        d|dz   › dt        |«      › d|	d   d d › d�«       Œ 	 d d d «       t        |«      \  }}t        dt        |«      › d|› d|› �«       t        |«      ||d	œS c c}w # t        $ r3}t        d|dz   › dt        |«      › d|	d   d d › d|› �«       Y d }~Œÿd }~ww xY w# 1 sw Y   Œ‡xY w)Nr    u   å¼€å§‹çˆ¬å�– (full=u   æ˜¯u   å�¦z, pages=ú)u   æ— æ–‡ç« å�¯çˆ¬r   )Útotalr.   r/   u   çˆ¬å�–è¯¦æƒ… (u    æ�¡))Úmax_workersr@   u   è¯¦æƒ… [r[   z]: r   é(   u   ... âœ“u   ... â�Œé   u   ... â�Œ u   å®Œæˆ�: total=z, saved=z
, skipped=)Ú	MAX_PAGESr   rq   r]   r   ÚNUM_THREADSÚsubmitr}   Ú	enumerater   ÚresultrP   r(   r2   )Úfullrc   r+   ÚresultsÚexecutorrp   ÚfuturesÚiÚfuturer0   rˆ   r1   r.   r/   s                 r   Úrunr�   Ÿ   sò  € Ù!•	 q€IÜÐ
¡t™e°Ð7°xÀ	¸{È!ÐLÔMô " )Ó,€HáÜÐÔØ Q°1Ñ5Ð5ô ˆ.œ˜X›˜ uÐ-Ô.Ø€GÜ	¬Ô	4ð W¸ØGOÖPÀ!�8—?‘?¤<°°5±Ó:¸AÑ=ÐPˆÐPÜ"¤<°Ó#8Ó9ò 
	W‰IˆAˆvØ˜&‘/ˆCðWØŸ™›�ÙØ—N‘N 6Ô*Ü˜( 1 Q¡3 % q¬¨X«¨°s¸3¸w¹<ÈÈÐ;LÐ:MÈWÐUÕVä˜( 1 Q¡3 % q¬¨X«¨°s¸3¸w¹<ÈÈÐ;LÐ:MÈWÐUÔVøñ
	W÷Wô   Ó(�N€Eˆ7Üˆ.œ˜X›˜ x°¨w°jÀÀ	ÐJÔKÜ˜“]¨U¸wÑGÐGùò Qøô ò WÜ�h˜q ™s˜e 1¤S¨£] O°3°s¸7±|ÀCÀRÐ7HÐ6IÈÐRSÐQTÐU×VÑVûðWú÷Wð WúsI   Á)F,Á.!E(Â!F,Â1A2E-Ä#F,Å(F,Å-	F)Å6)F$ÆF,Æ$F)Æ)F,Æ,F5Ú__main__z--full)r‰   )Úensure_ascii)F)%Ú__doc__ÚsysrH   r_   ÚosÚjsonr!   Úconcurrent.futuresr   r   Úurllib.requestr9   Úurllib.errorÚenvironÚgetr#   r   r&   ÚBASE_URLrO   r<   r„   r…   r   r   r2   rC   rX   rq   r}   r�   Ú__name__Úargvr‰   Úresr   Údumps© r   r   ú<module>r¡      sÅ   ðñ	÷ (× '× 'ß ?ß #à
�*‰*�.‰.˜Ð&7Ó
8€Ø6€	Ø	&€à$€Ø�mÑ#€àÐWÐ
X€Ø€	Ø€ò.òUòò$òò1òfó>Hð@ ˆzÒØ�s—x‘xÐ€DÙ
�4Œ.€CÙ	ˆ*ˆ$�*‰*�S uÔ
-Õ.ð r   