Ë
    ,„j  ã                   ó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)%ub  
æ¢…å·žå¸‚æ¢…åŽ¿åŒºç™½æ¸¡é•‡äººæ°‘æ”¿åºœ - éƒ¨é—¨æ–‡ä»¶ (gdmx.gov.cn/mzmxbdzzf/gkmlpt/index#6614)
CMS: å¹¿ä¸œ gkmlpt Vue SPA API (å�Œ suixi/sgrh)
åˆ—è¡¨: GET /mzmxbdzzf/gkmlpt/api/all/6614?page=N&pageSize=100  JSON (111æ�¡)
è¯¦æƒ…: GET /mzmxbdzzf/gkmlpt/api/post/{id}  JSON (content=HTML)
ç”¨æ³•: python3 crawl_gdmx_bdz.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu(   æ¢…å·žå¸‚æ¢…åŽ¿åŒºç™½æ¸¡é•‡-éƒ¨é—¨æ–‡ä»¶zhttps://www.gdmx.gov.cnz/mzmxbdzzf/gkmlpt/api/all/6614z/mzmxbdzzf/gkmlpt/api/postzwww.gdmx.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/mzmxbdzzf/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_gdmx_bdz.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                 óÀ  — t        d«      D ]Ú  }	 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c S  y# t        t        t        f$ r t        |«      d d }Y ŒSw xY w# t         $ rB}
|dk(  rt#        d| › d|
› �«       Y d }
~
 yt%        j&                  d|dz   z  «       Y d }
~
�ŒLd }
~
ww xY w)Né   ú/r   r   Útitler   Údisplay_publish_timeÚpublish_timer   r   é
   Úcontenté   z  api detail r$   )NNNé   é   )Úranger%   r&   ÚPOST_URLr(   r)   r   r   Úfromtimestampr*   ÚstrftimeÚ
ValueErrorÚ	TypeErrorÚOSErrorrH   rT   r+   r   ÚtimeÚsleep)Úart_idrL   Úattemptr.   r/   rX   ÚtsÚpubrK   r\   r0   s              r   Úparse_detailrm   B   sO  € Ü˜“8ò *ˆð	*Ü—‘¤˜z¨¨6¨(Ð3¼WÈbÔQˆAØ—‘“ˆAÜ §¡ g¨rÓ 2Ó3ˆEØ—‘Ð-Ó.ÒL°!·%±%¸Ó2GÒLÈ1ˆBÙð'Ü"×0Ñ0´°R³Ó9×BÑBÀ:ÓN‘Cð �ØŸ5™5 ¨BÓ/Ò5°2ˆLÙDPÔ(¨°xÔ@ÐVXˆGØ˜#˜wÐ&Ò&ð*ð* øô #¤I¬wÐ7ò 'Ü˜b›' # 2˜,’Cð'ûô ò 	*Ø˜!Š|Ü�m F 8¨6°!°Ð5Ô6Ý'Ü�J‰J�q˜G a™KÑ(×)Ò)ûð		*úsB   �A:DÂ-C*Â8-DÃ*"DÄDÄDÄDÄ	EÄEÄ7EÅEé   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   r_   ÚidrX   r   rY   Údater   r[   ÚtypeÚnormalÚurlÚpost_urlÚhttpz/mzmxbdzzf/gkmlpt/content/post_z.html)rX   rt   Úpub_dateri   rr   ÚPz: z items (z new), total z (post_count=ú)g      à?rw   r@   z</p>
<p><a href="u   ">æŸ¥çœ‹åŽŸæ–‡</a></p>u   éƒ¨é—¨æ–‡ä»¶)rX   rL   Úpublish_dater\   Ú	site_nameÚcolumnri   z  rW   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 (?,?,?,?,?,?,?,?,?)r{   rL   rz   r\   iô  r|   zcrawl_gdmx_bdz.pyz
DB error: zResult: z new, z skipped)'r   ÚCUTOFFÚsetr`   r1   r&   r   r   rb   r*   rc   rd   re   rf   rH   Ú
startswithr   rC   ÚaddrG   Úlenrg   rh   Ú	enumerater   rm   ÚopenÚwriter)   ÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountr+   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenÚtotalr>   ÚartsÚnewr3   ÚaidrX   rk   rl   Úatypert   ÚenrichedÚidxÚitr\   ÚfÚitemÚconnÚcÚstoredÚskippedr0   s                             r   Úcrawlr£   Z   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¨Ó+Òe´(°Ð;ZÐ[^ÐZ_Ð_dÐ/e�Û�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±Ð@SðUô	Vð �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__r_   z--pages=r   z--pages=(\d+)z--json)r‘   r’   )éd   )N)rn   N)+Ú__doc__r   ÚsysÚosr)   rg   rŠ   r%   r   r   Úbs4r   Úurllib.parser   r   rC   r'   ra   ÚDOMAINÚGROUPÚnowrc   r�   Úenvironr&   r	   r(   r   r   r1   rT   rm   r£   Ú__name__ÚargvÚargsr‘   r’   rJ   r*   ÚsearchÚgroupÚindex© r   r   ú<module>r¶      sL  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à6€	Ø$€ØˆJÐ4Ð
5€ØˆZÐ1Ð2€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€ð KØ!˜
Ð"9Ð:ñ<€ò.òóóAò*ó0Z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   