Ë
    r6Œ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ZddlmZmZ ddl	m
Z
 ddlZddlmZ d„ Z eej                  dd «      Z ede› �«        ej$                  d	d
«      ZdZdZdZdZdZdZ ej4                  «        ed¬«      z
  j7                  d«      ZdddœZd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%e&dk(  r e%«        yy) uv  
å†…è’™å�¤è‡ªæ²»åŒºç”Ÿæ€�çŽ¯å¢ƒåŽ… - éƒ¨é—¨æ–‡ä»¶(bmwj) çˆ¬è™«
URL: https://sthjt.nmg.gov.cn/xxgk/zfxxgk/fdzdgknr/bmwj/
CMS: å†…è’™å�¤æ”¿åŠ¡å…¬å¼€å¹³å�° é�™æ€�åˆ†é¡µ
åˆ—è¡¨: index.html / index_N.html (æ¯�é¡µ10æ�¡, å…±2089æ�¡â‰ˆ209é¡µ)
åˆ—è¡¨è¡¨æ ¼: åº�å�· | æ ‡é¢˜ | æ ‡é¢˜(ç§»åŠ¨ç‰ˆ) | æ–‡å�· | æˆ�æ–‡æ—¥æœŸ | å�‘å¸ƒæ—¥æœŸ
è¯¦æƒ…: tYYYYMM_xxxx.html, æ­£æ–‡å®¹å™¨ trs_editor_view (docContent ä¸�å�¯é� )

ç”¨æ³•:
  python3 crawl_sthjt_nmg_zfxxgk.py --pages=1     # å¢žé‡�: å‰�1é¡µ(10æ�¡)
  python3 crawl_sthjt_nmg_zfxxgk.py --pages=5     # é¦–æ‰¹å‰�5é¡µ
  python3 crawl_sthjt_nmg_zfxxgk.py --pages=50    # å…¨é‡�(2089æ�¡â‰ˆ209é¡µ)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)ÚBeautifulSoupc                 óL  — d| v ryt        | «      D ]‘  \  }}|dk(  r:|dz   t        | «      k  r)| |dz      j                  «       rt        | |dz      «      c S |j	                  d«      rt        |j                  d«      d   «      c S |j                  «       sŒ†t        |«      c S  y)Nz--fulli'  z--pagesé   z--pages=ú=)Ú	enumerateÚlenÚisdigitÚintÚ
startswithÚsplit)ÚargvÚiÚas      ú+/root/gov_crawler/crawl_sthjt_nmg_zfxxgk.pyÚparse_pagesr      s™   € Ø�4ÑØÜ˜$“ò ‰ˆˆ1Ø�	Š>˜a !™e¤c¨$£iÒ/°D¸¸1¹±I×4EÑ4EÔ4GÜ�t˜A˜a™C‘y“>Ò!Ø�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMðð ó    r   z[sthjt-zfxxgk] max_pages=Ú	SEARCH_DBz/mnt/data/search.dbzhttps://sthjt.nmg.gov.cnz=https://sthjt.nmg.gov.cn/xxgk/zfxxgk/fdzdgknr/bmwj/index.htmlu%   å†…è’™å�¤ç”Ÿæ€�çŽ¯å¢ƒåŽ…-éƒ¨é—¨æ–‡ä»¶u   éƒ¨é—¨æ–‡ä»¶u	   å†…è’™å�¤é
   iG  )Údaysz%Y-%m-%dzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z3https://sthjt.nmg.gov.cn/xxgk/zfxxgk/fdzdgknr/bmwj/)z
