Ë
    +„jd  ã                   ób  — 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e› d�Ze› d	�Zd
ZdZ ej(                  «        e	d¬«      z
  j+                  d«      Zej.                  j1                  dd«      Zde› d�dœZd„ Z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)%u^  
ä»�åŒ–åŽ¿ä¸¹éœžæ—…æ¸¸ç»�æµŽå¼€å�‘è¯•éªŒåŒºç®¡ç�†å§”å‘˜ä¼š - é€šçŸ¥å…¬å‘Š (sgrh.gov.cn/sgrhdxlv/gkmlpt)
CMS: å¹¿ä¸œ gkmlpt Vue SPA API (å�Œ suixi/gdmx)
åˆ—è¡¨: GET /sgrhdxlv/gkmlpt/api/all/9001?page=N&pageSize=100  JSON
è¯¦æƒ…: GET /sgrhdxlv/gkmlpt/api/post/{id}  JSON (content=HTML)
ç”¨æ³•: python3 crawl_sgrh_tzgg.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinuF   ä»�åŒ–åŽ¿ä¸¹éœžæ—…æ¸¸ç»�æµŽå¼€å�‘è¯•éªŒåŒºç®¡ç�†å§”å‘˜ä¼š-é€šçŸ¥å…¬å‘Šzhttps://www.sgrh.gov.cnz/sgrhdxlv/gkmlpt/api/all/9001z/sgrhdxlv/gkmlpt/api/postzwww.sgrh.gov.cnu   å¹¿ä¸œiG  )Údaysú%Y-%m-%dÚDB_PATHz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z/sgrhdxlv/gkmlpt/index)z
User-AgentÚRefererc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú$/root/gov_crawler/crawl_sgrh_tzgg.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 óê   — t        j                  dd| xs d«      } t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z	<br\s*/?>z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sa   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆ|˜R ¢ bÓ)€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   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=é   ©ÚheadersÚtimeoutÚarticlesÚclassifyÚ
post_countr   zAPI Pú ERR: )ÚrequestsÚgetÚAPI_URLÚHEADERSÚjsonÚintÚ	Exceptionr   )ÚpageÚ	page_sizeÚrÚjÚes        r   Ú
fetch_listr1   $   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                 ó°  — | syt        | d«      }|j                  dd¬«      D ]V  }|j                  dd«      }|j                  d¬«      xs d}t	        |xs t
        |«      }|j                  d	|› d
|› d�«       ŒX |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]y  }	|	j                  dk(  r|j                  t        |	«      «       Œ-|	j                  dk(  sŒ=|	j                  d«      rŒO|	j                  dd¬«      }
|
sŒe|j                  d|
› d�«       Œ{ |rdj                  |«      S | j                  «       S )Nr   zhtml.parserÚaT)Úhrefr4   )r   u   é™„ä»¶z<p><a href="z">z</a></p>)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorr   ú<p>z</p>z

)r   Úfind_allr&   Úget_textr   ÚBASE_URLÚreplace_withÚunwrapÚnameÚappendÚstrÚfind_parentÚjoinr   )Úcontent_htmlÚpage_urlÚsoupÚa_tagr4   ÚtextÚfull_urlÚtagÚpartsÚelr   s              r   Úextract_clean_textrT   -   sF  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜ˜8Ò/¤x°Ó6ˆØ×Ñ˜\¨(¨°2°d°V¸8ÐDÕEð	Fð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜s 1 # T˜]Õ+ð,ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c                 óN  — 	 t        j                  t        › d| › �t        d¬«      }|j	                  «       }t        |j                  dd«      «      }|j                  d«      xs |j                  d«      xs d}|r/	 t        j                  t        |«      «      j                  d	«      }nd}|j                  dd«      xs d}|rt        ||«      nd}|||fS # t        t        t        f$ r t        |«      d d
 }Y ŒOw xY w# t        $ r}	t!        d| › d|	› �«       Y d }	~	yd }	~	ww xY w)Nú/r   r   Útitler   Údisplay_publish_timeÚpublish_timer   r   é
   Úcontentz  api detail r$   )NNN)r%   r&   ÚPOST_URLr(   r)   r   r   Úfromtimestampr*   ÚstrftimeÚ
