Ë
    ¸¬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ZddlmZ ddl	m
Z
 dZedz   ZdZdd	iZej                  j                   j#                  «        d
„ Zd„ Zdd„Zd„ Zd„ Zd„ Z	 	 dd„Zd„ Zedk(  r e«        yy)uÓ  
crawl_thx_tzgg.py - ä¹‰å®‰åŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Š
=============================================
ç«™ç‚¹: https://www.ahtlyaq.gov.cn/yaqrmzf/zxzx/tzgg/list.html
CMS:  UCAP
åˆ—è¡¨: listé¡µé�¢å†…åµŒ listData.articleList (15æ�¡)
è¯¦æƒ…: div.article-content.downmainbox#zoomcon, meta PubDate/ArticleTitle

ç”¨æ³•:
  python3 crawl_thx_tzgg.py
  python3 crawl_thx_tzgg.py --dry-run
  æ³¨: è¯¥ç«™ç‚¹åˆ—è¡¨ç”±JSåŠ¨æ€�åŠ è½½ï¼ŒAPIä¸�æ”¯æŒ�åˆ†é¡µï¼Œé¦–æ¬¡ä»…çˆ¬é¦–é¡µ15æ�¡
é    N)Údatetime)ÚBeautifulSoupzhttps://www.ahtlyaq.gov.cnz/yaqrmzf/zxzx/tzgg/list.htmlé   z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó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_thx_tzgg.pyÚlogr       s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                 óŽ   — | sy| j                  dd«      j                  dd«      j                  dd«      } | j                  d«      S )	NÚ z&middot;õ   Â·z&nbsp;ú z&amp;ú&u   Â·. 	
)ÚreplaceÚstrip)Útitles    r   Úclean_titler   %   sB   € ÙØØ�M‰M˜* dÓ+×3Ñ3°H¸cÓB×JÑJÈ7ÐTWÓX€EØ�;‰;�|Ó$Ð$r   c                 ó’   — 	 t        j                  | t        |d¬«      }|j                  dk(  rd|_        |j
                  S y #  Y y xY w)NF)ÚheadersÚtimeoutÚverifyéÈ   zutf-8)ÚrequestsÚgetÚHEADERSÚstatus_codeÚencodingÚtext)Úurlr   Úrs      r   Ú
fetch_pager(   ,   sD   € ðÜ�L‰L˜¤g°wÀuÔMˆØ�=‰=˜CÒØ ˆAŒJØ—6‘6ˆMØøðÙús   ‚>A ÁAc                 óä  — g }t        j                  d| t         j                  «      }|st        d«       |S 	 t	        j
                  |j                  d«      «      }|D ]â  }|j                  dd«      j                  «       }|j                  dd«      j                  «       }|j                  dd«      }d}|rJt        |t        «      r	 t	        j
                  |«      }t        |t        «      r|j                  dd«      nd}|sŒ¦|sŒ©|j                  d	«      r	t        |z   n|}|j                  t        |«      ||d
œ«       Œä 	 |S #  Y ŒìxY w# t         $ r}	t        d|	› �«       Y d}	~	|S d}	~	ww xY w)u8   ä»Žlisté¡µé�¢å†…åµŒçš„ listData.articleList æ��å�–æ�¡ç›®z4var listData\s*=\s*{\s*articleList:\s*(\[.*?\])\s*};u$     âš  æœªæ‰¾åˆ° listData.articleListr   r   r   ÚpubDateÚurlsÚpcú/)r   r&   Údateu     âš  è§£æž� listData å¤±è´¥: N)ÚreÚsearchÚDOTALLr   ÚjsonÚloadsÚgroupr!   r   Ú
isinstanceÚstrÚdictÚ
startswithÚBASE_URLÚappendr   Ú	Exception)
ÚhtmlÚitemsÚmÚarticlesÚartr   Úpub_dateÚur&   Úes
             r   Úextract_list_itemsrD   7   sM  € à€EÜ
