Ë
    H«£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ZddlZddl	m	Z	 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ ddlZ ej&                  dej(                  j*                  j,                  j.                  ¬«       dZdZd	d
iZdZd„ Zd„ Zdd„Zd„ Zd„ Z e!dk(  rc ejD                  d¬«      Z#e#jI                  de%dd¬«       e#jM                  «       Z' e(de'jR                  › d�«        e e'«      Z* e(de*› d�«       yy)uN   crawl_ynfn_sthj.py - å¯Œå®�åŽ¿-ç”Ÿæ€�çŽ¯å¢ƒï¼ˆæ•°èž�UCAP CMS /queryList APIï¼‰é    N)Údatetime)Úpush_to_searchdbÚignore)Úcategoryu   å¯Œå®�åŽ¿-ç”Ÿæ€�çŽ¯å¢ƒz!https://www.ynfn.gov.cn/queryListzContent-Typezapplication/jsoné   c                 ó¤   — dgdg| t         dœ}t        j                  t        |t        dd¬«      }|j                  «       }|j                  di «      S )z Fetch a single page from the APIÚ	ynfnxsthjÚfnxrmzf)ÚchannelCodeÚwebSiteCodeÚcurrentÚpageSizeé   F)ÚjsonÚheadersÚtimeoutÚverifyÚdata)Ú	PAGE_SIZEÚrequestsÚpostÚAPI_URLÚAPI_HEADERSr   Úget)Úpage_numÚpayloadÚrr   s       úcrawl_ynfn_sthj.pyÚ
fetch_pager      sP   € ð $�}Ø!�{ØÜñ	€Gô 	�‰”g G´[È"ÐUZÔ[€AØ�6‰6‹8€DØ�8‰8�F˜BÓÐó    c                 óŽ  — | syddl m}  || d«      }g }t        «       }|j                  g d¢«      D �]   }|j	                  dd«      xs d}d|j                  dd«      v rŒ/|j                  d	k(  ró|j                  d
«      s|j                  d
«      rŒag }|j                  d«      D ]  }|j                  d«       Œ |j                  D ],  }	|	j                  «       }	|	sŒ|	dk7  sŒ|j                  |	«       Œ. |sŒÈdj                  |«      }
t        j                  dd|
«      }
t        j                  dd|
«      }
t        j                  dd|
«      }
|j                  |
«       �Œ1|j                  d
k(  rGt!        |«      dd }||v r�ŒT|j#                  |«       t%        |«      }|s�Œt|j                  |«       �Œ‡|j                  dk(  s�Œ˜|j	                  dd«      }|j	                  dd«      }|s�ŒÀ|j'                  d«      r�ŒÓ|j'                  d«      sd|z   }|j                  d|› d|› d�«       �Œ dj                  |«      S )zAConvert HTML to clean plain text with proper paragraph separationÚ r   ©ÚBeautifulSoupúhtml.parser)ÚpÚtableÚimgÚstylezdisplay:noneú r&   r'   Úbrú
õ   Â z[ \t]+(?=[\u4e00-\u9fff])z(?<=[\u4e00-\u9fff])[ \t]+z\u00a0NéÈ   r(   ÚsrcÚaltúdata:Úhttpúhttps://www.ynfn.gov.cnz![z](ú)z

)Úbs4r$   ÚsetÚfind_allr   ÚreplaceÚnameÚfind_parentÚfindÚreplace_withÚstripped_stringsÚstripÚappendÚjoinÚreÚsubÚstrÚaddÚhtml_table_to_htmlÚ
startswith)Ú	html_textr$   ÚsoupÚpartsÚseen_tablesÚelemr)   Útextsr+   ÚsÚtextÚ	table_keyÚmd_tabler/   r0   s                  r   Úclean_html_contentrQ      s  € áØÝ!Ù˜ MÓ2€DØ€EÜ“%€KØ—‘Ò3Ó4ó "1ˆØ—‘˜ "Ó%Ò+¨ˆØ˜UŸ]™]¨3°Ó3Ñ3ØØ�9‰9˜ÒØ×Ñ Ô(¨D¯I©I°gÔ,>ØØˆEØ—m‘m DÓ)ò &�Ø—‘ Õ%ð&à×*Ñ*ò $�Ø—G‘G“I�Ú˜˜f›Ø—L‘L •Oð$ò Ø—y‘y Ó'�Ü—v‘vÐ:¸BÀÓE�Ü—v‘vÐ;¸RÀÓF�Ü—v‘v˜i¨¨dÓ3�Ø—‘˜TÖ"Ø�Y‰Y˜'Ò!Ü˜D›	 $ 3˜ˆIØ˜KÑ'ÙØ�O‰O˜IÔ&Ü)¨$Ó/ˆHÛØ—‘˜XÖ&Ø�Y‰Y˜%ÔØ—(‘(˜5 "Ó%ˆCØ—(‘(˜5 "Ó%ˆCÛ˜3Ÿ>™>¨'Ö2Ø—~‘~ fÔ-Ø3°cÑ9�CØ—‘˜r #  b¨¨¨QÐ/Ö0ðE"1ðF �;‰;�uÓÐr    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r#   r%   ÚaÚhrefr"   )r2   Ú
javascriptú#r(   r/   )r2   z//r1   )	r5   r$   rC   r7   r   rF   ÚurllibÚparseÚurljoin)r'   Úbase_urlr$   ÚtblrS   rT   r(   r/   s           r   rE   rE   J   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or    c                 ó°   — dd l }	 |j                  dd¬«      }|j                  d| f«      }|j                  «       d   }|j	                  «        |S #  Y yxY w)Nr   z/root/search.dbé
   )r   z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?éÿÿÿÿ)Úsqlite3ÚconnectÚexecuteÚfetchoneÚclose)Ú	site_namer_   ÚdbÚcurÚcnts        r   Úget_db_countrh   Y   sX   € ÛðØ�_‰_Ð.¸ˆ_Ó;ˆØ�j‰jÐIÈIÈ<ÓXˆØ�l‰l‹n˜QÑˆØ
