Ë
    m }j®  ã                   ó  — d 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dl	m	Z	m
Z
 ej                  j                  dej                  j                  dd«      «      Zd	Zed
z   ZdZdZddiZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uA  
crawl_tongbai.py â€” æ¡�æŸ�åŽ¿äººæ°‘æ”¿åºœÂ·é€šçŸ¥å…¬å‘Š
============================================
å®‰æ£šé•‡ä¿¡æ�¯å…¬å¼€ï¼ŒTRS CMSï¼ˆå�—é˜³ç»Ÿä¸€ç«™ç‚¹å¹³å�°ï¼‰
é¦–é¡µé�™æ€�HTMLï¼Œåˆ†é¡µAJAXåŠ è½½ï¼ˆJSæ¸²æŸ“ï¼Œcurlæ— æ³•èŽ·å�–ï¼‰

åˆ—è¡¨ï¼š<li><a href="https://www.tongbai.gov.cn/YYYY/MM-DD/XXXXXXX.html" title="TITLE">TITLE</a><b>YYYY-MM-DD</b></li>
è¯¦æƒ…ï¼š<div class="content" id="content">æ­£æ–‡ | <meta name="PubDate" content="2026/05-26">

ç”¨æ³•:
    python3 crawl_tongbai.py             # å…¨é‡�
    python3 crawl_tongbai.py 1           # å¢žé‡�ï¼ˆå�ªçˆ¬é¦–é¡µï¼‰
é    N)ÚBeautifulSoup)Úurljoin)ÚdatetimeÚ	timedeltaÚ	SEARCH_DBÚGOV_DB_PATHz/root/search.dbzhttps://www.tongbai.gov.cnz/apzrmzf/dtxx/tzgg/u   æ¡�æŸ�åŽ¿äººæ°‘æ”¿åºœu   æ¡�æŸ�åŽ¿é€šçŸ¥å…¬å‘Šz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó    — t        d| › �«       y )Nz
[tongbai] )Úprint)Úmsgs    ú"/root/gov_crawler/crawl_tongbai.pyÚlogr   )   s   € Ü	ˆJ�s�eÐ
Õó    c                 ó‚   — | j                  dd«      j                  dd«      j                  dd«      j                  «       S )zRemove site suffix from titleu#   -é€šçŸ¥å…¬å‘Š-æ¡�æŸ�åŽ¿äººæ°‘æ”¿åºœÚ u   -é€šçŸ¥å…¬å‘Šu   -æ¡�æŸ�åŽ¿äººæ°‘æ”¿åºœ)ÚreplaceÚstrip)Útitles    r   Úclean_titler   -   s9   € à�=‰=Ð>ÀÓC×KÑKØ˜óç�gÐ&¨Ó+¯E©E«Gð4r   c                  óö  — t        dt        › �«       t        j                  t        t        d¬«      } d| _        | j                  }t        |d«      }g }|j                  dd¬«      }|st        d	«       |S |j                  d
«      }|st        d«       |S |j                  dd¬«      D ]µ  }|j                  d«      }|r|j                  d«      sŒ(|d   j                  «       }d|v s|j                  t        «      sŒU|j                  dd«      xs |j                  d¬«      }	|j                  d«      }
|
r|
j                  d¬«      nd}|j                  ||	|f«       Œ· t        dt        |«      › d�«       |S )z7Fetch page 1 list, return [(url, title, date_str), ...]zFetching list: é   ©ÚheadersÚtimeoutúutf-8úhtml.parserÚdivÚzfxxgk_zdgkc)Úclass_z!ERROR: cannot find list containerÚulzERROR: cannot find list <ul>ÚliF)Ú	recursiveÚaÚhrefzmp.weixin.qq.comr   r   T)r   ÚbzFound z articles on page 1)r   ÚLIST_URLÚrequestsÚgetÚHEADERSÚencodingÚtextr   ÚfindÚfind_allr   Ú
startswithÚBASE_URLÚget_textÚappendÚlen)ÚrespÚhtmlÚsoupÚitemsÚlist_divr   r    r"   r#   r   r$   Údate_strs               r   Ú
fetch_listr8   4   sX  € äˆ/œ(˜Ð$Ô%Ü�<‰<œ¬'¸2Ô>€DØ€D„MØ�9‰9€Dä˜˜}Ó-€DØ€Eð �y‰y˜ ~ˆyÓ6€HÙÜÐ/Ô0Øˆà	�‰�tÓ	€BÙÜÐ*Ô+Øˆà�k‰k˜$¨%ˆkÓ0ò .ˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØØ�‰y�‰Ó ˆà Ñ%¨T¯_©_¼XÔ-FØØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆà�G‰G�C‹LˆÙ-.�1—:‘: D�:Ô)°BˆØ�‰�d˜E 8Ð,Õ-ð.ô ˆ&”�U“�Ð/Ð0Ô1Ø€Lr   c                 ó$  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }|j                  d	d
d
¬«      }d}|rt        |«      }d}|j                  dddi¬«      }|rO|j                  d
«      r>|d
   j                  «       }	|	j                  dd«      }		 t        j                  |	d«       |	}|s)t        j                   d|«      }