ValueErrorÚ	TypeErrorÚOSErrorrH   rT   r+   r   )
Úart_idrL   r.   r/   rW   ÚtsÚpubrK   r[   r0   s
             r   Úparse_detailre   B   s  € ð Ü�L‰LœH˜: Q v hÐ/¼È"ÔMˆØ�F‰F‹HˆÜ˜AŸE™E '¨2Ó.Ó/ˆØ�U‰UÐ)Ó*ÒH¨a¯e©e°NÓ.CÒHÀqˆÙð#Ü×,Ñ,¬S°«WÓ5×>Ñ>¸zÓJ‘ð ˆCØ—u‘u˜Y¨Ó+Ò1¨rˆÙ@LÔ$ \°8Ô<ÐRTˆØ�c˜7Ð"Ð"øô ¤	¬7Ð3ò #Ü˜"“g˜c˜r�l’ð#ûô ò  Üˆm˜F˜8 6¨!¨Ð-Ô.Üûð ús<   ‚A:D  Á=-C Â*-D  Ã"C=Ã:D  Ã<C=Ã=D  Ä 	D$Ä	DÄD$é   c                 ó¨  — t        d| › dt        › �«       g }t        «       }d}t        d| dz   «      D �]£  }t	        |«      \  }}d}|D �]D  }|j                  d«      }	t        |j                  dd«      «      }
|j                  d«      xs |j                  d	«      xs d}|r/	 t        j                  t        |«      «      j                  d
«      }nd}|j                  dd«      }|dk(  rL|j                  dd«      xs |j                  dd«      xs d}|j                  d«      s1t!        t"        |«      }n |j                  dd«      xs t"        › d|	› d�}|s�Œ||vs�Œ|j%                  |«       |j'                  |
|||	|dœ«       |dz  }�ŒG 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«      dk(  r3|d   }
|d   }d|
› d|› d�}|j'                  |
||d   |t0        dd œ«       Œ_t3        |d!   |d   «      \  }
}}|j'                  |
xs |d   |d   |xs |d   |t0        dd œ«       |dz  dk(  rt        d"|› d#t)        |«      › �«       t+        j,                  d$«       ŒÚ |rct5        |d%d&¬'«      5 }|D ]+  }|j7                  t9        j:                  |d(¬)«      d*z   «       Œ- 	 d d d «       t        d+t)        |«      › d,|› �«       y t=        j>                  t@        «      }|jC                  d-«       |jE                  «       }dx}}|D ]W  }	 |jC                  d.|d/   |d0   |d0   |d   |d1   |d2   |d2   xs dd d3 |d4   d5f	«       |jF                  dkD  r|dz  }n|dz  }ŒY |jK                  «        |jM                  «        t        d7|› d8|› d9�«       y # t        t        t        f$ r t        |«      d d }Y �ŒFw xY w# 1 sw Y   �ŒxY w# tH        $ r}t        d6|› �«       |dz  }Y d }~Œäd }~ww xY w):NzCrawl pages=z cutoff=r   é   ÚidrW   r   rX   Údater   rZ   ÚtypeÚnormalÚurlÚpost_urlÚhttpz/sgrhdxlv/gkmlpt/content/post_z.html)rW   rm   Úpub_daterb   rk   ÚPz: z items (z new), total z (post_count=ú)g      à?rp   r@   z</p>
<p><a href="u   ">æŸ¥çœ‹åŽŸæ–‡</a></p>u   é€šçŸ¥å…¬å‘Š)rW   rL   Úpublish_dater[   Ú	site_nameÚcolumnrb   z  rV   g333333Ó?Úwzutf-8)ÚencodingF)Ú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 (?,?,?,?,?,?,?,?,?)rt   rL   rs   r[   iô  ru   zcrawl_sgrh_tzgg.pyz
DB error: zResult: z new, z skipped)'r   ÚCUTOFFÚsetÚranger1   r&   r   r   r]   r*   r^   r_   r`   ra   rH   Ú
startswithr   rC   ÚaddrG   ÚlenÚtimeÚsleepÚ	enumerater   re   ÚopenÚwriter)   ÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountr+   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenÚtotalr>   ÚartsÚnewr3   ÚaidrW   rc   rd   Úatyperm   ÚenrichedÚidxÚitr[   ÚfÚitemÚconnÚcÚstoredÚskippedr0   s                             r   ÚcrawlrŸ   V   s¢  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DØ€EÜ�1�e˜a‘iÓ ó ˆÜ  “m‰ˆˆeØˆØó 	ˆAØ—%‘%˜“+ˆCÜ §¡ g¨rÓ 2Ó3ˆEØ—‘Ð-Ó.ÒD°!·%±%¸³-ÒDÀ1ˆBÙð'Ü"×0Ñ0´°R³Ó9×BÑBÀ:ÓN‘Cð �Ø—E‘E˜& (Ó+ˆEØ˜Š~Ø—e‘e˜E 2Ó&ÒE¨!¯%©%°
¸BÓ*?ÒEÀ2�Ø—~‘~ fÔ-Ü!¤(¨CÓ0‘Cà—e‘e˜J¨Ó+Òd´(°Ð;YÐZ]ÐY^Ð^cÐ/d�Û�s $“Ø—‘˜”Ø× Ñ ¨5¸È#ÐY\ÐfkÑ!lÔmØ�q‘’ð+	ô, 	ˆa�ˆs�"”S˜“Y�K˜x¨ u¨M¼#¸i».Ð9IÈÐW\ÐV]Ð]^Ð_Ô`ÙÙÜ�
‰
�3Žð9ð< €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5ØØ�6‰6�&‹>˜UÒ"Ø�w‘KˆEØ�U‘)ˆCØ˜E˜7Ð"4°S°EÐ9OÐPˆGØ�O‰OØ¨CÀÀJÁØ"´Ànñô ð Ü*¨2¨h©<¸¸E¹ÓCÑˆˆs�GØ�‰ØÒ)˜b ™kØ˜5™	ØÒ1 2 j¡>ØÜ"Ø$ñ
ô 	ð �‰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±Ð@TðVô	Wð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôW #¤I¬wÐ7ò 'Ü˜b›' # 2˜,“Cð'ú÷^	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús7   Â$-O5Ë1PÍ,AP+Ï5"PÐPÐP(Ð+	QÐ4QÑQÚ__main__rh   z--pages=r   z--pages=(\d+)z--json)r�   rŽ   )éd   )N)rf   N)+Ú__doc__r   ÚsysÚosr)   r€   r†   r%   r   r   Úbs4r   Úurllib.parser   r   rC   r'   r\   ÚDOMAINÚGROUPÚnowr^   rz   Úenvironr&   r	   r(   r   r   r1   rT   re   rŸ   Ú__name__ÚargvÚargsr�   rŽ   rJ   r*   ÚsearchÚgroupÚindex© r   r   ú<module>r²      sL  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  àT€	Ø$€ØˆJÐ3Ð
4€ØˆZÐ0Ð1€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€ð KØ!˜
Ð"8Ð9ñ;€ò.òóóAò* ó(Z4ðx ˆ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   