�‰Œ
Øˆ
øðÙús   †A
A ÁAc                 óX  — | j                   }g }t        d|dz   «      D �]l  }t        d|› d�«       	 t        |«      }|j                  dd«      }|j                  dg «      }|st        d	|› d
�«        �nt        d|› dt        |«      › d|› d
�«       |D �]Ö  }|j                  di «      }	|	j                  dd«      j                  «       }
|
sŒ9|	j                  dd«      d d }|s#t        j                  «       j                  d«      }|	j                  dd«      }d}	 t        |t        «      rt        j                  |«      n|}d|j                  dd«      z   }|	j                  di «      j                  dd«      }t        |«      }g }|	j                  dd«      }	 t        |t        «      rt        j                  |«      n|}|D ]c  }|j                  dd«      }|j                  dd«      }|j                  dd«      }|sŒ<|sŒ?||z   }|j!                  ||dœ«       |d|› d|› d �z  }Œe 	 |j!                  |
|||t"        ||r|d d! n|
d d" |rt        j$                  |d#¬$«      ndd%œ«       �ŒÙ ||k  s�ŒXt'        j(                  d&«       �Œo t        d't        |«      › d(�«       |rBt+        t"        «      }t-        |d)«       t+        t"        «      }t        d*|› d+|› d,||z
  › d
�«       t        |«      S # t        $ r}t        d|› d|› �«       Y d }~ Œ‡d }~ww xY w#  Y �ŒÉxY w#  Y ŒþxY w)-Né   z  Fetching page z...z  API error page z: Útotalr   Úresultsz  No more results (total=r4   z  Page z items (total=ÚsourceÚtitler"   ÚpubDater]   z%Y-%m-%dÚurlsz{}r3   ÚpcÚcontentÚarticleFilesz[]ÚfileNameÚfilePathÚ
domainName)r9   Úurlu   

é™„ä»¶ï¼š<p><a href="z">z</a></p>iô  r.   F)Úensure_ascii)rn   rw   Ú
source_urlÚpub_daterd   rr   ÚsummaryÚattachmentsg333333Ó?z

  Total: z itemsÚ	ynfn_sthjz  DB: u    â†’ z (+)ÚpagesÚrangeÚprintr   Ú	Exceptionr   Úlenr>   r   ÚnowÚstrftimeÚ
