Ë
    ¸¬ujú+  ã                   ó¶   — 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 ddlm	Z	 dZ
dZdZdd	d
œZdZd„ Zd„ Zd„ Zdd„Zd„ Z	 	 dd„Zd„ Zedk(  r e«        yy)u…  
crawl_ynsthjt_npzx.py - äº‘å�—çœ�ç”Ÿæ€�çŽ¯å¢ƒåŽ…-æ‹Ÿå®¡æŸ¥é¡¹ç›®å…¬ç¤º
========================================================
ç«™ç‚¹: https://sthjt.yn.gov.cn/hpgl/jsxmhjyxpj/npzxmgs/wap.html
CMS:  äº‘å�—æ”¿åŠ¡WAPç«™ (Bootstrap + jQuery + TRS)
åˆ—è¡¨: å�•é¡µ240æ�¡ï¼Œul.news-ul > li > a[href] + .news-ul-tt + .news-ul-date
è¯¦æƒ…: <div class="TRS_Editor">, <h1 class="article-tt">æ ‡é¢˜, æ—¥æœŸä»Ž.article-dateæ��å�–

ç”¨æ³•:
  python3 crawl_ynsthjt_npzx.py              # é»˜è®¤å…¨éƒ¨
  python3 crawl_ynsthjt_npzx.py --pages 5    # é™�åˆ¶æœ€å¤šçˆ¬Næ�¡(Xé¡µÃ—10æ�¡,å®žé™…å…¨éƒ¨åœ¨1é¡µ)
  python3 crawl_ynsthjt_npzx.py --dry-run    # ä»…é¢„è§ˆ
é    N)Údatetime)ÚBeautifulSoupzhttps://sthjt.yn.gov.cnz!/hpgl/jsxmhjyxpj/npzxmgs/wap.htmlz/hpgl/jsxmhjyxpj/npzxmgszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)z
User-AgentÚAccepté   c                 óp   — t        j                  «       j                  d«      }t        d|› d| › �d¬«       y )Nz%H:%M:%Sú[ú] T)Úflush)r   ÚnowÚstrftimeÚprint)ÚmsgÚtss     ú'/root/gov_crawler/crawl_ynsthjt_npzx.pyÚlogr   !   s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                 óŽ   — | sy| j                  dd«      j                  dd«      j                  dd«      } | j                  d«      S )	u8   æ¸…æ´—æ ‡é¢˜ï¼šstrip &middot; &nbsp; ç­‰HTMLå®žä½“å‰�ç¼€Ú z&middot;õ   Â·z&nbsp;ú z&amp;ú&u
   Â·. \t\n\r)ÚreplaceÚstrip)Útitles    r   Úclean_titler   &   sB   € áØØ�M‰M˜* dÓ+×3Ñ3°H¸cÓB×JÑJÈ7ÐTWÓX€EØ�;‰;�Ó'Ð'r   c                 ó¤  ‡	— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  d«       Œ |j                  dg«      D ]  }|j                  «        Œ t	        |j                  dd	g«      «      D ]g  }|j
                  D �cg c]*  }|j                  €t        |«      j                  «       sŒ)|‘Œ, }}|sŒEt        d
„ |D «       «      sŒX|j                  «        Œi dˆ	fd„	Š	 ‰	|«      }g d¢}|D ]  }t        j                  |d|«      }Œ |j                  «       S c c}w )u5   æ¸…æ´—æ­£æ–‡HTMLï¼šåŽ»å†—ä½™æ ‡ç­¾ï¼Œä¿�ç•™è¡¨æ ¼HTMLr   úhtml.parserÚstyleÚscriptÚbrú
zo:pÚpÚdivc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r"   N)Úname)Ú.0Úcs     r   ú	<genexpr>zclean_html.<locals>.<genexpr>>   s   è ø€ Ò4¨!˜Ÿ™ #�Ñ4ùs   ‚c                 ó   •— g }| j                   D �]  }|j                  €.t        |«      j                  «       }|sŒ,|j	                  |«       Œ>|j                  dk(  r|j	                  t        |«      «       Œh|j                  dv r- ‰|d¬«      }|j                  «       sŒ‘|j	                  |«       Œ£|j                  dv r- ‰|d¬«      }|j                  «       sŒÌ|j	                  |«       ŒÞ|j                  d¬«      }|sŒó|j	                  |«       �Œ |r?dj                  d„ |D «       «      }t        j                  d	d|«      }|j                  «       S d
j                  d„ |D «       «      }|j                  «       S )NÚtable)r"   r#   ÚtdÚthÚliÚsectionÚtrÚtbodyÚtheadÚh1Úh2Úh3Úh4Úh5Úh6T)Ú	is_inline)ÚspanÚfontÚbÚiÚstrongÚemÚaÚuÚsubÚsupÚsmallÚlabel©r   r   c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©NrE   ©r&   r"   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>Y   s   è ø€ Ò< A°!·'±'µ)œaÑ<ùó   ‚˜z {2,}ú