�	‰	ÐIÈ4ÔQS×QZÑQZÓ[€AÙÜÐ2Ô3Øˆð2Ü—:‘:˜aŸg™g a›jÓ)ˆØò 	ZˆCØ—G‘G˜G RÓ(×.Ñ.Ó0ˆEØ—w‘w˜y¨"Ó-×3Ñ3Ó5ˆHØ—‘˜ Ó#ˆAØˆCÙÜ˜a¤Ô%ð!Ü ŸJ™J q›M˜ô *4°A´tÔ)<�a—e‘e˜D "”oÀ"�ÚšØ(+¯©°sÔ(;”h ’nÀ�Ø—‘¤{°5Ó'9À#ÈxÑXÕYñ	Zð" €Løð!Ù ûô
 ò 2ÜÐ,¨Q¨CÐ0×1Ð1Ø€Lûð2ús<   ¸BE ÃEÃ&E ÄE Ä<E ÅE
ÅE Å	E/ÅE*Å*E/c                 óú  — t        | d¬«      }|syt        |d«      }d}|j                  dddi¬	«      }|r$|j                  d
«      r|d
   j	                  «       }|s%|j                  d«      }|r|j                  d¬«      }t        |«      }d}|j                  dddi¬	«      }|r$|j                  d
«      r|d
   j	                  «       }t        j                  dt        |«      «      }|rU|j                  d«      › d|j                  d«      j                  d«      › d|j                  d«      j                  d«      › �}|j                  ddd¬«      }	|	s|j                  dd„ ¬«      }	|	rt        |	«      nd}
|||
fS )Né   ©r   )r   r   r   úhtml.parserr   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚh1T©r   ÚPubDatez!(\d{4})[-/](\d{1,2})[-/](\d{1,2})r   ú-é   é   Údivúarticle-contentÚzoomcon)Úclass_Úidc                 ó$   — | xr dt        | «      v S )NrU   )r6   )Úcs    r   ú<lambda>zfetch_detail.<locals>.<lambda>n   s   € ¸Ò8YÐ>OÔSVÐWXÓSYÐ>Y€ r   )rW   )r(   r   Úfindr!   r   Úget_textr   r/   r0   r6   r4   Úzfill)r&   r<   Úsoupr   Úmeta_trN   Ú	date_textÚmeta_dÚdmÚcontent_divÚcontent_htmls              r   Úfetch_detailrf   T   sk  € Ü�c 2Ô&€DÙØÜ˜˜}Ó-€Dà€EØ�Y‰Y�v f¨nÐ%=ˆYÓ>€FÙ�&—*‘*˜YÔ'Ø�yÑ!×'Ñ'Ó)ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÜ˜Ó€Eà€IØ�Y‰Y�v f¨iÐ%8ˆYÓ9€FÙ�&—*‘*˜YÔ'Ø˜9Ñ%×+Ñ+Ó-ˆ	Ü	�‰Ð7¼¸Y»Ó	H€BÙ	Ø—x‘x “{�m 1 R§X¡X¨a£[×%6Ñ%6°qÓ%9Ð$:¸!¸B¿H¹HÀQ»K×<MÑ<MÈaÓ<PÐ;QÐRˆ	à—)‘)˜EÐ*;À	�)ÓJ€KÙØ—i‘i Ñ.Y�iÓZˆÙ'2”3�{Ô#¸€LØ�)˜\Ð)Ð)r   c                 ó0  ‡‡— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  d«       Œ |j                  dg«      D ]  }|j                  «        Œ d}|rŽd	}t	        |j                  d
dg«      «      D ]j  }|j
                  D �cg c]*  }|j                  €t        |«      j                  «       sŒ)|‘Œ, }}|sŒEt        d„ |D «       «      sŒX|j                  «        d} n |rŒŽˆfd„Š ‰|«      }t        |«      dk  �rg }g }	|j                  d«      D ]¼  }