User-AgentÚRefererc                  óª   — t        j                  t        d¬«      } | j                  d«       | j                  d«       t         j                  | _        | S )Né   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚRowÚrow_factory)Úconns    r   Úget_connr$   3   s=   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ü—{‘{€DÔØ€Kr   c                 óÜ   — | s| S | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )Nz&middot;Ú z&nbsp;z&ensp;z&emsp;z[\u200b\u200c\u200d\ufeff])ÚreplaceÚreÚsubÚstrip)Úts    r   Úclean_titler,   :   sb   € ÙØˆØ	�	‰	�*˜bÓ!×)Ñ)¨(°BÓ7×?Ñ?ÀÈ"ÓM×UÑUÐV^Ð`bÓc€AÜ
�‰Ð,¨b°!Ó4€AØ�7‰7‹9Ðr   c                 óH   — | j                  d|f«      j                  «       d uS )Nz'SELECT id FROM gov_raw WHERE page_url=?)r    Úfetchone)r#   Úpage_urls     r   Úis_dupr0   A   s%   € Ø�<‰<ÐAÀHÀ;ÓO×XÑXÓZÐbfÐfÐfr   c                 óÜ  — |rd|v rt        |j                  dd«      «      nd}d}|rt        |d«      j                  d¬«      d d }	 | j	                  dt
        |||||t        |d	t        d
|xs dv rdndf«      }|j                  dkD  r	 | j	                  d|t
        |f«       yy# t        $ r}t        d|› �«       Y d }~yd }~ww xY w# t        $ r}t        d|› �«       Y d }~yd }~ww xY w)Nú-r&   r   úhtml.parserT©r*   éÈ   z¼INSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, content, date_rank, category, summary, script_name, group_name, has_table) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)zcrawl_sthjt_nmg_zfxxgk.pyz<tabler   zCINSERT INTO gov_search (title, site_name, summary) VALUES (?, ?, ?)z    [FTS WARN] Fz    [ERR] insert: )r   r'   r   Úget_textr    Ú	SITE_NAMEÚCATEGORYÚ
GROUP_NAMEÚrowcountÚ	ExceptionÚprint)	r#   Útitler/   Úpublish_dateÚcontentÚ	date_rankÚplainÚcurÚes	            r   Úinsert_itemrD   D   s  € Ù6BÀsÈlÑGZ”�L×(Ñ(¨¨bÓ1Ô2Ð`a€IØ€EÙÜ˜g }Ó5×>Ñ>ÀTÐ>ÓJÈ4ÈCÐPˆðØ�l‰lð7ô ˜˜x¨°wÀ	Ì8ÐUZØ(¬*¸8ÈÊÐSUÑ;V±aÐ\]ð_ó	
ˆð �<‰<˜!Òð-Ø—‘ØYØœI uÐ-ôð Øøô ò -Ü˜¨ sÐ+×,Ð,Øûð-ûô ò ÜÐ" 1 #Ð&Ô'Üûðús=   ÁAC
 ÂB& Â&	CÂ/CÂ=C
 ÃCÃC
 Ã
	C+ÃC&Ã&C+c                 ó°  — |dk  rt         }n	d|dz
  › d�}| j                  |t        d¬«      }d|_        t	        |j
                  d«      }g }t        «       }|j                  d«      D ]ë  }|j                  d	«      }t        |«      d