c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wrG   rE   rH   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>\   s   è ø€ Ò ? q°Q·W±WµY¤Ñ ?ùrI   )	Úchildrenr%   Ústrr   ÚappendÚget_textÚjoinÚrerA   )Úelementr8   ÚpartsÚchildÚtextÚinnerÚresultÚextract_contents          €r   rX   z#clean_html.<locals>.extract_contentA   sF  ø€ ØˆØ×%Ñ%ó 	'ˆEØ�z‰zÐ!Ü˜5“z×'Ñ'Ó)�ÚØ—L‘L Õ&Ø—‘˜wÒ&Ø—‘œS ›ZÕ(Ø—‘ð  Mñ Má'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'Ø—‘ð  Eñ Eá'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'à—~‘~¨D�~Ó1�ÚØ—L‘L Ö&ð)	'ñ* Ø—X‘XÑ<¨Ô<Ó<ˆFÜ—V‘V˜H c¨6Ó2ˆFð �|‰|‹~Ðð —[‘[Ñ ?¨EÔ ?Ó?ˆFØ�|‰|‹~Ðr   )u7   (?<!\n)\s+(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])u8   (?<!\n)\s+(?=[ï¼ˆ][ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��][ï¼‰])u2   (?<=[ã€‚ï¼�ï¼Ÿ])\s+(?=\d+[.ã€�]\s*[\u4e00-\u9fff])u:   (?<!\n)\s{2,}(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])rJ   )F)r   Úfind_allÚ	decomposeÚreplace_withÚlistrL   r%   rM   r   ÚallÚunwraprQ   rA   )
Úcontent_htmlÚsoupÚtagr    r'   ÚkidsrW   Úsection_patsÚpatrX   s
            @r   Ú