|
j                  dd«      j                  «       }|sŒ&|j                  d«      rŒ8|j                  d«      r
t        |z   }n,|j                  d«      st        dz   |j                  d«      z   }|
j                  dd«      j                  «       }|	j!                  |rd|› d|› �nd|› �«       Œ¾ |	r"|j!                  d«       |j#                  |	«       g }|j                  d«      D ]½  }|j                  dd«      j                  «       Št%        ˆfd„dD «       «      sŒ8|j'                  d¬«      xs ‰j)                  d«      d   }‰j                  d«      r
t        ‰z   Šn,‰j                  d«      st        dz   ‰j                  d«      z   Š|j!                  d|› d‰› �«       Œ¿ |r"|j!                  d «       |j#                  |«       |r|d!z   dj+                  |«      z   }t-        j.                  d"d!|«      }t-        j.                  d#d|«      }t-        j.                  d$d|«      }|j                  «       S c c}w )%Nr   rH   ÚstyleÚscriptÚbrú
zo:pTFrT   Úpc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)rl   N)rJ   )Ú.0rZ   s     r   ú	<genexpr>zclean_html.<locals>.<genexpr>‚   s   è ø€ Ò8¨a˜AŸF™F c�MÑ8ùs   ‚c                 óT  •— g }| j                   D ]ÿ  }|j                  €.t        |«      j                  «       }|sŒ+|j	                  |«       Œ=|j                  dk(  r|j	                  t        |«      «       Œg|j                  dv r+ ‰|«      }|j                  «       sŒŽ|j	                  |«       Œ |j                  dv r+ ‰|«      }|j                  «       sŒÇ|j	                  |«       ŒÙ|j                  d¬«      }|sŒî|j	                  |«       �Œ dj                  d„ |D «       «      S )NÚtable)rl   rT   ÚtdÚthÚliÚsectionrN   Úh2Úh3Úh4Úh5Úh6)ÚspanÚfontÚbÚiÚstrongÚemÚarB   ÚsubÚsupÚsmallÚlabelTrO   ú

c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©NrO   )rn   rl   s     r   ro   z.clean_html.<locals>.extract.<locals>.<genexpr>ž   s   è ø€ Ò9 ¨q¯w©w­yœ1Ñ9ùs   ‚˜)ÚchildrenrJ   r6   r   r:   r]   Újoin)ÚelementÚpartsÚchildr%   ÚinnerÚextracts        €r   r�   zclean_html.<locals>.extract‡   sü   ø€ ØˆØ×%Ñ%ò 	'ˆEØ�z‰zÐ!Ü˜5“z×'Ñ'Ó)�ÚØ—L‘L Õ&Ø—‘˜wÒ&Ø—‘œS ›ZÕ(Ø—‘ð  Dñ Dá ›�Ø—;‘;•=Ø—L‘L Õ'Ø—‘ð  Eñ Eá ›�Ø—;‘;•=Ø—L‘L Õ'à—~‘~¨D�~Ó1�ÚØ—L‘L Ö&ð)	'ð* �{‰{Ñ9 eÔ9Ó9Ð9r   iô  ÚimgÚsrczdata:r-   ÚhttpÚaltu	   [å›¾ç‰‡: r   u	   [å›¾ç‰‡] u   [é¡µé�¢å›¾ç‰‡]r�   Úhrefc              3   ó\   •K  — | ]#  }‰j                  «       j                  |«      –— Œ% y ­wrˆ   )ÚlowerÚendswith)rn   Úextr”   s     €r   ro   zclean_html.<locals>.<genexpr>³   s"   øè ø€ Òt°#�4—:‘:“<×(Ñ(¨×-Ñtùs   ƒ),)z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarrO   éÿÿÿÿu	   [é™„ä»¶: u   [é¡µé�¢é™„ä»¶]r†   z\n{3,}z\s+\nz\n\s+)r   Úfind_allÚ	decomposeÚreplace_withÚlistr‰   rJ   r6   r   ÚallÚunwrapÚlenr!   r8   r9   Úlstripr:   ÚextendÚanyr]   ÚsplitrŠ   r/   r‚   )re   r_   Útagrj   ÚchangedrZ   ÚkidsÚresultÚextraÚimgsr�   r‘   r“   Úattsr�   r%   r�   r”   s                   @@r   Ú
clean_htmlr¬   s   s3  ù€ ÙØÜ˜ }Ó5€DØ�}‰}˜g xÐ0Ó1ò ˆØ�‰�ðà�m‰m˜DÓ!ò ˆØ
�‰˜Õðà�}‰}˜e˜WÓ%ò ˆØ�‰�ðà€GÙ
ØˆÜ˜Ÿ™ u¨c lÓ3Ó4ò 	ˆCØ"Ÿ|™|Ö[˜!°A·F±F°NÌ3ÈqË6Ï<É<Í>’AÐ[ˆDÐ[ÚœÑ8°4Ô8Õ8Ø—
‘
”Ø�Ùð	ò ô:ñ2 �T‹]€FÜ
ˆ6ƒ{�SÓØˆØˆØ—=‘= Ó'ò 	TˆCØ—'‘'˜% Ó$×*Ñ*Ó,ˆCÚ˜3Ÿ>™>¨'Õ2Ø—>‘> #Ô&Ü" S™.‘CØŸ™¨Ô/Ü" S™.¨3¯:©:°c«?Ñ:�CØ—g‘g˜e RÓ(×.Ñ.Ó0�Ø—‘¹˜i¨ u¨B¨s¨eÑ4À9ÈSÈEÐARÕSð	Tñ Ø�L‰LÐ)Ô*Ø�L‰L˜ÔØˆØ—‘˜sÓ#ò 	8ˆAØ—5‘5˜ Ó$×*Ñ*Ó,ˆDÜÓtÐ9sÔtÕtØ—z‘z¨�zÓ-ÒD°·±¸C³ÀÑ1D�Ø—?‘? 3Ô'Ü# d™?‘DØŸ™¨Ô0Ü# c™>¨D¯K©K¸Ó,<Ñ<�DØ—‘˜i¨ v¨R°¨vÐ6Õ7ð	8ñ Ø�L‰LÐ)Ô*Ø�L‰L˜ÔÙØ˜f‘_ t§y¡y°Ó'7Ñ7ˆFÜ�V‰V�I˜v vÓ.€FÜ�V‰V�H˜d FÓ+€FÜ�V‰V�H˜d FÓ+€FØ�<‰<‹>ÐùòC \s   Â;*NÃ&Nc                 ó¢  — | st        d«       y d}d}| D ]Ú  }|j                  dd«      }|j                  dd«      }|j                  dd«      }	|j                  dd«      }
|r|	sŒPd	„ }d
 ||«      › d ||	«      › d ||	«      › d ||«      › d ||«      › d ||«      › d ||
