Ë
    P¦~jý  ã                   óR  — 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Z ddlmZ dZdZdZd	Zd
Z ej&                  «        e	d¬«      z
  j)                  d«      Zej,                  j/                  dd«      ZddiZd„ Zd„ Zd!d„Zd"d„Zd#d„Zd„ Zd$d„Z e!dk(  rƒejD                  dd Z#dZ$dZ%ddjM                  e#«      v r7 e' ejP                  ddjM                  e#«      «      jS                  d«      «      Z$de#v re#e#jU                  d«      dz      Z% e e$e%¬ «       yy)%uv  
æ±Ÿé—¨å�°å±±å¸‚å·¥ä¸šæ–°åŸŽç®¡å§”ä¼š - æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° é€šçŸ¥å…¬å‘Š (cnts.gov.cn/jmtssgyxc/gkmlpt)
CMS: gkmlpt Vue SPA API (å�Œ fogang /gkmlpt/api/all/4183)
åˆ—è¡¨: GET /gkmlpt/api/all/4183?page=N&pageSize=100  JSON
è¯¦æƒ…: /gkmlpt/content/post_{id}.html
æ­£æ–‡: .article-content / #zoom
ç”¨æ³•: python3 crawl_cnts_jmtssgyxc_tzgg.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu1   æ±Ÿé—¨å�°å±±å¸‚å·¥ä¸šæ–°åŸŽç®¡å§”ä¼š-é€šçŸ¥å…¬å‘Šzhttp://www.cnts.gov.cnz4http://www.cnts.gov.cn/jmtssgyxc/gkmlpt/api/all/4183zwww.cnts.gov.cnu   å¹¿ä¸œiG  )Údaysú%Y-%m-%dÚDB_PATHz/root/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú./root/gov_crawler/crawl_cnts_jmtssgyxc_tzgg.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó´   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sK   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 ó`   — t        j                  | t        |¬«      }d|_        |j                  S )N©ÚheadersÚtimeoutúutf-8)ÚrequestsÚgetÚHEADERSÚencodingÚtext)Úurlr   Úrs      r   Úfetchr'   %   s$   € Ü�‰�S¤'°7Ô;€AØ€A„JØ�6‰6€Mr   c                 óD  — 	 t        j                  t        › d| › d|› �t        d¬«      }|j	                  «       }|j                  dg «      t        |j                  di «      j                  dd«      «      fS # t        $ r}t        d	| › d
|› �«       g dfcY d }~S d }~ww xY w)Nz?page=z
&pageSize=é   r   ÚarticlesÚclassifyÚ
post_countr   zAPI Pú ERR: )r    r!   ÚAPI_URLr"   ÚjsonÚintÚ	Exceptionr   )ÚpageÚ	page_sizer&   ÚjÚes        r   Ú
fetch_listr6   +   s™   € ðÜ�L‰LœG˜9 F¨4¨&°
¸9¸+ÐFÔPWÐacÔdˆØ�F‰F‹HˆØ�u‰u�Z Ó$¤c¨!¯%©%°
¸BÓ*?×*CÑ*CÀLÐRSÓ*TÓ&UÐUÐUøÜò Üˆe�D�6˜ ˜sÐ#Ô$Ø�1ˆu�ûðús   ‚A4A7 Á7	BÂ BÂBÂBc                 ó\  — ddddœ}|rÖ	 t        j                  t        › d|› �t        d¬«      }|j	                  «       }t        |j                  dd«      «      |d<   |j                  dd«      }|r1	 t        j                  t        |«      «      j                  d	«      |d
<   |j                  dd«      xs |j                  dd«      xs d}|rt!        |«      |d<   |S 	 t'        | d«      }	|	j)                  d«      }
|
r<|
j+                  d¬«      }t        j,                  dd|«      }|j/                  «       |d<   |	j)                  dddi¬«      }|r|j                  d«      r|d   d d |d
<   |	j)                  dd¬«      }|s|	j)                  dd¬«      }|s|	j)                  dd¬«      }|rt!        t        |«      «      |d<   |S # t        t        t        f$ r- t        |«      d d }t        j                  d|«      r||d
<   Y �Œcw xY w# t"        $ r}t%        d|› �«       Y d }~�ŒGd }~ww xY w)Nr   ©ÚtitleÚpublish_dateÚcontentz/jmtssgyxc/gkmlpt/api/post/r)   r   r9   Údater   r   r:   é
   z^\d{4}-\d{2}-\d{2}$r;   Úcontent_htmlz  api detail ERR: úhtml.parserT©r   u6   [_\-â€”]\s*(é€šçŸ¥å…¬å‘Š|æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°)\s*$ÚmetaÚnameÚPubDate)ÚattrsÚdivzarticle-content)Úclass_Úzoom)Úid)r    r!   ÚBASE_URLr"   r/   r   r   Úfromtimestampr0   ÚstrftimeÚ