clean_htmlre   .   s9  ø€ áØÜ˜ }Ó5€Dà�}‰}˜g xÐ0Ó1ò ˆØ�‰�ðà�m‰m˜DÓ!ò ˆØ
�‰˜Õðà�}‰}˜e˜WÓ%ò ˆØ�‰�ðô �D—M‘M 3¨ ,Ó/Ó0ò ˆØŸ<™<ÖW�a°·±°ÄsÈ1ÃvÇ|Á|Å~’ÐWˆÐWÚ”CÑ4¨tÔ4Õ4Ø�J‰J�Lðõ
ñ< ˜TÓ"€Fò€Lð ò -ˆÜ—‘˜˜V VÓ,‰ð-ð �<‰<‹>Ðùò] Xs   Â4*EÃEc                 ób  — t         › t        › �}	 t        j                  |t        d¬«      }d|_        |j                  }t        |d«      }|j                  dd¬	«      }|st        d
«       g S g }|j                  d«      D ]ü  }|j                  d«      }	|j                  dd¬	«      }
|j                  dd¬	«      }|	sŒ=|
sŒ@|	j                  dd«      j                  «       }|rU|j                  d«      sD|j                  d«      r|j                  d«      }t         t        z   dz   |j                  d«      z   }t!        |
j#                  d¬«      «      }|r|j#                  d¬«      nd}|j%                  |||dœ«       Œþ | dkD  r|d|  }|S # t        $ r}t        d|› �«       g cY d}~S d}~ww xY w)u1   èŽ·å�–åˆ—è¡¨é¡µï¼Œè¿”å›žitems[{title, date, url}]é   ©ÚheadersÚtimeoutúutf-8u   åˆ—è¡¨é¡µè¯·æ±‚å¤±è´¥: Nr   Úulznews-ul©Úclass_u   æœªæ‰¾åˆ°news-ulåˆ—è¡¨r-   r?   r#   z
news-ul-ttznews-ul-dateÚhrefr   Úhttpú.ú/TrE   )r   ÚdateÚurlr   )ÚBASE_URLÚ	LIST_PATHÚrequestsÚgetÚHEADERSÚencodingrU   Ú	Exceptionr   r   ÚfindrY   r   Ú
startswithÚlstripÚ
DETAIL_DIRr   rO   rN   )Úlimitrt   ÚrespÚhtmlÚer`   rl   Úitemsr-   r?   ÚttÚdtro   r   Údate_strs                  r   Ú
fetch_listrˆ   n   s—  € äˆJ”y�kÐ
"€CðÜ�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€DØ	�‰�4 	ˆÓ	*€BÙÜÐ$Ô%Øˆ	à€EØ�k‰k˜$Óò JˆØ�G‰G�C‹LˆØ�W‰W�U <ˆWÓ0ˆØ�W‰W�U >ˆWÓ2ˆÚ’Ø—5‘5˜ Ó$×*Ñ*Ó,ˆDÙ˜DŸO™O¨FÔ3à—?‘? 3Ô'ØŸ;™; sÓ+�DÜ¤*Ñ,¨sÑ2°T·[±[ÀÓ5EÑE�Ü §¡°$ Ó 7Ó8ˆEÙ24�r—{‘{¨�{Ô.¸"ˆHØ�L‰L 5°(À4ÑHÕIðJð ˆq‚yØ�f�u�ˆà€Løô; ò ÜÐ% a SÐ)Ô*Ø�	ûðús   �/F Æ	F.ÆF)Æ#F.Æ)F.c                 óÌ  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|s'|j                  dd¬«      }|r|j                  d¬«      }|sE|j                  d«      }|r2|j                  d¬«      j                  d«      d   j                  «       }|rt        |«      nd}d}	|j                  d	d
di¬«      }
|
r'|
j                  d«      r|
d   j                  «       dd }	|	s”|j                  dd¬«      }|r|j                  d¬«      }t        j                  d|«      }|rU|j                  d«      › d|j                  d«      j!                  d«      › d|j                  d«      j!                  d«      › �}	d}|j                  dd¬«      }|r |j#                  «       j%                  d«      }n4|j                  dd ¬«      }|r|j#                  «       j%                  d«      }||	|fS # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)!u7   èŽ·å�–è¯¦æƒ…é¡µï¼Œè¿”å›ž(title, pub_date, content_html)rg   rh   rk   u   è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥ z: N)NNNr   Úmetar%   ÚArticleTitle)ÚattrsÚcontentr2   z
article-ttrm   TrE   r   ú-r   r   ÚPubDateé
   r#   zarticle-dateu"   (\d{4})å¹´(\d{1,2})æœˆ(\d{1,2})æ—¥é   é   é   Ú
TRS_Editorz	article-p)rw   rx   ry   rz   rU   r{   r   r   r|   r   rO   Úsplitr   rQ   ÚsearchÚgroupÚzfillÚencode_contentsÚdecode)rt   r�   r‚   rƒ   r`   r   Ú
meta_titler2   Ú	title_tagÚpub_dateÚ	meta_dateÚdate_divÚtxtÚmr_   Ú
trs_editorÚart_ps                    r   Úfetch_detailr¤   •   sV  € ð Ü�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�t LˆYÓ1ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2×8Ñ8¸Ó=¸aÑ@×FÑFÓHˆEÙ"'ŒK˜Ô¨R€Eð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆÙØ—9‘9˜U¨>�9Ó:ˆÙØ×#Ñ#¨$Ð#Ó/ˆCÜ—	‘	Ð?ÀÓEˆAÙØŸg™g a›j˜\¨¨1¯7©7°1«:×+;Ñ+;¸AÓ+>Ð*?¸qÀÇÁÈÃ×AQÑAQÐRSÓATÐ@UÐV�ð €LØ—‘˜5¨�Ó6€JÙØ!×1Ñ1Ó3×:Ñ:¸7ÓC‰ð —	‘	˜%¨�	Ó4ˆÙØ ×0Ñ0Ó2×9Ñ9¸'ÓBˆLà�(˜LÐ(Ð(øô[ ò  ÜÐ$ S E¨¨A¨3Ð/Ô0Üûð ús   ‚/H? È?	I#ÉIÉI#c                 ó–  — | st        d«       yd}ddl}d}| D �]"  }|j                  dd«      }|j                  dd«      }	|j                  dd«      }
|j                  d	d«      }|r|
sŒQ|j                  d
d«      }|
j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|	j                  d
d«      }|r|j                  d
d«      nd}d|› d|› d|› d|› d|› d|› d|› d|› d|› d�}d|d|› �g}	 |j	                  |ddd¬«      }|j
                  dk(  r|dz  }�Œ% t        d|› dt        | «      › d�«       t        d«       |j                  d
