Ë
    %&˜jf  ã                   óÚ   — 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 ddlm	Z	 dZ
dZddiZ ej                  d	d
«      ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zedk(  r e«        yy)uª   
çˆ¬è™«ï¼šæ˜†éƒ½ä»‘åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
ç«™ç‚¹ï¼šhttps://www.kdl.gov.cn/xwdt/tzgg/
CMSï¼šTRS CMS
åˆ†é¡µï¼šindex_N.html (N=0~30)ï¼Œæ¯�é¡µ10æ�¡ï¼Œå…±31é¡µ~310æ�¡
é    N)ÚBeautifulSoup)Úurljoinz!https://www.kdl.gov.cn/xwdt/tzgg/u   æ˜†éƒ½ä»‘åŒº-é€šçŸ¥å…¬å‘Šz
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36Ú	SEARCH_DBz/root/search.dbé   c                  ó¢   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | j                  d«       | S )Né   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecute©Úconns    ú/root/gov_crawler/crawl_kdl.pyÚ_get_dbr      s>   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø‡L�LÐ,Ô-Ø€Kó    c                 óŠ   — | j                  d«       | j                  d«       | j                  d«       | j                  «        y )NzçCREATE TABLE IF NOT EXISTS gov_raw (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, source_url TEXT NOT NULL UNIQUE, publish_date TEXT, site_name TEXT, created_at TEXT DEFAULT (datetime('now','localtime')))zACREATE INDEX IF NOT EXISTS idx_gov_raw_site ON gov_raw(site_name)zDCREATE INDEX IF NOT EXISTS idx_gov_raw_date ON gov_raw(publish_date))r   Úcommitr   s    r   Úensure_tabler   !   s8   € Ø‡L�Lð  {ô  |Ø‡L�LÐTÔUØ‡L�LÐWÔXØ‡K�K…Mr   c                 óL   — | j                  d|f«      }|j                  «       d uS )Nz(SELECT 1 FROM gov_raw WHERE source_url=?)r   Úfetchone)r   Ú
source_urlÚcurs      r   Ú
row_existsr   '   s&   € Ø
�,‰,ÐAÀJÀ=Ó
Q€CØ�<‰<‹> Ð%Ð%r   c                 óZ   — | j                  d||||t        f«       | j                  dkD  ryy)NzeINSERT OR IGNORE INTO gov_raw(title, content, source_url, publish_date, site_name) VALUES (?,?,?,?,?)r   TF)r   Ú	SITE_NAMEÚtotal_changes)r   ÚtitleÚcontentr   Úpublish_dates        r   Ú
insert_rowr!   +   s4   € Ø‡L�LÐxØ˜ *¨l¼IÐFôHà×Ñ˜AÒØØr   c                 ó|   — t        j                  d| «      }|r$|j                  d«      }|dd › d|dd › d|dd › �S y)	uA   ä»ŽURLæ–‡ä»¶å��æ��å�–æ—¥æœŸ: t20260624_930176.html â†’ 2026-06-24z/t(\d{8})_\d+\.htmlé   Né   ú-é   é   Ú )ÚreÚsearchÚgroup)ÚurlÚmÚds      r   Úextract_date_from_urlr/   2   sO   € ä
�	‰	Ð(¨#Ó.€AÙØ�G‰G�A‹JˆØ�B�Q�%�˜˜!˜A˜a˜&˜  1 Q q 6 (Ð+Ð+Ør   c                 ó@  — | j                  d«      }|s| j                  d«      }|rø|j                  d«      D ]p  }|j                  dd«      }|rJ|j                  d«      s9|j                  d«      st	        t
        |«      n|}|j                  d|› d	�«       Œa|j                  «        Œr |j                  d
d¬«      D ]S  }|d   }|sŒ|j                  d«      rŒ|j                  d«      rŒ/|j                  d«      rŒAt	        t
        |«      |d<   ŒU t        |«      S y)u   ä»Žè¯¦æƒ…é¡µæ��å�–æ­£æ–‡z#contentz7.content, .article-content, .TRS_Editor, #zoom, .detailÚimgÚsrcr(   zdata:Úhttpz
