Ë
    V_Š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	m	Z	m
Z
 ddlZddlmZ ddlmZ dZedz   ZdZd	Zd
ZdZdZ ej.                  dd«      ZddiZ ej4                  «       Zej8                  j;                  e«       d„ Zd„ Zdd„Z d„ Z!d„ Z"d„ Z#d„ Z$dd„Z%e&dk(  r/ e'ejP                  «      dkD  rejP                  d   ndZ) e%e)«       yy)u÷   
æ±‰æº�åŽ¿äººæ°‘æ”¿åºœ - çŽ¯å¢ƒä¿�æŠ¤
URL: http://www.hanyuan.gov.cn/gongkai/kuozhan/306.html
CMS: è‡ªå®šä¹‰æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° (.NET, LayUI)
List: ?page=N åˆ†é¡µ (20æ�¡/é¡µ, å…±30é¡µ)
Detail: div.msg-content (è¡¨æ ¼HTMLä¿�ç•™, æ®µè�½æ–‡æœ¬)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.hanyuan.gov.cnz/gongkai/kuozhan/306.htmlu   æ±‰æº�åŽ¿äººæ°‘æ”¿åºœu   çŽ¯å¢ƒä¿�æŠ¤u   å››å·�é   é   Ú	SEARCH_DBz/root/search.dbz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 ó<   — t        | t        j                  d¬«       y )NT)ÚfileÚflush)ÚprintÚsysÚstderr)Úmsgs    ú"/root/gov_crawler/crawl_hanyuan.pyÚlogr       s   € Ü	ˆ#”C—J‘J dÖ+ó    c                 ó*  — | syt        j                  | «      } t        j                  dd| t        j                  ¬«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd	| «      } | j                  «       S )
z1Convert HTML to clean plain text for FTS summary.Ú zH</?(?:p|div|h[1-6]|li|tr|blockquote|section|article|table|br\s*/?)[^>]*>ú
)Úflagsz<[^>]+>z[ \t]+ú z\n{3,}ú

)Úhtml_modÚunescapeÚreÚsubÚ
IGNORECASEÚstrip)Útexts    r   Ú
strip_htmlr!   $   sx   € áØÜ×Ñ˜TÓ"€DÜ�6‰6Ð]Ð_cÐeiÔqs×q~Ñq~Ô€DÜ�6‰6�*˜b $Ó'€DÜ�6‰6�)˜S $Ó'€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðr   c                 óÂ   — 	 t         j                  | |¬«      }d|_        |j                  dk(  r|j                  S dS # t
        $ r}t        d|› �«       Y d}~yd}~ww xY w)u   è¯·æ±‚æ”¿åºœç«™©Útimeoutzutf-8éÈ   Nz  [ERR] fetch failed: )ÚsessionÚgetÚencodingÚstatus_coder    Ú	Exceptionr   )Úurlr$   ÚrÚes       r   Úfetchr.   0   s]   € ðÜ�K‰K˜ WˆKÓ-ˆØˆŒ