d«      }d|› d�}	 |j	                  d||gddd¬«       y# t        $ r Y �ŒŠw xY w# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)u   å…¥åº“åˆ° search.dbu   æ— æ•°æ�®å�¯å…¥åº“Nz/mnt/data/search.dbr   r   r   rs   rt   r�   ú'z''z†INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, summary, content, group_name, industry) VALUES ('z', 'z');Úsqlite3zPRAGMA busy_timeout=15000; Trg   )Úcapture_outputrU   rj   r‘   u   å…¥åº“å®Œæˆ�: rr   õ    æ�¡u   å�Œæ­¥FTS...z“INSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.site_name='zA' AND NOT EXISTS (SELECT 1 FROM gov_search s WHERE s.rowid=r.id);u   FTSå�Œæ­¥å¤±è´¥: )r   Ú
subprocessrx   r   ÚrunÚ
returncoder{   Úlen)r„   Úsource_nameÚ
group_nameÚindustryÚdb_pathrª   ÚinsertedÚitemr   rs   rt   r�   Ú	esc_titleÚesc_urlÚ
esc_sourceÚ	esc_groupÚesc_industryÚesc_dateÚesc_contentÚuse_sqlÚcmdrW   Úesc_source_safeÚfts_sqlrƒ   s                            r   Úpush_to_searchdbr¿   Ë   se  € ñ ÜÐ Ô!Øà#€GÛà€HØó )ˆØ—‘˜ "Ó%ˆØ�x‰x˜ Ó#ˆØ�h‰h�u˜bÓ!ˆØ—(‘(˜9 bÓ)ˆá™CØà—M‘M # tÓ,ˆ	Ø—+‘+˜c 4Ó(ˆØ ×(Ñ(¨¨dÓ3ˆ
Ø×&Ñ& s¨DÓ1ˆ	Ø×'Ñ'¨¨TÓ2ˆØ—<‘<  TÓ*ˆÙ4;�g—o‘o c¨4Ô0Àˆðð ˆ|ð Øˆyð Øˆyð Øˆ{ð Øˆzð Øˆ{ð Øˆ}ð Øˆ{ð Øˆ~ð ðð 	ð  ˜'Ð%@ÀÀ	Ð#JÐKˆð	Ø—^‘^Ø D¨t¸Rð $ó ˆFð × Ñ  AÒ%Ø˜A‘�ùðO)ôV ˆ.˜˜
 !¤C¨£J <¨tÐ4Ô5ô ˆÔØ!×)Ñ)¨#¨tÓ4€Oð	ð .Ð.ð /Jð	Jð ð%Ø�‰Ø˜ Ð)Ø d°Bð 	õ 	