«      › d ||«      › d ||«      › d�}	 t        j                  d|d|› �gddd¬«      }|j                  dk(  r|dz  }ŒÜ t        d|› dt        | «      › d�«       t        d«       d |«      › d�}	 t        j                  d||gddd¬«       y #  Y �Œ2xY w#  Y y xY w)Nu   æ— æ•°æ�®å�¯å…¥åº“z/mnt/data/search.dbr   r   r   r.   r&   rM   c                 ó.   — | r| j                  dd«      S dS )Nú'z''r   )r   )Úss    r   r[   z"push_to_searchdb.<locals>.<lambda>Ó   s   € ±˜Ÿ	™	 # tÓ,€ °r€ r   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; Té   )Úcapture_outputr%   r   r   u   å…¥åº“å®Œæˆ�: r-   õ    æ�¡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);)r   r!   Ú
subprocessÚrunÚ
returncoder    )r=   Úsource_nameÚ
group_nameÚindustryÚdb_pathÚinsertedÚitemr   r.   r&   rM   ÚescÚsqlr'   Úfts_sqls                  r   Úpush_to_searchdbrÁ   Å   s±  € áÜÐ Ô!ØØ#€GØ€HØò ˆØ—‘˜ "Ó%ˆØ�x‰x˜ Ó#ˆØ�h‰h�u˜bÓ!ˆØ—(‘(˜9 bÓ)ˆÙ™CØÙ9ˆðñ �KÓ Ð! ¡c¨#£h Z¨t±C¸³H°:ð >Ù�E“
ˆ|˜4¡ D£	˜{¨$©s°5«z¨lð ;Ù�G“ˆ~˜T¡# j£/Ð!2°$±s¸8³}°oð Fðð 	ð	Ü—‘Ø˜GÐ'BÀ3À%Ð%HÐIØ#¨$¸ôˆAð �|‰|˜qÒ Ø˜A‘�øð/ô4 ˆ.˜˜
 !¤C¨£J <¨tÐ4Ô5ÜˆÔð	ñ " +Ó.Ð/ð 0Jð	Jð ðÜ�‰˜	 7¨GÐ4ÀTÐPTÐ^`Öaøð	ÚûðÙús   Â=3EÄ%E
 ÅEÅ
Ec                  ó  — dd l } | j                  d¬«      }|j                  ddd¬«       |j                  «       }t	        d|j
                  › �«       t	        d	«       t        t        d
¬«      }|st	        d«       y t        |«      }t	        dt        |«      › d�«       |j
                  rY|d d D ]-  }t        d|d   › d|d   d d › �«       t        d|d   › �«       Œ/ t        dt        |«      › d�«       t	        d«       y t        |«      D ]†  \  }}t	        d|dz   › dt        |«      › d|d   d d › d�«       t        |d   «      \  }}}	t        |xs |d   «      |d<   |xs |d   |d<   |	rt        |	«      nd|d<   t        j                   d«       Œˆ t	        d t        |«      › d!�«       |D �
cg c]  }
|
j#                  d«      sŒ|
‘Œ }}
t	        d"t        |«      › d#t        |«      t        |«      z
  › 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 c c}
w )(Nr   u   ä¹‰å®‰åŒº-é€šçŸ¥å…¬å‘Šçˆ¬è™«)Údescriptionz	--dry-runÚ
store_trueu	   ä»…é¢„è§ˆ)ÚactionÚhelpu%   ðŸš€ çˆ¬è™«å�¯åŠ¨: thx_tzgg, dry_run=u   èŽ·å�–åˆ—è¡¨...é   rG   u   â�Œ åˆ—è¡¨é¡µèŽ·å�–å¤±è´¥u
   åˆ—è¡¨å…± r´   é   z  [r.   r   r   é2   z  URL: r&   u
     ... å…± u   âœ… é¢„è§ˆå®Œæˆ�r   r-   é(   z...r   rM   g333333Ó?u   
=== çˆ¬å�–å®Œæˆ�: u    æ�¡ ===u   å�«æ­£æ–‡: u    æ�¡ / ç©ºæ­£æ–‡: rS   u
     æ­£æ–‡: z charsu   âœ… å…¨éƒ¨å®Œæˆ�)ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr   Údry_runr(   ÚLIST_URLrD   r    r   Ú	enumeraterf   r   r¬   ÚtimeÚsleepr!   rÁ   )rË   ÚparserÚargsr<   Ú	all_itemsr½   r~   ÚdtÚddÚdcÚitÚvalids               r   ÚmainrÜ   õ   s   € ÛØ×$Ñ$Ð1OÐ$ÓP€FØ
×Ñ˜¨L¸{ÐÔKØ×ÑÓ€DÜÐ
/°·±¨~Ð>Ô?äÐÔÜ”h¨Ô+€DÙÜÐ'Ô(ØÜ" 4Ó(€IÜˆ*”S˜“^Ð$ DÐ)Ô*à‡|‚|Ø˜b˜q�Mò 	+ˆDÜ�C˜˜V™�~ R¨¨W©°c°rÐ(:Ð';Ð<Ô=Ü�G˜D ™K˜=Ð)Õ*ð	+ô 	�
œ3˜y›>Ð*¨$Ð/Ô0ÜÐÔØä˜YÓ'ò ‰ˆˆ4Üˆc�!�A‘#��aœ˜I›Ð' r¨$¨w©-¸¸Ð*<Ð)=¸SÐAÔBÜ! $ u¡+Ó.‰
ˆˆB�Ü# BÒ$7¨$¨w©-Ó8ˆˆW‰ØÒ)˜T &™\ˆˆV‰Ù,.œ* Rœ.°BˆˆY‰Ü�
‰
�3�ðô Ð
œs 9›~Ð.¨hÐ7Ô8Ø#Ö9�B r§v¡v¨iÕ'8ŠRÐ9€EÐ9Üˆ+”c˜%“j�\Ð!3´C¸	³NÄSÈÃZÑ4OÐ3PÐPTÐUÔVØ�b�q�	ò ˆÜ��D˜‘L�>  D¨¡M°#°2Ð$6Ð#7Ð8Ô9Ü�˜˜U™�}Ð%Ô&Ü�
œ3˜tŸx™x¨	°2Ó6Ó7Ð8¸Ð?Ô@Ü�ð	ñ Ü˜Ô#ÜÐÕùò :s   Æ5JÇJÚ__main__)rF   )Úthx_tzggu	   å®‰å¾½çœ�u   æ”¿åºœå…¬å‘Š)Ú__doc__ÚsysÚosr/   r2   r    rÒ   rµ   r   Úbs4r   r9   rÐ   ÚDEFAULT_PAGESr"   ÚpackagesÚurllib3Údisable_warningsr   r   r(   rD   rf   r¬   rÁ   rÜ   Ú__name__© r   r   ú<module>ré      s©   ðñ÷ 5× 4× 4Ó 4Ý Ý à'€ØÐ4Ñ4€Ø€ð ð Gð€ð
 	× Ñ × Ñ × *Ñ *Ô ,ò'ò
%óòò:*ò>Oðd @KØ,ó-ò`*ðZ ˆzÒÙ…Fð r   