ØŸ™¨#Ò-ˆq�v‰vÐ7°4Ð7øÜò ÜÐ$ Q CÐ(Ô)Üûðús   ‚8= »= ½	AÁAÁAc                 ó®  — g }t        | d«      }|j                  dd¬«      }|s|S |j                  dd¬«      D ]™  }|j                  d«      }|j                  d	«      }|sŒ(|sŒ+|j                  d
d«      j	                  «       }|j                  d¬«      }|j                  d¬«      }	|sŒr|sŒut        t        |«      }
|j                  |
||	dœ«       Œ› |S )u   ä»Žåˆ—è¡¨é¡µæ��å�–æ�¡ç›®úhtml.parserÚulzcontent-list©Úclass_ÚliF©Ú	recursiveÚaÚspanÚhrefr   T©r   )r+   ÚtitleÚdate)	r   ÚfindÚfind_allr'   r   Úget_textr   ÚBASEÚappend)ÚhtmlÚitemsÚsoupr1   r4   r7   r8   r9   r;   Údate_strÚfull_urls              r   Úget_list_itemsrG   ;   sÎ   € à€EÜ˜˜}Ó-€DØ	�‰�4 ˆÓ	/€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò 	RˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÚ’Ø—5‘5˜ Ó$×*Ñ*Ó,ˆDØ—J‘J T�JÓ*ˆEØ—}‘}¨4�}Ó0ˆHÚšÜ"¤4¨Ó.�Ø—‘ X¸ÀxÑPÕQð	Rð €Lr   c                 óÊ  ‡— t        | «      }|sdg |fS t        |d«      }|j                  dddi¬«      }|r%|j                  d«      r|d   j	                  «       }n'|j                  d«      }|r|j                  d	¬
«      n|}d}|j                  dddi¬«      }|r'|j                  d«      r|d   j	                  «       dd }|s)t        j                  d|«      }	|	r|	j                  d«      }g }
|j                  dt        j                  dt        j                  «      ¬«      D ]Y  }|j                  dd«      j	                  «       }|sŒ&|j                  d	¬
«      xs d}|
j                  |t        | |«      dœ«       Œ[ |j                  dd¬«      }|sdD ]  }|j                  d|¬«      }|sŒ n |sd|
|fS |j                  g d¢«      D ]  }|j                  «        Œ d(ˆfd„	Šg }|j                  D ]r  }|j                   €Œ|j                   j#                  «       }|dk(  rŒ0|dk(  r%|j                  dg «      }t%        d„ |D «       «      rŒZ ‰|«      }|j'                  |«       Œt dj)                  |«      j	                  «       }t+        |«      dk  r%|
r#d | › d!|› d"�}|
D ]  }|d#|d   › d$|d%   › d&�z  }Œ n"|r |
r|d'z  }|
D ]  }|d#|d   › d$|d%   › d&�z  }Œ ||
|fS ))u   æ��å�–è¯¦æƒ…é¡µNr0   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚh1Tr:   r   ÚPubDateé
   u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})é   r7   z"\.(doc|docx|pdf|xls|xlsx|zip|rar)$)r9   r9   u   é™„ä»¶)rJ   r+   Údivzmsg-contentr2   )znews-contentzarticle-contentrM   Únrzmain-content)ÚscriptÚstylerI   c                 óº  •— |dkD  rg S g }| j                   D �]À  }|j                  €Œ|j                  j                  «       }|dk(  rXt        t	        |«      d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  t	        |«      «       Œˆ|dk(  rœ|j                  dd¬	«      }|sŒ£|j                  d«      }|r`|D ]Y  }	t        t	        |	«      d«      }
|
j                  ddg«      D ]  }|j                  «        Œ |j                  t	        |
«      «       Œ[ �Œ|j                  |«       �Œ)|d
v r*|j                  dd¬	«      }|s�ŒD|j                  |«       �ŒW|dk(  r ‰||dz   «      }|j                  |«       �Œ{|dk(  s�Œ‚|j                  dd¬«      D ])  }|j                  dd¬	«      }|sŒ|j                  |«       Œ+ �ŒÃ |S )u:   é€’å½’æ��å�–å…ƒç´ å†…å®¹ï¼Œä¿�æŒ�æ®µè�½åˆ†éš”å’Œè¡¨æ ¼HTMLr   Útabler0   r8   ÚfontÚpr   T)Ú	separatorr   )rN   Úh2Úh3Úh4Úh5rR   rQ   r1   r4   Fr5   )
ÚchildrenrJ   Úlowerr   Ústrr>   ÚunwraprA   r?   Úextend)ÚelÚdepthÚpartsÚchildÚtnÚtbl_soupÚspr    Úinner_tablesÚtÚtbl_sr   r4   Ú_extract_blocks                €r   rn   z&extract_detail.<locals>._extract_block�   s¾  ø€ à�1Š9ØˆIØˆØ—[‘[ó  	+ˆEØ�z‰zÐ!ØØ—‘×!Ñ!Ó#ˆBØ�WŠ}Ü(¬¨U«°]ÓC�Ø"×+Ñ+¨V°VÐ,<Ó=ò  �BØ—I‘I•Kð à—‘œS ›]Õ+Ø�s’Ø—~‘~°¸$�~Ó?�ÚØ#(§>¡>°'Ó#:�LÙ#Ø!-ò 5˜AÜ$1´#°a³&¸-Ó$H˜EØ&+§n¡n°f¸fÐ5EÓ&Fò , Ø "§	¡	¥ð,à!ŸL™L¬¨U«Õ4ò	5ð Ÿ™ TÖ*ØÐ5Ñ5Ø—~‘~°¸$�~Ó?�ÛØ—L‘L Ö&Ø�u’Ù$ U¨E°A©IÓ6�Ø—‘˜SÖ!Ø�t”ØŸ.™.¨¸˜.Ó?ò +�BØŸ;™;°¸4˜;Ó@�DÚØŸ™ TÕ*ò+ð; 	+ðB ˆr   Úclassc              3   ó$   K  — | ]  }|d v –— Œ
 y­w))Úintror;   ÚtimeÚinfoÚbtN© )Ú.0Úcs     r   ú	<genexpr>z!extract_detail.<locals>.<genexpr>³   s   è ø€ ÒSÀQ�1Ð@Ô@ÑSùs   ‚r   é   z<p><a href="z">z</a></p>z