øô! ò 	Úð	ûô( ò %ÜÐ ˜sÐ#×$Ñ$ûð%ús*   Ä)FÅ>F' Æ	F$Æ#F$Æ'	GÆ0GÇGc                  óz  — dd l } | j                  d¬«      }|j                  dt        t        d¬«       |j                  ddd	¬
«       |j                  «       }|j                  r|j                  dkD  r|j                  dz  nd}t        d|xs d› d|j                  › �«       t        |¬«      }t        dt        |«      › d�«       |j                  rA|d d D ]-  }t        d|d   › d|d   d d › �«       t        d|d   › �«       Œ/ t        d«       y t        |«      D ]ƒ  \  }}t        d|dz   › dt        |«      › d|d   d d › d�«       t        |d   «      \  }}}	|xs |d   }
|xs |d   }|	rt        |	«      nd}|
|d<   ||d<   ||d <   t        j                   d!«       Œ… t        d"t        |«      › d#�«       |d d$ D ]_  }t        d|d   › d|d   d d › �«       t        d|d   › �«       t        d%t        |j#                  d d«      «      › d&�«       t        «        Œa |rt%        |«       t        d'«       y )(Nr   u4   äº‘å�—çœ�ç”Ÿæ€�çŽ¯å¢ƒåŽ…-æ‹Ÿå®¡æŸ¥é¡¹ç›®å…¬ç¤ºçˆ¬è™«)Údescriptionz--pagesuL   é™�åˆ¶æœ€å¤šçˆ¬å�–æ�¡ç›®æ•°ï¼ˆå®žé™…æ�¡æ•°=pagesÃ—10ï¼Œé»˜è®¤å…¨éƒ¨240æ�¡ï¼‰)ÚtypeÚdefaultÚhelpz	--dry-runÚ
store_trueu   ä»…é¢„è§ˆä¸�å®žé™…çˆ¬å�–è¯¦æƒ…)ÚactionrÄ   r�   u'   ðŸš€ çˆ¬è™«å�¯åŠ¨: ynsthjt_npzx, limit=r]   z
, dry_run=)r€   u   åˆ—è¡¨èŽ·å�–åˆ° r©   r   z  [rs   r	   r   é2   z  URL: rt   u   âœ… é¢„è§ˆå®Œæˆ�r‘   rr   é(   z...r   r�   g      à?u   
=== çˆ¬å�–å®Œæˆ�: u    æ�¡ ===r“   u
     æ­£æ–‡: z charsu   âœ… å…¨éƒ¨å®Œæˆ�)ÚargparseÚArgumentParserÚadd_argumentÚintÚDEFAULT_PAGESÚ
parse_argsÚpagesr   Údry_runrˆ   r­   r   Ú	enumerater¤   re   ÚtimeÚsleeprx   r¿   )rÉ   ÚparserÚargsr€   Ú	all_itemsr³   r<   Údetail_titleÚdetail_dater_   Úfinal_titleÚ
final_dateÚcleaned_contents                r   ÚmainrÜ     sq  € ÛØ×$Ñ$Ð1gÐ$Óh€FØ
×Ñ˜	¬´]Økð ô mà
×Ñ˜¨LØ=ð ô ?à×ÑÓ€Dà#Ÿzšz¨d¯j©j¸1ªnˆD�J‰J˜ŠOÀ!€EÜÐ
1°%².¸5Ð1AÀÈDÏLÉLÈ>ÐZÔ[ä Ô'€IÜÐ
œ3˜y›>Ð*¨$Ð/Ô0à‡|‚|Ø˜b˜q�Mò 	+ˆDÜ�C˜˜V™�~ R¨¨W©°c°rÐ(:Ð';Ð<Ô=Ü�G˜D ™K˜=Ð)Õ*ð	+ô 	ÐÔØä˜YÓ'ò 
‰ˆˆ4Üˆc�!�A‘#��aœ˜I›Ð' r¨$¨w©-¸¸Ð*<Ð)=¸SÐAÔBÜ2>¸tÀE¹{Ó2KÑ/ˆ�k <Ø"Ò3 d¨7¡mˆØ Ò0 D¨¡Lˆ
Ù6Bœ* \Ô2Èˆà#ˆˆW‰Ø!ˆˆV‰Ø)ˆˆY‰Ü�
‰
�3�ð
ô Ð
œs 9›~Ð.¨hÐ7Ô8Ø˜"˜1�ò ˆÜ��D˜‘L�>  D¨¡M°#°2Ð$6Ð#7Ð8Ô9Ü�˜˜U™�}Ð%Ô&Ü�
œ3˜tŸx™x¨	°2Ó6Ó7Ð8¸Ð?Ô@Ü�ð	ñ Ü˜Ô#äÐÕr   Ú__main__)r   )Úynsthjt_npzxu	   äº‘å�—çœ�u   çŽ¯è¯„å…¬ç¤º)Ú__doc__ÚsysÚosrQ   Újsonrw   rÒ   r   Úbs4r   ru   rv   r   ry   rÍ   r   r   re   rˆ   r¤   r¿   rÜ   Ú__name__© r   r   ú<module>ræ      sˆ   ðñ÷ )× (× (Ý Ý à$€Ø/€	Ø'€
ðGàOñ€ð €ò'ò
(ò=ó@$òN3)ðl DOØ,óH%òV,ð^ ˆzÒÙ…Fð r   