isinstancerC   r   ÚloadsrQ   r?   Ú	SITE_NAMEÚdumpsÚtimeÚsleeprh   r   )ÚargsÚ	max_pagesÚall_recordsÚpnr   Úerk   rl   Úitemr/   rn   rz   Úurls_strÚ
detail_urlÚurls_objÚcontent_htmlrr   r|   Úarticle_filesÚfilesÚfÚfnameÚfpathÚdomainÚfurlÚcount_beforeÚcount_afters                              r   Úrunrž   d   sB  € Ø—
‘
€IØ€Kä�A�y 1‘}Ó%ó ?ˆÜÐ    CÐ(Ô)ð	Ü˜b“>ˆDð
 —‘˜ !Ó$ˆØ—(‘(˜9 bÓ)ˆÙÜÐ-¨e¨W°AÐ6Ô7Úä�˜�t˜2œc '›l˜^¨>¸%¸ÀÐBÔCàó ,	ˆDØ—(‘(˜8 RÓ(ˆCØ—G‘G˜G RÓ(×.Ñ.Ó0ˆEÙØØ—w‘w˜y¨"Ó-¨c¨rÐ2ˆHÙÜ#Ÿ<™<›>×2Ñ2°:Ó>�à—w‘w˜v tÓ,ˆHØˆJðÜ3=¸hÌÔ3Lœ4Ÿ:™: hÔ/ÐRZ�Ø6¸¿¹ÀdÈBÓ9OÑO�
ð Ÿ7™7 9¨bÓ1×5Ñ5°iÀÓDˆLÜ(¨Ó6ˆGàˆKØŸG™G N°DÓ9ˆMðÜ5?ÀÌsÔ5SœŸ
™
 =Ô1ÐYf�Øò W�AØŸE™E *¨bÓ1�EØŸE™E *¨bÓ1�EØŸU™U <Ð1JÓK�FÚ¢Ø%¨™~˜Ø#×*Ñ*°EÀ$Ñ+GÔHØÐ%>¸t¸fÀBÀuÀgÈXÐ#VÑV™ñWð ×ÑØØ!Ø(Ø$Ü&Ø"Ù,3˜7 4 C™=¸¸tÀ¸ÙNYœtŸz™z¨+ÀEÕJÐ_añ	 ö 	ðG,	ð\ �	Œ>Ü�J‰J�sŽOð?ôB 
ˆKœ˜KÓ(Ð)¨Ð
0Ô1áÜ#¤IÓ.ˆÜ˜ kÔ2Ü"¤9Ó-ˆÜ��|�n E¨+¨°c¸+ÈÑ:TÐ9UÐUVÐWÔXäˆ{ÓÐøôK ò 	ÜÐ% b T¨¨A¨3Ð/Ô0Ýûð	ûð4Úûð"Ùús<   ²K5Ä<LÆA$L%È L%È'L%Ë5	LË>LÌLÌL"Ì%L)Ú__main__u   å¯Œå®�åŽ¿-ç”Ÿæ€�çŽ¯å¢ƒçˆ¬è™«)Údescriptionz--pagesé   zpages to crawl)ÚtypeÚdefaultÚhelpu!   å¯Œå®�åŽ¿-ç”Ÿæ€�çŽ¯å¢ƒ: crawling z pageszDone: z records)r"   )+Ú__doc__ÚsysÚosr   rA   r‰   r   ÚwarningsÚargparser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   Úurllib.parserW   ÚfilterwarningsÚpackagesÚurllib3Ú
exceptionsÚInsecureRequestWarningr‡   r   r   r   r   rQ   rE   rh   rž   Ú__name__ÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsr‹   r€   r~   rg   © r    r   ú<module>r½      s!  ðá Tß <× <× <× <Ý à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (Û à €× Ñ ˜¨8×+<Ñ+<×+DÑ+D×+OÑ+O×+fÑ+fÕ gà$€	Ø
-€ØÐ1Ð2€Ø€	ò
 ò+óZò	òMð^ ˆzÒØ$ˆX×$Ñ$Ð1OÔP€FØ
×Ñ˜	¨°QÐ=MÐÔNØ×ÑÓ€DÙ	Ð-¨d¯j©j¨\¸Ð
@ÔAÙ
ˆd‹)€CÙ	ˆF�3�%�xÐ
 Õ!ð r    