|
r|
j#                  d«      }|sOt        j                   d| «      }
|
r7|
j#                  d«      › d|
j#                  d«      › d|
j#                  d«      › �}|st        d| › �«       d|fS ||fS # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w# t        $ r Y ŒÆw xY w)z/Return (content_html, date_str) or (None, None)r   r   r   z  ERROR fetching ú: N)NNr   r   Úcontent)r   Úidr   ÚmetaÚnameÚPubDate)Úattrsú/ú-ú%Y-%m-%du"   æ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})é   z/(\d{4})/(\d{2})-(\d{2})/é   é   z  WARNING: no content for )r&   r'   r(   r)   r*   Ú	Exceptionr   r   r+   Ústrr   r   r   ÚstrptimeÚ
ValueErrorÚreÚsearchÚgroup)Úurlr2   r3   Úer4   Úcontent_divÚcontent_htmlr7   r=   ÚrawÚms              r   Úfetch_detailrT   [   s›  € ðÜ�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€Dð —)‘)˜E¨)¸	�)ÓB€KØ€LÙÜ˜;Ó'ˆð €HØ�9‰9�V F¨IÐ#6ˆ9Ó7€DÙ�—‘˜Ô#Ø�9‰o×#Ñ#Ó%ˆà�k‰k˜#˜sÓ#ˆð	Ü×Ñ˜c :Ô.ØˆHñ
 Ü�I‰IÐ;¸TÓBˆÙØ—w‘w˜q“zˆHñ Ü�I‰IÐ2°CÓ8ˆÙØŸ'™' !›*˜ Q q§w¡w¨q£z l°!°A·G±G¸A³J°<Ð@ˆHáÜÐ(¨¨Ð.Ô/Ø�Xˆ~Ðà˜Ð!Ð!øôU ò ÜÐ ˜u B q cÐ*Ô+Üûðûô. ò 	Ùð	ús)   ‚/E Â0F Å	F Å%E;Å;F Æ	FÆFc           
      óÔ  — ddl }| st        d«       yt        dt        › �«       |j                  t        «      }|j	                  «       }d}| D ]6  \  }}}}	 |j                  dt        |t        |«      ||t        f«       |dz  }Œ8 |j                  «        |j                  «        t        d	|› d
t        | «      › d�«       y# t        $ r}	t        d|› d|	› �«       Y d}	~	Œ”d}	~	ww xY w)zUpsert records into search.dbr   NzNo items to savezOpening DB: zœINSERT OR REPLACE INTO gov_raw
                   (site_name, page_url, title, publish_date, content, category)
                   VALUES (?, ?, ?, ?, ?, ?)rD   z  DB error for r:   zSaved rA   z records to DB)Úsqlite3r   ÚDB_PATHÚconnectÚcursorÚexecuteÚ	SITE_NAMEr   ÚSOURCErG   ÚcommitÚcloser1   )
r5   rV   ÚconnÚcÚinsertedrN   r   r7   rQ   rO   s
             r   Ú
