Ë
    òµ£j™  ã                   óÔ   — 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d„Zd„ Zd„ Zedk(  r e«        yy)uµ   
çˆ¬è™«ï¼šä¹Œå½“åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
ç«™ç‚¹ï¼šhttps://www.gzwd.gov.cn/xwzx/tzgg/
CMSï¼šTRS CMS
åˆ†é¡µï¼šindex_N.html (0-indexed, N=0~232)ï¼Œæ¯�é¡µ15æ�¡ï¼Œå…±233é¡µ3486æ�¡
é    N)ÚBeautifulSoup)Úurljoinz"https://www.gzwd.gov.cn/xwzx/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    úcrawl_wudang.pyÚ_get_dbr      s>   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø‡L�LÐ,Ô-Ø€Kó    c                 óŠ   — | j                  d«       | j                  d«       | j                  d«       | j                  «        y )NaS  
        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   2   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!   6   s5   € Ø‡L�LØoØ	�˜ \´9Ð=ôð ×Ñ˜AÒØØr   c                 ó  — t        j                  d| «      }|r$|j                  d«      }|dd › d|dd › d|dd › �S t        j                  d| «      }|r0|j                  d«      dd |j                  d«      dd }}|› d|› d	�S y
)u8   ä»ŽURLè·¯å¾„æ��å�–ç²¾ç¡®æ—¥æœŸ: t20260615 â†’ 2026-06-15z/t(\d{8})_\d+\.htmlé   Né   ú-é   é   z/(\d{6})/t\d+_\d+\.htmlz-01Ú )ÚreÚsearchÚgroup)ÚurlÚmÚdsÚyÚmps        r   Úextract_date_from_urlr1   ?   sœ   € ô 	�	‰	Ð(¨#Ó.€AÙØ�W‰W�Q‹ZˆØ�R�a�&�˜˜2˜a ˜7˜) 1 R¨¨! W IÐ.Ð.ä
�	‰	Ð,¨cÓ2€AÙØ—‘˜“
˜2˜A� §¡¨£
¨1¨Q ˆ2ˆØ��A�b�T˜ˆ~ÐØr   c                 ó.  — dD �]  }| j                  |«      }|sŒ|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        |«      c S  y)u"   ä»Žè¯¦æƒ…é¡µæ��å�–æ­£æ–‡ - TRS CMS)z.contentz#contentz.article-contentz.TRS_Editorz	.con_textz#zoomÚimgÚsrcr(   zdata:Úhttpz
<img src="z">ÚaT©Úhrefr8   ú#Ú
javascript)	Ú
select_oneÚfind_allÚgetÚ
startswithr   ÚBASE_URLÚreplace_withÚ	decomposeÚstr)ÚsoupÚselÚdivr3   r4   Úimg_urlÚa_tagÚhs           r   Úextract_contentrI   M   s  € à`ó ˆØ�o‰o˜cÓ"ˆÚØ—|‘| EÓ*ò $�Ø—g‘g˜e RÓ(�Ù˜sŸ~™~¨gÔ6Ø<?¿N¹NÈ6Ô<Rœg¤h°Ô4ÐX[�GØ×$Ñ$ z°'°¸"Ð%=Õ>à—M‘M•Oð$ð Ÿ™ c°˜Ó5ò 9�Ø˜&‘M�Ú˜QŸ\™\¨&Õ1¸!¿,¹,ÀsÕ:KÐTU×T`ÑT`ÐamÕTnÜ$+¬H°aÓ$8�E˜&’Mð9ô �s“8ŠOðð r   c                 óL  — t        |«      D ]V  }	 |j                  | t        d¬«      }d|_        |j                  dk(  r%t        |j                  d«      }t        |«      }|c S ŒX y	# t        j                  $ r*}||dz
  k  rt        j                  d|z  «       Y d}~Œ’d}~ww xY w)
u   èŽ·å�–è¯¦æƒ…é¡µå†…å®¹é<   ©Úheadersr	   úutf-8éÈ   úhtml.parserr#   é   Nr(   )Úranger=   ÚHEADERSÚencodingÚstatus_coder   ÚtextrI   ÚrequestsÚRequestExceptionÚtimeÚsleep)r,   ÚsessionÚretriesÚattemptÚrrC   r   Úes           r   Ú
get_detailr`   `   sŸ   € ä˜“>ò 
)ˆð		)Ø—‘˜C¬¸"�Ó=ˆAØ ˆAŒJØ�}‰} Ò#Ü$ Q§V¡V¨]Ó;�Ü)¨$Ó/�Ø’ð $ð	
)ð øô ×(Ñ(ò 	)Ø˜ 1™Ò$Ü—
‘
˜1 ™<Ô(ÿøð	)ús   �AA&Á&B#Á9 BÂB#c                 ó  — g }	 |j                  | t        d¬«      }d|_        |j                  dk7  r|S 	 t        |j                  d«      }|j                  dd¬«      D ]—  }|d	   }t        j                  d
|«      sŒ|j                  dd«      xs |j                  d¬«      }|rt        |«      dk  rŒV|j                  d«      r|nt        t        |«      }t        |«      }	|j!                  |||	f«       Œ™ |S # t        $ r |cY S w xY w)u9   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž [(title, detail_url, date), ...]rK   rL   rN   rO   rP   r6   Tr7   r8   z/\d{6}/t\d+_\d+\.htmlr   r(   ©Ústripé   r5   )r=   rS   rT   rU   Ú	Exceptionr   rV   r<   r)   r*   Úget_textÚlenr>   r   r?   r1   Úappend)
r,   r[   Úresultsr^   rC   r6   r8   r   Ú
detail_urlÚdate_strs
             r   Úparse_list_pagerl   o   s	  € à€GðØ�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ø�=‰=˜CÒØˆNð  ô
 ˜Ÿ™ Ó/€Dà�]‰]˜3 Tˆ]Ó*ò 6ˆØ�‰yˆä�y‰yÐ1°4Ô8ØØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆÙœ˜E›
 QšØà!Ÿ_™_¨VÔ4‘T¼'Ä(ÈDÓ:Qˆ
Ü(¨Ó4ˆà�‰˜˜z¨8Ð4Õ5ð6ð €Nøô' ò ØŠðús   „/C: Ã:DÄDc                  óx  — t        «       } t        | «       t        j                  «       }|j                  j                  t        «       d}d}t        dt        «      D �]2  }|dk(  rt        }nt        › d|› d�}t        ||«      }|st        d|dz   › d�«        nø|D ]°  \  }}}	t        | |«      r|dz  }Œt        ||«      }
t        |
xs dd«      j                  d	¬
«      }t!        |«      dk  rt        d|d d › d�«       |dz  }Œkt#        | ||
||	«      r2|dz  }| j%                  «        t        d|› d|d d › d|	xs d› d�«       Œ¬|dz  }Œ² t        d|dz   › dt        › dt!        |«      › d|› d|› d�«       t'        j(                  d«       �Œ5 | j+                  «        t        d|› d|› d||z   › d�«       y )Nr   Úindex_z.htmlu     ç¬¬r#   u   é¡µæ— æ–‡ç« ï¼Œç»“æ�Ÿr(   rP   Trb   é   u     âš  å†…å®¹è¿‡çŸ­: r   u
   ... è·³è¿‡u     âœ“ [z] é(   z (u	   æ— æ—¥æœŸú)ú/u   é¡µ: u   æ�¡, ç´¯è®¡æ–°u
   æ�¡/è·³è¿‡u   æ�¡u   
âœ… é‡‡é›†å®Œæˆ�ï¼�æ–°å¢žu   æ�¡ï¼Œè·³è¿‡u	   æ�¡ï¼Œå…±)r   r   rW   ÚSessionrM   ÚupdaterS   rR   ÚTOTAL_PAGESr?   rl   Úprintr   r`   r   rf   rg   r!   r   rY   rZ   Úclose)r   r[   Ú	total_newÚ
total_skipÚpager,   Úarticlesr   rj   rk   r   Úcontent_texts               r   Úcrawlr}   Œ   sê  € Ü‹9€DÜ�Ôä×ÑÓ €GØ‡O�O×Ñœ7Ô#à€IØ€Jä�aœÓ%ó  ˆØ�1Š9Ü‰Cä�J˜f T F¨%Ð0ˆCä" 3¨Ó0ˆÙÜ�E˜$˜q™&˜Ð!6Ð7Ô8Ùà+3ò 	 Ñ'ˆE�:˜xÜ˜$ 
Ô+Ø˜a‘�
Øä  ¨WÓ5ˆGÜ(¨ª°B¸ÓF×OÑOÐVZÐOÓ[ˆLÜ�<Ó  2Ò%äÐ,¨U°3°B¨Z¨L¸
ÐCÔDØ˜a‘�
Øä˜$  w°
¸HÔEØ˜Q‘�	Ø—‘”Ü˜ 	˜{¨"¨U°3°B¨Z¨L¸¸8Ò;RÀ{Ð:SÐSTÐUÕVà˜a‘‘
ð%	 ô( 	��d˜1‘f�X˜Qœ{˜m¨5´°X³°¸~ÈiÈ[ÐXbÐcmÐbnÐnqÐrÔsÜ�
‰
�1ŽðA ðD 	‡J�J„LÜ	Ð'¨	 {°,¸z¸lÈ)ÐT]Ð^hÑThÐSiÐilÐ
mÕnr   Ú__main__)é   )Ú__doc__rW   r)   r
   ÚosrY   Úbs4r   Úurllib.parser   r?   r   rS   Úgetenvr   ru   r   r   r   r!   r1   rI   r`   rl   r}   Ú__name__© r   r   ú<module>r‡      s•   ðñó Û 	Û Û 	Û Ý Ý  à/€Ø$€	àÐoð€ð ˆ"�)‰)�KÐ!2Ó
3€Ø€òòò"&òòòó&òò:-oð^ ˆzÒÙ	…Gð r   