k  rŒ#d}	|D ]  }
|
j                  dd¬«      }	|	sŒ n |	sŒF|	j                  dd«      }d|vsd|vrŒat        |	j                  «       «      }t        |d   j                  «       «      }t        j                  d|«      }|r|j                  d«      nd}||v rŒÆ|j                  |«       |j!                  |||dœ«       Œí |S )u;   é�™æ€�åˆ†é¡µ: index.html=ç¬¬1é¡µ, index_1.html=ç¬¬2é¡µ, ...r   z9https://sthjt.nmg.gov.cn/xxgk/zfxxgk/fdzdgknr/bmwj/index_z.htmlr   ©Úheadersr   úutf-8r3   ÚtrÚtdé   Nr   T)ÚhrefrL   r&   Út20ústhjt.nmg.gov.cnéÿÿÿÿz(\d{4}-\d{2}-\d{2}))r=   ÚurlÚdate)ÚLIST_URLÚgetÚHEADERSÚencodingr   ÚtextÚsetÚfind_allr   Úfindr,   r6   r(   ÚmatchÚgroupÚaddÚappend)ÚsessionÚpage_numrP   ÚrespÚsoupÚitemsÚseenrI   Útdsr   rJ   rL   r=   Údate_strÚms                  r   Ú
fetch_listrg   _   s^  € à�1‚}Ü‰àIÈ(ÐSTÉ*ÈÐUZÐ[ˆØ�;‰;�s¤G°Rˆ;Ó8€DØ€D„MÜ˜Ÿ™ MÓ2€DØ€EÜ‹5€DØ�m‰m˜DÓ!ò FˆØ�k‰k˜$ÓˆÜˆs‹8�aŠ<ØØˆØò 	ˆBØ—‘˜ $�Ó'ˆAÚÙð	ñ ØØ�u‰u�V˜RÓ ˆØ˜ÑÐ 2¸$Ñ >ØÜ˜AŸJ™J›LÓ)ˆä˜s 2™w×/Ñ/Ó1Ó2ˆÜ�H‰HÐ+¨XÓ6ˆÙ!"�1—7‘7˜1”:¨ˆØ�4‰<ØØ�‰�ŒØ�‰˜u¨T¸8ÑDÕEð-Fð. €Lr   c                 óþ  — t        t        | «      d«      }|j                  g d¢«      D ]  }|j                  «        Œ |j                  dt	        j
                  dt        j                  «      i¬«      D ]  }|j                  «        Œ |j                  d«      D ]L  }|j                  d«      }|rt        t        |«      |d<   |j                  d«      }|sŒ=|j                  «        ŒN g }|j                  g d	¢«      D ]˜  }|j                  }|d
k(  rŒ|dk(  r|j                  d«      rŒ,|j                  d¬«      }|sŒA|dk(  r|j                  t        |«      «       Œa|dv sŒf|dk(  r|j                  ddg«      rŒ|j                  t        |«      «       Œš dj                  |«      }	|	j!                  d«      }
g }|
D ]  }|r	||d   k7  sŒ|j                  |«       Œ  dj                  |«      j#                  «       S )Nr3   )ÚscriptÚstyleÚnoscriptrj   zdisplay\s*:\s*none©Úattrsr   rL   Úimg)ÚpÚtableÚdivÚliÚh1Úh2Úh3Úh4rI   ro   rp   Tr4   )ro   rq   rr   rs   rt   ru   rv   rq   z

rO   )r   ÚstrrX   Ú	decomposer(   ÚcompileÚIrS   r   ÚBASErY   ÚnameÚfind_parentr6   r]   Újoinr   r*   )Únodera   Útagr   rL   rn   ÚpartsÚelrV   r?   ÚsegsÚdedupedÚss                r   Úextract_contentr†   ƒ   sÊ  € Üœ˜T› MÓ2€DØ�}‰}Ò<Ó=ò ˆØ�‰�ðà�}‰} G¬R¯Z©ZÐ8MÌrÏtÉtÓ-TÐ#Uˆ}ÓVò ˆØ�‰�ðà�]‰]˜3Óò ˆØ�u‰u�V‹}ˆÙÜ¤ dÓ+ˆAˆf‰IØ�f‰f�U‹mˆÚØ�M‰M�Oðð €EØ�m‰mÒOÓPò "ˆØ�g‰gˆØ�$Š;ØØ�#Š:˜"Ÿ.™.¨Ô1ØØ�{‰{ ˆ{Ó&ˆÙØØ�'Š>Ø�L‰Lœ˜R›Õ!ØÐ>Ò>Ø�eŠ| §¡¨¨g¨Ô 7ØØ�L‰Lœ˜R›Õ!ð"ð �k‰k˜%Ó €GØ�=‰=˜Ó €DØ€GØò ˆÙ˜!˜w r™{Ó*Ø�N‰N˜1Õðð �;‰;�wÓ×%Ñ%Ó'Ð'r   c                 ó–  — t        | d«      }d}|j                  dddi¬«      }|r|j                  d«      rt        |d   «      }d}|j                  dddi¬«      }|rK|j                  d«      r:t	        j
                  d	|d   j                  «       «      }|r|j                  d
