Ë
    P¦~j¨  ã                   óN  — 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„ Z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)#u“  
å�°å±±å¸‚åŸŽå¸‚ç®¡ç�†å’Œç»¼å�ˆæ‰§æ³•å±€ - æ”¿åºœä¿¡æ�¯å…¬å¼€ç›®å½• (cnts.gov.cn/zsdw/scsglhzhzfj/zwgk/zfxxgkml)
CMS: NFCMS post_N (åˆ—è¡¨ index_N.html, è¯¦æƒ… content/post_N.html)
åˆ—è¡¨: div.list_right_title aï¼ˆç›®å½•é¡µæ··æŽ’ tzgg/gzdt/sgs/rsxx/bmwj å�„å­�æ �ç›®ï¼‰
åˆ†é¡µ: index_2.html ...
è¯¦æƒ…: æ­£æ–‡ div#zoom / .article
ç”¨æ³•: python3 crawl_cnts_zsdw_xxgkml.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu@   å�°å±±å¸‚åŸŽå¸‚ç®¡ç�†å’Œç»¼å�ˆæ‰§æ³•å±€-æ”¿åºœä¿¡æ�¯å…¬å¼€ç›®å½•zhttp://www.cnts.gov.cnz6http://www.cnts.gov.cn/zsdw/scsglhzhzfj/zwgk/zfxxgkml/zwww.cnts.gov.cnu   å¹¿ä¸œiG  )Údaysz%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_zsdw_xxgkml.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                 ó  — t        | d«      }g }|j                  dd¬«      D ]¨  }|j                  dd«      }d|vrŒt        |j	                  d¬«      «      }|sŒ8d}|j                  d	d
g«      }|r7t        j                  d|j	                  «       «      }|r|j                  d«      }|j                  |t        t        |«      |dœ«       Œª t        «       }	g }
|D ]/  }|d   |	vsŒ|	j                  |d   «       |
j                  |«       Œ1 |
S )Núhtml.parserÚaT©Úhrefr*   r   zcontent/post_©r   ÚliÚdivú20\d{2}-\d{2}-\d{2}r   )Útitler#   Úpub_dater#   )r   Úfind_allr   r   Úget_textÚfind_parentr   ÚsearchÚgroupÚappendr   ÚBASE_URLÚsetÚadd)ÚhtmlÚsoupÚitemsr(   r*   r/   r0   ÚparentÚmÚseenÚuniqÚits               r   Ú
parse_listrB   +   s  € Ü˜˜}Ó-€DØ€EØ�]‰]˜3 Tˆ]Ó*ò ]ˆØ�u‰u�V˜RÓ ˆØ $Ñ&ØÜ˜AŸJ™J¨T˜JÓ2Ó3ˆÙØØˆØ—‘  e˜}Ó-ˆÙÜ—	‘	Ð0°&·/±/Ó2CÓDˆAÙØŸ7™7 1›:�Ø�‰˜u¬W´X¸tÓ-DÐRZÑ[Õ\ð]ô ‹5€DØ€DØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�K‰K˜�Oðð €Kr   c                 óÂ  — ddddœ}t        | d«      }|j                  dddi¬«      }|r"|j                  d«      rt        |d   «      |d	<   |d	   sf|j                  d	«      }|rS|j	                  d
¬«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       |d	<   |j                  dddi¬«      }|r|j                  d«      r|d   d d |d<   |d   s/t        j                  d| d d «      }|r|j                  d«      |d<   |j                  dd¬«      }|s|j                  dd¬«      }|rt        t        |«      «      |d<   |S )Nr   ©r/   Úpublish_dateÚcontentr'   ÚmetaÚnameÚArticleTitle)ÚattrsrF   r/   Tr+   u²   [_\-â€”]\s*(ä¸»åŠ¨å…¬å¼€|é€šçŸ¥å…¬å‘Š|å·¥ä½œåŠ¨æ€�|éƒ¨é—¨æ–‡ä»¶|å�Œå…¬ç¤º|äººäº‹ä¿¡æ�¯|ç»„ç»‡æœºæž„|å�°å±±å¸‚åŸŽå¸‚ç®¡ç�†å’Œç»¼å�ˆæ‰§æ³•å±€|å�°å±±å¸‚äººæ°‘æ”¿åºœé—¨æˆ·ç½‘ç«™)\s*$u0   [_\-â€”]\s*å�°å±±å¸‚äººæ°‘æ”¿åºœé—¨æˆ·ç½‘ç«™\s*$ÚPubDateé
   rE   r.   i@  r   r-   Úzoom)ÚidÚarticle)Úclass_)r   Úfindr   r   r2   r   r   r   r4   r5   Úextract_clean_textÚstr)	r:   Úresultr;   Ú