ValueErrorÚ	TypeErrorÚOSErrorÚstrr   ÚmatchÚextract_clean_textr1   r   r   ÚfindÚget_textr   r   )ÚhtmlÚart_idÚresultr&   r4   ÚtsÚsr>   r5   ÚsoupÚ	title_tagr   Ú	meta_dateÚcontent_divs                 r   Úparse_detailr]   5   s)  € Ø¨2¸"Ñ=€Fáð	*Ü—‘¤˜zÐ)DÀVÀHÐMÔW^ÐhjÔkˆAØ—‘“ˆAÜ)¨!¯%©%°¸Ó*<Ó=ˆF�7‰OØ—‘�v˜qÓ!ˆBÙð3Ü-5×-CÑ-CÄCÈÃGÓ-L×-UÑ-UÐV`Ó-a�F˜>Ñ*ð
 Ÿ5™5 ¨BÓ/ÒR°1·5±5¸ÈÓ3LÒRÐPRˆLÙÜ$6°|Ó$D��yÑ!Ø�ð ô
 ˜˜}Ó-€DØ—	‘	˜'Ó"€IÙØ×Ñ TÐÓ*ˆÜ�F‰FÐLÈbÐRSÓTˆØŸ'™'›)ˆˆw‰Ø—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø!*¨9Ñ!5°c°rÐ!:ˆˆ~ÑØ—)‘)˜EÐ*;�)Ó<€KÙØ—i‘i ¨i�iÓ8ˆÙØ—i‘i ¨&�iÓ1ˆÙÜ.¬s°;Ó/?Ó@ˆˆyÑØ€Møô5 #¤I¬wÐ7ò 3Ü˜B›  ˜�AÜ—x‘xÐ 6¸Ô:Ø12˜˜~Ñ.úð3ûô ò 	*ÜÐ$ Q CÐ(×)Ò)ûð	*ús<   ŠA'H	 Á20G Â";H	 Ç=HÈH	 ÈHÈH	 È		H+ÈH&È&H+c                 ó   — | syt        | d«      }|j                  dd¬«      D ]R  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }|j                  d	|› d
|› d�«       ŒT |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]u  }|j                  dk(  r|j                  t        |«      «       Œ-|j                  dk(  sŒ=|j                  d«      rŒO|j                  dd¬«      }	|	sŒe|j                  |	«       Œw |rdj                  |«      S | j                  «       S )Nr   r?   ÚaT)Úhrefr`   r@   u   é™„ä»¶r   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚurX   ÚtableÚp)Ú	separatorr   z

)r   Úfind_allr!   rS   r   rI   Úreplace_withÚunwraprB   ÚappendrO   Úfind_parentÚjoinr   )
r>   rY   Úa_tagr`   r$   Úfull_urlÚtagÚpartsÚelr   s
             r   rQ   rQ   ^   s6  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò 4ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ×Ñ˜Q˜t˜f B x j°Ð2Õ3ð	4ð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò  ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜Q•ð ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   é   c                 óL  — t        d| › dt        › �«       g }t        «       }d}t        d| dz   «      D �]  }t	        |«      \  }}d}|D ]¥  }|j                  d«      }	t        |j                  dd«      «      }