<img src="z">ÚaT)Úhrefr5   ú#Ú
javascript)	Ú
select_oneÚfind_allÚgetÚ
startswithr   ÚBASE_URLÚreplace_withÚ	decomposeÚstr)ÚsoupÚdivr1   r2   Úimg_urlr4   Úhs          r   Úextract_contentrD   :   s  € à
�/‰/˜*Ó
%€CÙØ�o‰oÐWÓXˆÙ
Ø—<‘< Ó&ò 	 ˆCØ—'‘'˜% Ó$ˆCÙ˜3Ÿ>™>¨'Ô2Ø8;¿¹ÀvÔ8Nœ'¤(¨CÔ0ÐTW�Ø× Ñ  :¨g¨Y°bÐ!9Õ:à—‘•ð	 ð —‘˜c¨�Ó-ò 	1ˆAØ�&‘	ˆAÚ˜Ÿ™ fÕ-°a·l±lÀ3Õ6GÐPQ×P\ÑP\Ð]iÕPjÜ#¤H¨aÓ0��&’	ð	1ô �3‹xˆØr   c                 ó’   — dD ]B  }| j                  |«      }|sŒ|j                  d¬«      }dt        |«      cxk  r	dk  sŒ>|c S  ŒD y)uH   ä»Žè¯¦æƒ…é¡µæ��å�–çœŸå®žæ ‡é¢˜ï¼ˆé¡µé�¢.titleï¼Œæ¯”åˆ—è¡¨é¡µæ›´å¹²å‡€ï¼‰)z.titleÚh1z.h1z.article-titlez	.bt_titlez.detail-titleT©Ústripé   éÈ   r(   )r8   Úget_textÚlen)r@   ÚselÚelÚtxts       r   Úextract_titlerP   N   sR   € àVò ˆØ�_‰_˜SÓ!ˆÚØ—+‘+ D�+Ó)ˆCØ”C˜“HÔ# Ó#Ø’
ñ $ð	ð r   c                 óf  — t        |«      D ]c  }	 |j                  | t        d¬«      }d|_        |j                  dk(  r2t        |j                  d«      }t        |«      }t        |«      }||fc S Œe y	# t        j                  $ r*}||dz
  k  rt        j                  d|z  «       Y d}~ŒŸd}~ww xY w)
u$   èŽ·å�–è¯¦æƒ…é¡µå†…å®¹å’ŒçœŸå®žæ ‡é¢˜é<   ©Úheadersr	   úutf-8rJ   úhtml.parserr#   é   N)r(   r(   )Úranger:   ÚHEADERSÚencodingÚstatus_coder   ÚtextrD   rP   ÚrequestsÚRequestExceptionÚtimeÚsleep)	r,   ÚsessionÚretriesÚattemptÚrr@   r   Úproper_titleÚes	            r   Ú
get_detailrg   X   s¯   € ä˜“>ò )ˆð
	)Ø—‘˜C¬¸"�Ó=ˆAØ ˆAŒJØ�}‰} Ò#Ü$ Q§V¡V¨]Ó;�Ü)¨$Ó/�Ü,¨TÓ2�Ø Ð,Ò,ð	 $ð	)ð øô ×(Ñ(ò 	)Ø˜ 1™Ò$Ü—