meta_titleÚ	title_tagr   Ú	meta_dater>   Úcontent_divs	            r   Úparse_detailrY   E   su  € Ø¨2¸"Ñ=€FÜ˜˜}Ó-€Dà—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ü% j°Ñ&;Ó<ˆˆw‰Ø�'Š?Ø—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAä—‘ð  Mð  OQð  STó  UˆAÜ—‘ÐJÈBÐPQÓRˆAØŸg™g›iˆF�7‰OØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø!*¨9Ñ!5°c°rÐ!:ˆˆ~ÑØ�.Ò!Ü�I‰IÐ,¨d°5°D¨kÓ:ˆÙØ%&§W¡W¨Q£ZˆF�>Ñ"Ø—)‘)˜E f�)Ó-€KÙØ—i‘i ¨i�iÓ8ˆÙÜ.¬s°;Ó/?Ó@ˆˆyÑØ€Mr   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'   r(   Tr)   r*   r+   u   é™„ä»¶r
   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorr   z

)r   r1   r   r2   r   r7   Úreplace_withÚunwraprH   r6   rS   r3   Újoinr   )
Úcontent_htmlr;   Úa_tagr*   r"   Úfull_urlÚtagÚpartsÚelr   s
             r   rR   rR   c   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                 óÌ  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]½  }|dk(  rt        nt        j                  d«      d|› d�z   }	 t        |«      }t        |«      }d	}	|D ]4  }
|
d
   |vsŒ|j                  |
d
   «       |j                  |
«       |	dz  }	Œ6 t        d|› dt        |«      › d|	› dt        |«      › �«       |s nt        j                  d«       Œ¿ g }t        |d«      D ]ž  \  }}
|
d   r|
d   t        k  rŒ	 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'        j(                  |d¬ «      d!z   «       Œ- 	 d d d «       t        d"t        |«      › d#|› �«       y t+        j,                  t.        «      }|j1                  d$«       |j3                  «       }d	x}}|D ]W  }	 |j1                  d%|d&   |d'   |d'   |d   |d   |d   |d   xs dd d( |d)   d*f	«       |j4                  d	kD  r|dz  }n|dz  }ŒY |j7                  «        |j9                  «        t        d,|› d-|› d.�«       y # t        $ r}t        d|› d|› �«       Y d }~ �Œd }~ww xY w# t        $ r(}t        d|
d
   dd  › d|› �«       ddddœ}Y d }~�Œöd }~ww xY w# 1 sw Y   �ŒOxY w# t        $ r}t        d+|› �«       |dz  }Y d }~�Œd }~ww xY w)/NzCrawl pages=z cutoff=rp   ú/z/index_z.htmlÚPz ERR: r   r#   z: z items (z new), total gš™™™™™é?r0   z	  detail iØÿÿÿr   rD   r/   rE   rF   u   æ”¿åºœä¿¡æ�¯å…¬å¼€ç›®å½•)r/   Úpage_urlrE   rF   Ú	site_nameÚcolumnrL   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 (?,?,?,?,?,?,?,?,?)ru   rt   iô  rv   zcrawl_cnts_zsdw_xxgkml.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFr8   ÚrangeÚLIST_URLÚrstripr%   Ú	ExceptionrB   r9   r6   ÚlenÚtimeÚsleepÚ	enumeraterY   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allr?   re   r#   r:   Úer<   ÚnewrA   ÚenrichedÚidxÚdetailÚfÚitemÚconnÚcÚstoredÚskippeds                       r   Úcrawlrœ   y   sÇ  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆØ˜qš&�h¤h§o¡o°cÓ&:¸wÀqÀcÈÐ=OÑ&Oˆð	Ü˜“:ˆDô ˜4Ó ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ð#ð& €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5Øð	FÜ˜˜E™Ó#ˆDÜ! $Ó'ˆFð 	�‰Ø˜G‘_Ò3¨¨7©Ø˜5™	Ø" >Ñ2ÒD°b¸±nØ˜iÑ(Ü"Ø0ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ð'ñ* Ü�(˜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±Ð@[ð]ô	^ð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôE ò 	Ü�!�A�3�f˜Q˜CÐ Ô!Þûð	ûô, ò 	FÜ�)˜B˜u™I c d˜OÐ,¨F°1°#Ð6Ô7Ø!°2À"ÑEŽFûð	Fú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰LŽGûð	úsU   ÁKÄK;Æ01L/É	AL<Ë	K8ËK3Ë3K8Ë;	L,ÌL'Ì'L,Ì/L9Ì<	M#ÍMÍM#Ú__main__é   z--pages=r   z--pages=(\d+)z--json)rŽ   r�   )é   )rp   N)+Ú__doc__r   ÚsysÚosr…   r€   r‡   r   r   r   Úbs4r   Úurllib.parser   r   r7   r|   ÚDOMAINÚGROUPÚnowÚstrftimerz   Úenvironr   r   r    r   r   r%   rB   rY   rR   rœ   Ú__name__ÚargvÚargsrŽ   r�   ri   Úintr4   r5   Úindex© r   r   ú<module>r°      s5  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  àN€	Ø#€ØC€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òóòò4ò<Aó,J4ðZ ˆ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   