|j                  dd«      }|r$t        j                  |«      j                  d	«      nd}t        › d
|	› d�}||vsŒz|j                  |«       |j                  |
|||	dœ«       |dz  }Œ§ t        d|› dt        |«      › d|› dt        |«      › d|› d�«       |s nt        j                  d«       �Œ g }t!        |d«      D ]¿  \  }}|d   r|d   t        k  rŒ|j                  d«      }	 |rt#        d |¬«      }nt%        |d   «      }t#        |«      }|j                  |d   xs |d   |d   |d   xs |d   |d   t(        ddœ«       |d z  dk(  rt        d!|› d"t        |«      › �«       t        j                  d#«       ŒÁ |rct+        |d$d%¬&«      5 }|D ]+  }|j-                  t/        j0                  |d'¬(«      d)z   «       Œ- 	 d d d «       t        d*t        |«      › d+|› �«       y t3        j4                  t6        «      }|j9                  d,«       |j;                  «       }dx}}|D ]W  }	 |j9                  d-|d.   |d/   |d/   |d   |d   |d   |d   xs dd d0 |d1   d2f	«       |j<                  dkD  r|dz  }n|dz  }ŒY |j?                  «        |jA                  «        t        d4|› d5|› d6�«       y # t&        $ r(}t        d|d   dd  › d|› �«       ddddœ}Y d }~�ŒÍd }~ww xY w# 1 sw Y   �Œ&xY w# t&        $ r}t        d3|› �«       |dz  }Y d }~Œïd }~ww xY w)7NzCrawl pages=z cutoff=r   rw   rH   r9   r   r<   r   z/jmtssgyxc/gkmlpt/content/post_z.html)r9   r%   Úpub_daterU   ÚPz: z items (z new), total z (post_count=ra   g      à?ry   rU   )rU   r%   z	  detail iØÿÿÿr-   r8   r:   r;   u   é€šçŸ¥å…¬å‘Š)r9   Úpage_urlr:   r;   Ú	site_nameÚcolumnr=   z  ú/gš™™™™™Ù?Úwr   )r#   F)Úensure_asciiú
zJSONL: z
 items -> zPRAGMA busy_timeout=10000z˜INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name) VALUES (?,?,?,?,?,?,?,?,?)r|   r{   iô  r}   zcrawl_cnts_jmtssgyxc_tzgg.pyz
DB error: zResult: z new, z skipped)!r   ÚCUTOFFÚsetÚranger6   r!   r   r   rJ   rK   rI   Úaddro   ÚlenÚtimeÚsleepÚ	enumerater]   r'   r1   r   ÚopenÚwriter/   ÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenÚtotalrj   ÚartsÚnewr_   Úaidr9   rW   ry   r%   ÚenrichedÚidxÚitrU   ÚdetailrT   r5   ÚfÚitemÚconnÚcÚstoredÚskippeds                              r   Úcrawlr¦   t   sÿ  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DØ€EÜ�1�e˜a‘iÓ ó ˆÜ  “m‰ˆˆeØˆØò 		ˆAØ—%‘%˜“+ˆCÜ §¡ g¨rÓ 2Ó3ˆEØ—‘�v˜qÓ!ˆBÙJL”x×-Ñ-¨bÓ1×:Ñ:¸:ÔFÐRTˆHÜ�JÐ=¸c¸UÀ%ÐHˆCØ˜$ŠØ—‘˜”Ø× Ñ ¨5¸È(Ð^aÑ!bÔcØ�q‘‘ð		ô 	ˆa�ˆs�"”S˜“Y�K˜x¨ u¨M¼#¸i».Ð9IÈÐW\ÐV]Ð]^Ð_Ô`ÙÙÜ�
‰
�3Žð!ð$ €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5ØØ—‘˜Ó!ˆð	FÙÜ% d°6Ô:‘ä˜R ™YÓ'�Ü% dÓ+�ð 	�‰Ø˜G‘_Ò3¨¨7©Ø˜5™	Ø" >Ñ2ÒD°b¸±nØ˜iÑ(Ü"Ø$ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ð/ñ2 Ü�(˜C¨'Ô2ð 	E°aØ ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜(“m�_ J¨x¨jÐ9Ô:Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@^ð`ô	að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôY ò 	FÜ�)˜B˜u™I c d˜OÐ,¨F°1°#Ð6Ô7Ø!°2À"ÑEŽFûð	Fú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús=   Å2)L<È1M0Ê3AM=Ì<	M-ÍM(Í(M-Í0M:Í=	N#ÎNÎN#Ú__main__é   z--pages=r   z--pages=(\d+)z--json)r”   r•   )r)   )éd   )N)rw   N)+Ú__doc__r   ÚsysÚosr/   r‡   r�   r    r   r   Úbs4r   Úurllib.parser   r   rI   r.   ÚDOMAINÚGROUPÚnowrK   r‚   Úenvironr!   r	   r"   r   r   r'   r6   r]   rQ   r¦   Ú__name__ÚargvÚargsr”   r•   rq   r0   ÚsearchÚgroupÚindex© r   r   ú<module>rº      s6  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à?€	Ø#€Ø
@€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òóóó&òRAó,N4ðb ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	� Ö)ð r   