Ë
    ½ÞŽ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 eej                  «      dkD  r2ej                  d   j                  «       r eej                  d   «      ndZe� ed ee«      z   «       dZdZed	z   Zed
z   ZdZdZ ej2                  dd«      ZdZddedœZddddddddœZd"d„Zd„ Zd#d„Z d„ Z!d„ Z"d „ Z#e$d!k(  r e#«        yy)$uƒ   
æ³°å·žåŒ»è�¯é«˜æ–°åŒºï¼ˆé«˜æ¸¯åŒºï¼‰ â€” é€šçŸ¥å…¬å‘Š
Hanweb CMS AJAX (unitbuild API)
https://www.cmc.gov.cn/xwzx/tzgg/index.html
é    N)ÚdatetimeÚ	timedelta)Úurljoiné   z[AutoPg] max_pages=u0   æ³°å·žåŒ»è�¯é«˜æ–°åŒºï¼ˆé«˜æ¸¯åŒºï¼‰äººæ°‘æ”¿åºœzhttps://www.cmc.gov.cnz/xwzx/tzgg/index.htmlz7/api-gateway/jpaas-publish-server/front/page/build/unitz
2023-06-18z!www.cmc.gov.cn:443:218.90.228.239Ú	SEARCH_DBz/root/search.dbiù&5zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z!application/json, text/plain, */*)z
User-AgentÚAcceptÚRefererÚbulidstaticÚ 5f26120115824722ba2229d0ceaa65b2Ú 158d93f47443484c9ef19d54c1ab9ab2Úcolumnu   ä¿¡æ�¯åˆ—è¡¨ÚnullÚdE67Ga7Sg0xeYjn7E3pZ5)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdc           	      ó¢  — t        t        «      }t        j                  | |dœd¬«      |d<   	 t	        j
                  t        |t        |¬«      }|j                  «        |j                  «       }|j                  d«      r|d   d   S t        d	| › d
|j                  dd«      › �«       y# t        $ r}t        d| › d
|› �«       Y d}~yd}~ww xY w)z(Call the Hanweb API for a specific page.)ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJson)ÚparamsÚheadersÚtimeoutÚsuccessÚdataÚhtmlz  API error (page z): ÚmessageÚunknownNz  Request failed (page )ÚdictÚBASE_PARAMSÚjsonÚdumpsÚrequestsÚgetÚAPI_URLÚHEADERSÚraise_for_statusÚprintÚ	Exception)Úpage_noÚ	page_sizer   r   Úrr    Úes          ú/root/gov_crawler/crawl_cmc.pyÚapi_getr4   5   sÀ   € ä”+Ó€FÜŸ*™*°ÀYÑ%OÐ^cÔd€Fˆ;ÑðÜ�L‰Lœ¨¼È'ÔRˆØ	×ÑÔØ�v‰v‹xˆØ�8‰8�IÔØ˜‘< Ñ'Ð'äÐ& w i¨s°4·8±8¸IÀyÓ3QÐ2RÐSÔTØøÜò ÜÐ'¨ y°°A°3Ð7Ô8Üûðús   ®AB* Â!B* Â*	CÂ3C	Ã	Cc           
      óÖ  — g }t        j                  dt         j                  «      }|j                  | «      D ]®  }|j	                  d«      }t        j
                  d|«      }t        j
                  d|«      }t        j
                  d|«      }|sŒY|sŒ\|sŒ_|j                  |j	                  d«      t        t        |j	                  d«      «      |j	                  d«      dœ«       Œ° |S )z4Parse list HTML to extract items (title, url, date).z(<li[^>]*class="clearfix"[^>]*>(.*?)</li>r   ztitle="([^"]*)"zhref="([^"]+)"z\[(\d{4}-\d{2}-\d{2})\])ÚtitleÚurlÚdate)	ÚreÚcompileÚDOTALLÚfinditerÚgroupÚsearchÚappendr   ÚBASE_URL)r!   ÚitemsÚ
li_patternÚliÚli_htmlÚtitle_mÚhref_mÚdate_ms           r3   Ú
parse_listrH   G   s¾   € à€Eä—‘ÐGÌÏÉÓS€JØ×!Ñ! $Ó'ò 
ˆØ—(‘(˜1“+ˆÜ—)‘)Ð.°Ó8ˆÜ—‘Ð,¨gÓ6ˆÜ—‘Ð5°wÓ?ˆÚ’v¢&Ø�L‰LØ Ÿ™ qÓ)Üœx¨¯©°a«Ó9ØŸ™ Q›ñõ ð
ð €Ló    c                 óÒ  — 	 t        j                  | t        |¬«      }|j                  «        d|_        |j
                  }t        j                  d|«      }|r|j                  d«      j                  «       nd}t        j                  d|«      }|r|j                  d«      nd}d}	t        j                  d	|t        j                  «      }
|
r |
j                  d«      j                  «       }	nFt        j                  d
|t        j                  «      }
|
r|
j                  d«      j                  «       }	|	s||dddœS |||	dœS # t        $ r}dddt        |«      dœcY d}~S d}~ww xY w)z3Fetch detail page and extract title, date, content.)r   r   zutf-8Ú )r6   r8   ÚcontentÚerrorNz<title>([^<]*)</title>r   z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})z3<div\s+id="zoom"[^>]*>(.*?)</div>\s*</div>\s*</div>z!<div\s+id="zoom"[^>]*>(.*?)</div>úempty content)r6   r8   rL   )r(   r)   r+   r,   ÚencodingÚtextr.   Ústrr9   r>   r=   Ústripr;   )r7   r   r1   r!   r2   rE   r6   rG   r8   rL   Úzoom_ms              r3   Úfetch_detailrT   Z   s:  € ðIÜ�L‰L˜¤g°wÔ?ˆØ	×ÑÔØˆŒ
Ø�v‰vˆô
 �i‰iÐ1°4Ó8€GÙ(/ˆG�M‰M˜!Ó×"Ñ"Ô$°R€Eô �Y‰YÐKÈTÓR€FÙ$ˆ6�<‰<˜Œ?¨"€Dð €GÜ�Y‰YÐMÈtÔUW×U^ÑU^Ó_€FÙØ—,‘,˜q“/×'Ñ'Ó)‰ô —‘Ð?ÀÄrÇyÁyÓQˆÙØ—l‘l 1“o×+Ñ+Ó-ˆGáØ¨¸ÀoÑVÐVà D°WÑ=Ð=øô3 ò IØ R°BÄÀQÃÑHÕHûðIús   ‚?E Å	E&ÅE!ÅE&Å!E&c                 óX  — | st        d«       yt        j                  t        «      }|j	                  «       }d}| D ]ž  }	 t        j                  dd|d   «      j                  «       }	 t        j                  |d   d«      }t        |j                  d«      «      }|j                  d	|d
   |d   t        |dd |d   |d   f«       |j                  dkD  r|dz  }Œ  |j!                  «        |j#                  «        |S #  d}Y ŒixY w# t        $ r}t        d|› �«       Y d}~Œèd}~ww xY w)zInsert items into search.db.u     æ— æ•°æ�®æ�’å…¥r   z<[^>]+>rK   rL   r8   z%Y-%m-%dz%Y%m%dzšINSERT OR IGNORE INTO gov_raw
                   (title, page_url, site_name, summary, content, publish_date)
                   VALUES (?, ?, ?, ?, ?, ?)r6   r7   Niô  r   z  DB insert error: )r-   Úsqlite3ÚconnectÚDB_PATHÚcursorr9   ÚsubrR   r   ÚstrptimeÚintÚstrftimeÚexecuteÚ	SITE_NAMEÚrowcountr.   ÚcommitÚclose)	rA   ÚconnÚcÚinsertedÚitemÚ
clean_textÚdtÚ	date_rankr2   s	            r3   Ú	insert_dbrj   }   s/  € áÜÐ!Ô"ØÜ�?‰?œ7Ó#€DØ�‰‹€AØ€HØò -ˆð	-äŸ™ 
¨B°°Y±Ó@×FÑFÓHˆJðÜ×&Ñ& t¨F¡|°ZÓ@�Ü §¡¨HÓ 5Ó6�	ð �I‰Ið0ð �g‘  U¡¬Y¸
À4ÀCÐ8HØ�i‘ $ v¡,ð0ô	ð �z‰z˜AŠ~Ø˜A‘�øð%-ð* 	‡K�K„MØ‡J�J„LØ€OøðØ’	ûô ò 	-ÜÐ'¨ sÐ+×,Ñ,ûð	-ús0   Á (DÁ)3C?Â?DÃ?DÄDÄ	D)ÄD$Ä$D)c                  ó  — 	 t        j                  t        «      } | j                  «       }|j	                  d«       | j                  «        | j                  «        t        d«       y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)zRebuild FTS index.z4INSERT INTO gov_search(gov_search) VALUES('rebuild')u     FTS é‡�å»ºå®Œæˆ�u     FTS é‡�å»ºå¤±è´¥: N)	rV   rW   rX   rY   r^   ra   rb   r-   r.   )rc   rd   r2   s      r3   Úrebuild_ftsrl   Ÿ   sk   € ð*Ü�‰œwÓ'ˆØ�K‰K‹MˆØ	�	‰	ÐHÔIØ�‰ŒØ�
‰
ŒÜÐ"Õ#øÜò *ÜÐ$ Q CÐ(×)Ñ)ûð*ús   ‚A%A( Á(	B	Á1BÂB	c                  óˆ  — t        dt        › d�«       t        dt        › �«       t        d«      } | st        d«       y t	        j
                  d| «      }|rt        |j                  d«      «      nd}d}||z   dz
  |z  }t        d	|› d
|› �«       t        | «      }|r|d   d   nd}t        dt        t        xs ||«      dz   «      D ]g  }t        |«      } | sŒt        | «      }|r#|j                  |«       |d   d   }|t        k  r	 |dz  dk(  sŒJt        d|› d|› dt        |«      › d�«       Œi t        dt        |«      › d�«       |D �	cg c]  }	|	d   t        k\  sŒ|	‘Œ }
}	t        dt        |
«      › d�«       g }d}d}t        |
«      D ]Ï  \  }}	t        |	d   «      }|j!                  d«      rBd|d   v r|dz  }n|dz  }|dz   dz  dk(  r$t        d|dz   › dt        |
«      › d|› d|› d�	«       Œg|j#                  |d   xs |	d   |	d   |d   xs |	d   |d   d œ«       |dz   dz  dk(  sŒ£t        d|dz   › dt        |
«      › d!t        |«      › d"|› d�	«       ŒÑ t        d#t        |«      › d$|› d%|› �«       t%        |«      }t        d&|› d�«       t'        «        t        d't        |«      › d(|› d)�«       y c c}	w )*Nu   === å¼€å§‹çˆ¬å�– u    - é€šçŸ¥å…¬å‘Š ===u   æˆªæ­¢æ—¥æœŸ: r   u!     â�Œ æ— æ³•èŽ·å�–ç¬¬ä¸€é¡µæ•°æ�®zcount="(\d+)"r   é   u
     æ€»æ•°: u   , æ€»é¡µæ•°: éÿÿÿÿr8   rK   é   é
   u     å·²æ‰«æ�� ú/u    é¡µ, ç´¯è®¡ u    æ�¡u     åˆ—è¡¨æ‰«æ��å®Œæˆ�: u     3å¹´å†…: r7   rM   rN   é2   u     è¯¦æƒ…é¡µè¿›åº¦: u    (ç©ºæ­£æ–‡: u
   , é”™è¯¯: ú)r6   rL   )r6   r7   r8   rL   u
    (æˆ�åŠŸ: u   , ç©ºæ­£æ–‡: u     è¯¦æƒ…é¡µå®Œæˆ�: æˆ�åŠŸ u   , ç©ºæ­£æ–‡è·³è¿‡ u	   , é”™è¯¯ u
     å…¥åº“: u   === å®Œæˆ�: å…± u    æ�¡æˆ�åŠŸ, æ–°å¢ž u    æ�¡ ===)r-   r_   ÚCUTOFF_DATEr4   r9   r>   r\   r=   rH   ÚrangeÚminÚ_MAX_PGÚextendÚlenÚ	enumeraterT   r)   r?   rj   rl   )r!   Úcount_mÚtotal_countr0   Útotal_pagesÚ	all_itemsÚ	last_dater/   rA   rf   Úfilteredr   Úskipped_emptyÚskipped_errorÚiÚdetailre   s                    r3   Úmainr†   ¬   s<  € Ü	Ðœi˜[Ð(;Ð
<Ô=Ü	ˆNœ;˜-Ð
(Ô)ô �1‹:€DÙÜÐ1Ô2Øô �i‰iÐ(¨$Ó/€GÙ+2”#�g—m‘m AÓ&Ô'¸€KØ€IØ Ñ*¨QÑ.°9Ñ<€KÜ	ˆJ�{�m =°°Ð
>Ô?ô ˜4Ó €IÙ)2�	˜"‘˜fÒ%¸€Iô ˜œC¤Ò 6¨;¸ÓDÀqÑHÓIò [ˆÜ�wÓˆÙØÜ˜4Ó ˆÙØ×Ñ˜UÔ#Ø˜b™	 &Ñ)ˆIàœ;Ò&àà�R‰<˜1ÓÜ�L  	¨¨;¨-°}ÄSÈÃ^ÐDTÐTXÐYÕZð[ô  
Ð"¤3 y£>Ð"2°$Ð
7Ô8ð "+ÖJ˜¨d°6©l¼kÓ.I’ÐJ€HÐJÜ	ˆKœ˜H›� dÐ
+Ô,ð €GØ€MØ€MÜ˜XÓ&ò t‰ˆˆ4Ü˜d 5™kÓ*ˆØ�:‰:�gÔØ &¨¡/Ñ1Ø Ñ"‘à Ñ"�Ø�A‘˜‰|˜qÒ ÜÐ+¨A¨a©C¨5°´#°h³-°ÀÈmÈ_Ð\fÐgtÐfuÐuvÐwÔxØØ�‰Ø˜G‘_Ò5¨¨W©Ø˜‘;Ø˜6‘NÒ2 d¨6¡lØ˜iÑ(ñ	
ô 	ð �‰E�R‰<˜1ÓÜÐ'¨¨!© u¨A¬c°(«m¨_¸JÄsÈ7Ã|ÀnÐTaÐboÐapÐpqÐrÕsð#tô& 
Ð&¤s¨7£| nÐ4FÀ}ÀoÐU^Ð_lÐ^mÐ
nÔoô ˜Ó!€HÜ	ˆJ�x�j Ð
%Ô&ô „Mä	ÐœS ›\˜NÐ*=¸h¸ZÀxÐ
PÕQùòG Ks   ÅJ?Å!J?Ú__main__)rn   rn   )rn   )%Ú__doc__r&   r9   ÚosÚsysr(   rV   r   r   Úurllib.parser   Ú_SYSrz   ÚargvÚisdigitr\   rx   r-   rQ   r_   r@   Ú
COLUMN_URLr*   ru   ÚRESOLVEÚgetenvrX   ÚDATE_RANK_BASEr+   r%   r4   rH   rT   rj   rl   r†   Ú__name__© rI   r3   ú<module>r•      s$  ðñó
 Û 	Û 	Û 
Û Û ß (Ý  ã Ù" 4§9¡9›~°Ò1°d·i±iÀ±l×6JÑ6JÔ6L‰#ˆd�i‰i˜‰lÔ
ÐRV€Ø
ÐÙ	Ð
¡# g£,Ñ
.Ô/ð ?€	Ø#€ØÐ/Ñ/€
Ø
ÐNÑ
N€Ø€ð .€à
ˆ"�)‰)�KÐ!2Ó
3€à€ð DØ1Øñ€ð Ø/Ø2ØØØØ%ñ€óò$ó& >òFòD
*òLRð^ ˆzÒÙ…Fð rI   