save_to_dbrb   Ž   sñ   € ãáÜÐÔØäˆ,”w�iÐ Ô!Ø�?‰?œ7Ó#€DØ�‰‹€Aà€HØ.3ò .Ñ*ˆˆU�H˜lð	.Ø�I‰Ið0ô ØÜ Ó&ØØ Üðô	ð ˜‰M‰Hð.ð& 	‡K�K„MØ‡J�J„LÜˆ&��
˜!œC ›J˜< ~Ð6Õ7øô ò 	.Ü�/ #  b¨¨Ð,×-Ñ-ûð	.ús   Á.CÃ	C'ÃC"Ã"C'c                  óø  — t        t        j                  «      dkD  xr t        j                  d   dk(  } t        j                  «       t        d¬«      z
  j                  d«      }t        d|› �«       t        «       }|st        d«       y |D ���cg c]  \  }}}|sŒ
||k\  sŒ|||f‘Œ }}}}t        dt        |«      › d	t        |«      › �«       | rt        d
«       |}n|}t        dt        |«      › d�«       g }t        |d«      D ]k  \  }	\  }
}}t        d|	› d	t        |«      › d|d d › d�«       t        |
«      \  }}|xs |}|r|j                  |
|||f«       ŒW|j                  |
||df«       Œm t        |«       t        dd› �«       t        dt        |«      › d�«       |r9t        |D �cg c]  }|d   sŒ	|d   ‘Œ c}«      }t        d|d   › d|d   › �«       t        d› «       y c c}}}w c c}w )NrD   Ú1iG  )ÚdaysrC   z3-year cutoff: zNo articles found, exitingzAfter 3-year filter: rA   z&Incremental mode: crawling page 1 onlyzFull mode: crawling z	 articlesú[z] é2   z...r   ú
z2==================================================zDone. Total: rE   zDate range: r   z ~ éÿÿÿÿ)r1   ÚsysÚargvr   Únowr   Ústrftimer   r8   Ú	enumeraterT   r0   rb   Úsorted)ÚincrementalÚthree_years_agoÚarticlesÚuÚtÚdÚarticles_filteredÚ
to_processÚresultsÚirN   r   r7   rQ   Údetail_dateÚ
final_dateÚrÚdatess                     r   Úmainr~   ³   s	  € Ü”c—h‘h“- !Ñ#Ò:¬¯©°©°sÑ(:€Kô  —|‘|“~¬	°wÔ(?Ñ?×IÑIÈ*ÓU€OÜˆ/˜/Ð*Ð+Ô,ô ‹|€HÙÜÐ(Ô)Øð 3;×YÐY¡w q¨!¨QºaÀAÈÓDX˜!˜Q šÐYÐÒYÜÐ
¤Ð$5Ó 6Ð7°q¼¸X»¸ÐHÔIáäÐ4Ô5Ø&‰
à&ˆ
ÜÐ"¤3 z£?Ð"3°9Ð=Ô>ð €GÜ%.¨z¸1Ó%=ò 	9Ñ!ˆÑ!ˆC�˜Üˆa�ˆs�!”C˜
“OÐ$ B u¨S¨b z l°#Ð6Ô7Ü$0°Ó$5Ñ!ˆ�kà Ò, Hˆ
ÙØ�N‰N˜C ¨
°LÐAÕBð �N‰N˜C ¨
°BÐ7Õ8ð	9ô ˆwÔô ˆ"ˆVˆHˆÔÜˆ-œ˜G›�~ YÐ/Ô0ÙÜ gÖ6 °°1³˜˜!›Ò6Ó7ˆÜˆl˜5 ™8˜* C¨¨b©	 {Ð3Ô4Üˆ6ˆ(ÕùôC Zùò> 7s   ÂG0ÂG0Â#G0Æ3
G7Æ>G7Ú__main__)Ú__doc__ÚosrK   rj   r&   Úbs4r   Úurllib.parser   r   r   Úenvironr'   rW   r.   r%   r[   r\   r(   r   r   r8   rT   rb   r~   Ú__name__© r   r   ú<module>r‡      sª   ðñó 
Û 	Û 
Û Ý Ý  ß (ð �*‰*�.‰.˜ b§j¡j§n¡n°]ÐDUÓ&VÓ
W€ð (€ØÐ+Ñ+€Ø#€	Ø	 €ð ð 3ð€òò4ò$òN0"òf"8òJ/ðd ˆzÒÙ…Fð r   