«      }d}|j                  dt	        j                  d«      ¬«      }	|	rt        |	«      }|s3|j                  dt	        j                  d«      ¬«      }	|	rt        |	«      }|s)dD ]$  }
|j                  d|
¬«      }	|	sŒt        |	«      } n |s<dD ]7  }|j                  dt	        j                  |«      ¬«      }	|	sŒ,t        |	«      } n |rDd|v sd|v r<dD ]7  }|j                  dt	        j                  |«      ¬«      }	|	sŒ,t        |	«      } n |s|}|||fS )Nr3   r&   Úmetar|   ÚArticleTitlerl   r?   ÚPubDatez(\d{4}-\d{1,2}-\d{1,2})r   rq   Útrs_editor_view)Úclass_Ú
docContent)Úzoomr?   ÚarticlerV   ÚmainTextÚzoomcon)Úid)r?   r�   Ú
TRS_EditorÚzwgk_contentzmain-contentz	share-boxu	   åˆ†äº«åˆ°)r‹   r�   )
r   rY   rS   r,   r(   rZ   r*   r[   ry   r†   )Ú	html_textÚfallback_titlera   r=   rˆ   Úpub_dateÚmeta_dÚm2r?   rq   ÚcidÚclss               r   Úparse_detailrœ   ¨   sÍ  € Ü˜ MÓ2€DØ€EØ�9‰9�V F¨NÐ#;ˆ9Ó<€DÙ�—‘˜Ô#Ü˜D ™OÓ,ˆØ€HØ�Y‰Y�v f¨iÐ%8ˆYÓ9€FÙ�&—*‘*˜YÔ'Ü�X‰XÐ0°&¸Ñ2C×2IÑ2IÓ2KÓLˆÙØ—x‘x “{ˆHØ€Gà
�)‰)�E¤"§*¡*Ð-?Ó"@ˆ)Ó
A€CÙ
Ü! #Ó&ˆÙØ�i‰i˜¤b§j¡j°Ó&?ˆiÓ@ˆÙÜ% cÓ*ˆGÙØPò 	ˆCØ—)‘)˜E c�)Ó*ˆCÚÜ)¨#Ó.�Ùð		ñ
 àWò 	ˆCØ—)‘)˜E¬"¯*©*°S«/�)Ó:ˆCÚÜ)¨#Ó.�Ùð		ñ �K 7Ñ*¨k¸WÑ.DØ4ò 	ˆCØ—)‘)˜E¬"¯*©*°S«/�)Ó:ˆCÚÜ)¨#Ó.�Ùð		ñ
 ØˆØ�'˜8Ð#Ð#r   c                  ó>  — t        «       } t        j                  «       }	 |j                  t        t
        d¬«       t        }t        d|› d�«       g }t        d|dz   «      D ]`  }t        j                  d«       	 t        ||«      }|j                  |«       t        d|› d	t        |«      › d
�«       t        |«      dk(  r nŒb t        dt        |«      › d�«       dx}x}}	t        |d«      D ]ç  \  }
}|d   |d   |d   }}}	 |r
|t         k  rŒ"|rd|vr|dz  }Œ.t#        | |«      r|dz  }Œ@|j                  |t
        d¬«      }d|_        t'        |j(                  |«      \  }}}|s|}t+        | ||||«      r|dz  }n|dz  }| j-                  «        t        j                  d«       |
dz  dk(  sŒÅt        d|
› dt        |«      › d|› d|› d|	› �
«       Œé | j/                  «        t        d|› d |› d!|	› d"�«       t        d#|› �«       y # t        $ r}t        d|› �«       Y d }~�Œîd }~ww xY w# t        $ r1}t        d|› d|› �«       t        j                  d«       Y d }~�Œd }~ww xY w# t        $ r$}|	dz  }	t        d|d d › d|› �«       Y d }~�Œd }~ww xY w)$Nr   rF   z  [WARN] session init: z[sthjt-zfxxgk] scanning u    pages of éƒ¨é—¨æ–‡ä»¶(bmwj)r   gš™™™™™Ù?z  page z: +z itemsr   z  [WARN] page z: é   z[sthjt-zfxxgk] collected z list itemsr=   rP   rQ   rN   rH   z  [ERR] é(   g333333Ó?é   z  [ú/z] new=z dup=z err=z[sthjt-zfxxgk] DONE: +z new, z dup, z erru   æ–°å¢ž: )r$   ÚrequestsÚSessionrS   rR   rT   r;   r<   Ú	MAX_PAGESÚrangeÚtimeÚsleeprg   Úextendr   r
   ÚDATE_CUTOFFr0   rU   rœ   rV   rD   ÚcommitÚclose)r#   r^   rC   ÚpagesÚ	all_itemsÚpgrb   Ú	new_countÚ	dup_countÚ	err_countÚidxÚitemr=   rP   re   r`   Úd_titler?   r—   s                      r   Úmainrµ   Õ   sÏ  € Ü‹:€DÜ×ÑÓ €Gð-Ø�‰”H¤g°rˆÔ:ô €EÜ	Ð$ U GÐ+GÐ