‘
˜1 ™<Ô(ÿøð	)ús   �AA3Á3B0Â B+Â+B0c                 ó†  — g }	 |j                  | t        d¬«      }d|_        |j                  dk7  r|S 	 t        |j                  d«      }|j                  d«      D ]Ñ  }|j                  d«      D ]»  }|j                  d«      }|r|j                  d	«      sŒ(|d	   }d
|vrŒ2|j                  d¬«      }	|	rt        |	«      dk  rŒUt        j                  dd|	«      j                  «       }	|j                  d«      r|nt        t         |«      }
t#        |
«      }|j%                  |	|
|f«       Œ½ ŒÓ |S # t        $ r |cY S w xY w)u   è§£æž�åˆ—è¡¨é¡µrR   rS   rU   rJ   rV   ÚulÚlir4   r5   Út20TrG   rI   z^\d{2}-\d{2}r(   r3   )r:   rY   rZ   r[   Ú	Exceptionr   r\   r9   ÚfindrK   rL   r)   ÚsubrH   r;   r   r<   r/   Úappend)r,   ra   Úresultsrd   r@   ri   rj   r4   r5   r   Ú
detail_urlÚdate_strs               r   Úparse_list_pagers   h   s?  € à€GðØ�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ø�=‰=˜CÒØˆNð  ô
 ˜Ÿ™ Ó/€Dà�m‰m˜DÓ!ò :ˆØ—+‘+˜dÓ#ò 	:ˆBØ—‘˜“ˆAÙ˜AŸE™E &œMØØ�V‘9ˆDØ˜DÑ ØØ—J‘J T�JÓ*ˆEÙœC ›J¨šNØä—F‘F˜?¨B°Ó6×<Ñ<Ó>ˆEà!%§¡°Ô!8™¼gÄhÐPTÓ>UˆJÜ,¨ZÓ8ˆHà�N‰N˜E :¨xÐ8Õ9ñ!	:ð:ð& €Nøô1 ò ØŠðús   „/D2 Ä2E Ä?E c                  ór  — t        «       } t        | «       t        j                  «       }|j                  j                  t        «       d}d}t        t        «      D �]6  }|dk(  rt        nt        › d|› d�}t        ||«      }|st        d|dz   › d�«        ný|D ]µ  \  }}}	t        | |«      r|dz  }Œt        ||«      \  }
}|r|n|}t        |
xs dd«      j                  d	¬
«      }t!        |«      dk  rt        d|d d › d�«       |dz  }Œtt#        | ||
||	«      r.|dz  }| j%                  «        t        d|› d|d d › d|	› d�«       Œ±|dz  }Œ· t        d|dz   › dt        › dt!        |«      › d|› d|› d�«       t'        j(                  d«       �Œ9 | j+                  «        t        d|› d|› d�«       y )Nr   Úindex_z.htmlu     ç¬¬r#   u   é¡µæ— æ–‡ç« ï¼Œç»“æ�Ÿr(   rV   TrG   é   u     âš  å†…å®¹è¿‡çŸ­: r   u
   ... è·³è¿‡u     âœ“ [z] é(   z (ú)ú/u   é¡µ: u   æ�¡, ç´¯è®¡æ–°u
   æ�¡/è·³è¿‡u   æ�¡u   
âœ… å®Œæˆ�ï¼�æ–°å¢žu   æ�¡ï¼Œè·³è¿‡)r   r   r]   ÚSessionrT   ÚupdaterY   rX   ÚTOTAL_PAGESr<   rs   Úprintr   rg   r   rK   rL   r!   r   r_   r`   Úclose)r   ra   Ú	total_newÚ
total_skipÚpager,   Úarticlesr   rq   rr   r   re   Úfinal_titleÚcts                 r   Úcrawlr…   Š   sÛ  € Ü‹9€DÜ�ÔÜ×ÑÓ €GØ‡O�O×Ñœ7Ô#Ø€IØ€Jä”kÓ"ó ˆØ !š)�h¬H¨:°V¸D¸6ÀÐ)GˆÜ" 3¨Ó0ˆÙÜ�E˜$˜q™&˜Ð!6Ð7Ô8Ùà+3ò 	 Ñ'ˆE�:˜xÜ˜$ 
Ô+Ø˜a‘�
ØÜ$.¨z¸7Ó$CÑ!ˆG�\á*6™,¸EˆKÜ˜wš}¨"¨mÓ<×EÑEÈDÐEÓQˆBÜ�2‹w˜Š|ÜÐ,¨[¸¸"Ð-=Ð,>¸jÐIÔJØ˜a‘�
ØÜ˜$ ¨W°jÀ(ÔKØ˜Q‘�	Ø—‘”Ü˜ 	˜{¨"¨[¸¸"Ð-=Ð,>¸bÀÀ
È!ÐLÕMà˜a‘‘
ð#	 ô& 	��d˜1‘f�X˜Qœ{˜m¨5´°X³°¸~ÈiÈ[ÐXbÐcmÐbnÐnqÐrÔsÜ�
‰
�1Žð7ð: 	‡J�J„LÜ	Ð! ) ¨L¸¸ÀCÐ
HÕIr   Ú__main__)é   )Ú__doc__r]   r)   r
   Úosr_   Úbs4r   Úurllib.parser   r<   r   rY   Úgetenvr   r|   r   r   r   r!   r/   rD   rP   rg   rs   r…   Ú__name__© r   r   ú<module>r�      s›   ðñó Û 	Û Û 	Û Ý Ý  à.€Ø'€	àÐoð€ð ˆ"�)‰)�KÐ!2Ó
3€Ø€òòò&òòòò(óò  òD&JðP ˆzÒÙ	…Gð r   