[z](r+   ú)u   

**é™„ä»¶ï¼š**)r   )r.   r   r=   r'   r   r?   r   ÚsearchÚgroupr>   ÚcompileÚIrA   r   Ú	decomposer_   rJ   r`   Úanyrc   ÚjoinÚlen)Ú
detail_urlÚ
list_titlerB   rD   Ú
meta_titleÚ
full_titlerN   rE   Ú	meta_dateÚmÚattachmentsÚa_tagr9   rJ   Úcontent_divÚclsÚtagrf   rg   Útag_nameÚcls_listr   rM   Úattrn   s                           @r   Úextract_detailr‘   O   s,  ø€ ä�Ó€DÙØ�R˜Ð#Ð#ä˜˜}Ó-€Dð —‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø 	Ñ*×0Ñ0Ó2‰
à�Y‰Y�t‹_ˆÙ02�R—[‘[ t�[Ô,¸
ˆ
ð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆÙÜ�I‰IÐEÀtÓLˆÙØ—w‘w˜q“zˆHð €KØ—‘˜s¬¯©Ð4YÔ[]×[_Ñ[_Ó)`�Óaò QˆØ�y‰y˜ Ó$×*Ñ*Ó,ˆÚØ—>‘>¨�>Ó-Ò9°ˆDØ×Ñ¨´W¸ZÈÓ5NÑOÕPð	Qð —)‘)˜E¨-�)Ó8€KÙàWò 	ˆCØŸ)™) E°#˜)Ó6ˆKÚÙð	ñ
 Ø�[ *Ð,Ð,ð ×#Ñ#Ò$?Ó@ò ˆØ�‰�ðõ&ðR €EØ×%Ñ%ò ˆØ�:‰:ÐØØ—:‘:×#Ñ#Ó%ˆØ�tÒØØ�uÒØ—y‘y ¨"Ó-ˆHÜÑSÈ(ÔSÔSØÙ˜UÓ#ˆØ�‰�SÕðð �k‰k˜%Ó ×&Ñ&Ó(€Gä
ˆ7ƒ|�bÒ™[Ø   ¨B¨z¨l¸(ÐCˆØò 	:ˆCØ˜˜S ™[˜M¨¨C°©J¨<°qÐ9Ñ9‰Gñ	:á	‘[ØÐ&Ñ&ˆØò 	:ˆCØ˜˜S ™[˜M¨¨C°©J¨<°qÐ9Ñ9‰Gð	:ð �K Ð+Ð+r   c           
      óH  — 	 t        j                  t        d¬«      }| j                  d«      xs ddd }| j                  d«      xs ddd }t	        | j                  d	«      xs d«      }| j                  d
«      xs ddd }| j                  d«      xs ddd }t        j                  | j                  d«      xs g d¬«      }|j                  d|f«      j                  «       }|D ]  \  }	|j                  d|	f«       Œ |j                  d|||||||f«       |j                  d«      j                  «       d   }
|r|dd n|dd }|j                  d|
|||f«       |j                  «        |j                  «        y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)u   å†™å…¥ search.db + FTSrP   r#   r;   r   Niô  Úpage_urliè  rM   Úpublish_datery   Ú	site_nameÚunknownéd   r‰   F©Úensure_asciiz,SELECT rowid FROM gov_raw WHERE page_url = ?z&DELETE FROM gov_search WHERE rowid = ?zšINSERT OR REPLACE INTO gov_raw (title, page_url, content, publish_date, site_name, source_url, status, attachments) VALUES (?, ?, ?, ?, ?, ?, 'synced', ?)zSELECT last_insert_rowid()r   zWINSERT OR REPLACE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)Tz  [ERR] DB import failed: )Úsqlite3ÚconnectÚDB_PATHr'   r!   ÚjsonÚdumpsÚexecuteÚfetchallÚfetchoneÚcommitÚcloser*   r   )ÚrecordÚdbr;   r“   rM   r”   r•   Úattachments_strÚ
old_rowidsÚridÚ	new_rowidÚsummaryr-   s                r   Úimport_to_dbr«   Æ   sª  € ðÜ�_‰_œW¨bÔ1ˆØ—‘˜GÓ$Ò*¨¨D¨SÐ1ˆØ—J‘J˜zÓ*Ò0¨b°%°4Ð8ˆÜ˜VŸZ™Z¨	Ó2Ò8°bÓ9ˆØŸ
™
 >Ó2Ò8°b¸#¸2Ð>ˆØ—Z‘Z Ó,Ò9°	¸4¸CÐ@ˆ	ÜŸ*™* V§Z¡Z°Ó%>Ò%DÀ"ÐSXÔYˆà—Z‘ZØ:¸X¸Kó
ç
‰(‹*ð 	ð !ò 	I‰FˆSØ�J‰JÐ?À#ÀÕHð	Ið 	�
‰
ð iØ�H˜g |°YÀÈ/ÐZô	
ð
 —J‘JÐ;Ó<×EÑEÓGÈÑJˆ	Ù#*�'˜$˜3‘-°°d°s°ˆØ
�
‰
ØeØ˜˜y¨'Ð2ô	
ð 	�	‰	ŒØ
�‰Œ
ØøÜò ÜÐ(¨¨Ð,Ô-Üûðús   ‚E=F  Æ 	F!Æ	FÆF!c           	      ó<  — | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dg «      t        › dt        › �t        t        dœ}t	        t        j                  |d	¬
«      «       t        |«      }|S )Nr;   r   r+   r<   rM   r‰   ú-)r;   r“   r”   rM   r‰   r•   ÚcolumnÚprovinceFr˜   )r'   ÚSITEÚCOLUMNÚPROVINCEr   r�   rž   r«   )ÚitemÚidxr¤   Úoks       r   Úoutput_itemr¶   ê   s‡   € à—‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ø—x‘x ¨rÓ2Ü�v˜Qœv˜hÐ'ÜÜñ	€Fô 
Œ$�*‰*�V¨%Ô
0Ô1Ü	�fÓ	€BØ€Ir   Úincrementalc                 óŠ  — | dk(  rgt        dd› �«       t        dt        › dt        › �«       t        d«       t        d› «       t        j                  «       t        d¬«      z
  }t        g}n t        dd› �«       t        dt        › dt        › �«       t        d	t        › d
�«       t        d› «       t        j                  «       t        d¬«      z
  }t        g}t        dt        dz   «      D ]  }|j                  t        › d|› �«       Œ g }t        «       }|D ]¢  }t        |«      }|st        d|› �«       Œt        |«      }t        dd|v r&|j                  d«      d   j                  d«      d   nd› dt        |«      › d�«       |D ]/  }	|	d   |vsŒ|j                  |	d   «       |j                  |	«       Œ1 Œ¤ t        dt        |«      › d�«       t        |«      }
d}t!        |d«      D ]«  \  }}	 t        j"                  |d   d«      }||k  rŒ&	 t)        |d   |d   «      \  }}}|€t        d |› d|
› d!|d   dd" › �«       ŒZ||d<   ||d#<   ||d$<   t+        ||«      r|dz  }|d%z  dk(  rt        d&|› d|
› �«       t-        j.                  t0        «       Œ­ t        d'|› d(�«       |S # t$        t&        f$ r Y Œ©w xY w))u,   çˆ¬å�–ï¼šå¢žé‡�(ç¬¬1é¡µ) æˆ– å…¨é‡�(å‰�5é¡µ)r·   r   z2==================================================u   ðŸ�  z - u   ðŸ“„ å¢žé‡�ï¼ˆç¬¬1é¡µï¼‰é0   )Úhoursu   ðŸ“„ å…¨é‡�å‰�u   é¡µiG  )Údaysé   rQ   z?page=u     [WARN] é¡µé�¢èŽ·å�–å¤±è´¥: z  Úpageú?r   ú/éÿÿÿÿu   ç¬¬1é¡µz: u   æ�¡r+   u   å�ˆè®¡: r<   z%Y-%m-%dr;   Nz  [u   ] â�­ï¸� è¯¦æƒ…ç©º: é(   rM   r‰   ry   z  [PROGRESS] u   
[DONE] å…±å¤„ç�† u    æ�¡)r   r°   r±   r   Únowr   ÚLIST_URLÚTOTAL_PAGESÚrangerA   Úsetr.   rG   Úsplitr‚   ÚaddÚ	enumerateÚstrptimeÚ
ValueErrorÚKeyErrorr‘   r¶   rr   ÚsleepÚDELAY)ÚlabelÚcutoffÚurlsrY   Ú	all_itemsÚ	seen_urlsr“   rB   rC   ÚitÚtotalÚok_countr´   r³   Ú	item_daterM   r‰   r†   s                     r   Ú	crawl_allrØ   ú   sõ  € à�ÒÜˆb��ˆMÔÜˆe”D�6˜œV˜HÐ%Ô&ÜÐ&Ô(ÜˆvˆhÔÜ—‘“¤)°"Ô"5Ñ5ˆÜˆz‰äˆb��ˆMÔÜˆe”D�6˜œV˜HÐ%Ô&Üˆnœ[˜M¨Ð-Ô.ÜˆvˆhÔÜ—‘“¤)°Ô"9Ñ9ˆÜˆzˆÜ�qœ+¨™/Ó*ò 	0ˆAØ�K‰Kœ8˜* F¨1¨#Ð.Õ/ð	0ð €IÜ“€IØò 
%ˆÜ�X‹ˆÙÜÐ/°¨zÐ:Ô;ØÜ˜tÓ$ˆÜˆb¸&ÀHÑ:L�—‘ Ó$ QÑ'×-Ñ-¨cÓ2°2Ò6ÐR[Ð\Ð\^Ô_bÐchÓ_iÐ^jÐjmÐnÔoØò 	%ˆBØ�%‰y 	Ò)Ø—‘˜b ™iÔ(Ø× Ñ  Õ$ñ	%ð
%ô ˆ(”3�y“>Ð" #Ð&Ô'ä�	‹N€EØ€HÜ˜y¨!Ó,ò ‰	ˆˆTð	Ü ×)Ñ)¨$¨v©,¸
ÓCˆIØ˜6Ò!Øð "ô
 ,:¸$¸u¹+ÀtÈGÁ}Ó+UÑ(ˆ�˜jØˆ?Ü�#�c�U˜!˜E˜7Ð"6°t¸G±}ÀSÀbÐ7IÐ6JÐKÔLØØ"ˆˆW‰Ø!ˆˆY‰Ø)ˆˆ]ÑÜ�t˜SÔ!Ø˜‰MˆHØ�‰8�qŠ=Ü�- ˜u A e WÐ-Ô.Ü�
‰
”5Õð'ô* Ð
˜h˜Z tÐ,Ô-Ø€Oøô# œHÐ%ò 	Ùð	ús   Ç8J0Ê0KËKÚ__main__rQ   ))rP   é   )r·   )*Ú__doc__r   Úosr   r�   rr   rš   rB   r   r   r   ÚrequestsÚbs4r   Úurllib.parser   r@   rÃ   r°   r±   r²   rÎ   rÄ   Úgetenvrœ   ÚHEADERSÚSessionr&   ÚheadersÚupdater   r!   r.   rG   r‘   r«   r¶   rØ   Ú__name__r‚   ÚargvÚmoderu   r   r   ú<module>rè      sñ   ðñ÷ :× 9× 9Ó 9ß (Û Ý Ý  ð #€ØÐ-Ñ-€Ø€Ø	€Ø€Ø	€Ø€ð ˆ"�)‰)�KÐ!2Ó
3€àÐWÐ
X€Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ò,ò	óòò(t,òn!òHó ;ð| ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DÙˆd…Oð r   