HÔIà€IÜ�A�u˜q‘yÓ!ò 
ˆÜ�
‰
�3Œð	Ü˜w¨Ó+ˆEØ×Ñ˜UÔ#Ü�G˜B˜4˜s¤3 u£: ,¨fÐ5Ô6Ü�5‹z˜QŠÙð ð
ô 
Ð%¤c¨)£nÐ%5°[Ð
AÔBà()Ð)€IÐ)�	˜IÜ˜y¨!Ó,ò a‰	ˆˆTØ# G™}¨d°5©k¸4À¹<�Hˆsˆð	0Ù˜H¤{Ò2ØÙÐ,°CÑ7Ø˜Q‘�	ØÜ�d˜CÔ Ø˜Q‘�	ØØ—;‘;˜s¬G¸R�;Ó@ˆDØ#ˆDŒMÜ)5°d·i±iÀÓ)GÑ&ˆG�W˜hÙØ#�Ü˜4 ¨#¨x¸ÔAØ˜Q‘‘	à˜Q‘�	ð 	�‰ŒÜ�
‰
�3ŒØ�‰8�q‹=Ü�C˜�u˜Aœc )›nÐ-¨V°I°;¸eÀIÀ;ÈeÐT]ÐS^Ð_Õ`ð5að8 	‡J�J„LÜ	Ð" 9 +¨V°I°;¸fÀYÀKÈtÐ
TÔUÜ	ˆH�Y�KÐ
 Õ!øôi ò -ÜÐ'¨ sÐ+×,Ò,ûð-ûô ò 	Ü�N 2 $ b¨¨Ð,Ô-Ü�J‰J�q�MŠMûð	ûô6 ò 	0Ø˜‰NˆIÜ�H˜U 3 B˜Z˜L¨¨1¨#Ð.×/Ò/ûð	0ús[    H Á;AH2ÄI/ÄI/ÄI/Ä/AI/È	H/ÈH*È*H/È2	I,È;&I'É'I,É/	JÉ8JÊJÚ__main__)'Ú__doc__Úosr(   Úsysr   r¦   Újsonr   r   Úurllib.parser   r¢   Úbs4r   r   r   r¤   r<   Úgetenvr   r{   rR   r7   r8   r9   Ú	PAGE_SIZEÚnowÚstrftimer©   rT   r$   r,   r0   rD   rg   r†   rœ   rµ   Ú__name__© r   r   ú<module>rÃ      sð   ðñ÷ (× '× 'ß (Ý  Û Ý ò
ñ ˜Ÿ™  ˜Ó%€	Ù Ð! ) Ð-Ô .à
ˆ"�)‰)�KÐ!6Ó
7€Ø!€ØJ€Ø3€	Ø€Ø€
Ø€	Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€ð @ØDñ€ò
òògòò6"òH#(òJ+$òZ;"ðz ˆzÒÙ…Fð r   