Ë
    ¸¬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	m
Z
 ddlmZmZ ej                  j                  dd«      ZdZdZ e	j&                  «        e
d	¬
«      z
  j)                  d«      ZdZddiZddlZ ej2                  «       Zej6                  j9                  e«       dd„Zd„ Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)uR   crawl_kmsthjj.py â€” æ˜†æ˜Žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu=   æ˜†æ˜Žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯zhttps://sthjj.km.gov.cniG  )Údaysz%Y-%m-%dé   z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36c                 ó@  — | j                  d«      s$t        j                  j                  t        | «      n| }t        d«      D ].  }	 t        j                  ||¬«      }d|_        |j                  c S  y # t        $ r}t        j                  d«       Y d }~ŒUd }~ww xY w)NÚhttpé   ©Útimeoutzutf-8é   )Ú
startswithÚurllibÚparseÚurljoinÚBASEÚrangeÚsessÚgetÚencodingÚtextÚ	ExceptionÚtimeÚsleep)Úurlr   Úfull_urlÚ_ÚrÚes         ú"/root/gov_crawler/crawl_kmsthjj.pyÚfetchr#      s„   € Ø69·n±nÀVÔ6LŒv�|‰|×#Ñ#¤D¨#Ô.ÐRU€HÜ�1‹Xò ˆð	Ü—‘˜¨7�Ó3ˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	Ü�J‰J�q�M‰Mûð	ús   Á)A5Á5	BÁ>BÂBc           	      óÊ  — g }t        j                  d| t         j                  «      D ]¸  }|j                  d«      }t        j                  d|«      }t        j                  d|«      }|sŒC|j                  t        j                  j                  t        |j                  d«      «      |j                  d«      j                  «       |r|j                  d«      nddœ«       Œº |S )z$Parse article items from a list pagezC<div class="data-table-item clearfix">(.*?)</div>\s*</div>\s*</div>r   z#<a href="([^"]+)">\s*([^<]+)\s*</a>ztitle="(\d{4}-\d{2}-\d{2})é   Ú )r   ÚtitleÚdate)ÚreÚfinditerÚDOTALLÚgroupÚsearchÚappendr   r   r   r   Ústrip)ÚhtmlÚitemsÚblockÚcontentÚaÚ
date_matchs         r"   Úparse_list_pager6   $   s¸   € à€Eä—‘ÐcÐeiÔkm×ktÑktÓuò 	ˆØ—+‘+˜a“.ˆÜ�I‰IÐ<¸gÓFˆÜ—Y‘YÐ<¸gÓFˆ
ÚØ�L‰LÜ—|‘|×+Ñ+¬D°!·'±'¸!³*Ó=ØŸ™ ›×)Ñ)Ó+Ù/9˜
×(Ñ(¨Ô+¸rñõ ð	ð €Ló    c                 óö  — t        j                  d| «      }|r|j                  d«      nd}|s9t        j                  d| «      }|r|j                  d«      j                  «       nd}t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|r|j                  d«      j                  «       nd}t        j
                  dd|t         j                  ¬«      }t        j
                  d	d|t         j                  ¬«      }t        j
                  d
d|«      }t        j
                  dd|«      }t        j
                  dd|«      }||j                  «       fS )z Extract content from detail pagez/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   r&   z<h1>(.*?)</h1>zN<div class="activity">(.*?)</div>\s*</div>\s*</div>\s*</div>\s*</div>\s*</div>z3<div class="activity">(.*?)</div>\s*</div>\s*</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<o:p>\s*</o:p>z<o:p/>z <p[^>]*>\s*(?:<br\s*/?>\s*)*</p>)r)   r-   r,   r/   r+   Úsub)r0   Útitle_mr'   Úh1Ú	content_mr3   s         r"   Úparse_detailr>   5   s(  € ô �i‰iÐJÈDÓQ€GÙ 'ˆG�M‰M˜!Ô¨R€EáÜ�Y‰YÐ(¨$Ó/ˆÙ')�—‘˜“×!Ñ!Ô#¨rˆô —	‘	ÐkÐmqÔsu×s|Ñs|Ó}€IÙÜ—I‘IÐTÐVZÔ\^×\eÑ\eÓfˆ	á,5ˆi�o‰o˜aÓ ×&Ñ&Ô(¸2€Gô �f‰fÐ1°2°wÄbÇiÁiÔP€GÜ�f‰fÐ/°°WÄBÇIÁIÔN€GÜ�f‰fÐ&¨¨GÓ4€GÜ�f‰f�Y  GÓ,€GÜ�f‰fÐ8¸"¸gÓF€Gà�'—-‘-“/Ð!Ð!r7   c                 óš   — t        | d   «      }|sdd| d   dd › �fS t        |«      \  }}|xs | d   }t        || d   | d   | d   |dœdfS )z*Fetch detail and return data for insertionr   NzFETCH_ERR: r'   é   r(   )Ú	site_namer'   Úpage_urlÚpublish_dateÚ
source_urlr3   )r#   r>   Ú	SITE_NAME)Úitemr0   Údtr3   Úfinal_titles        r"   Úprocess_itemrI   P   s�   € ä��e‘Ó€DÙØ�{ 4¨¡=°°"Ð#5Ð"6Ð7Ð7Ð7ä˜tÓ$�K€BˆØÒ%˜˜W™€Kô ØØ˜‘KØ˜V™Ø˜5‘kØñð ðð r7   c                  ó$  — t        dt        j                  «       j                  d«      › dt        › �«       dg} t        dd«      D ]  }| j                  d|› d�«       Œ g }| D ]�  }t        |«      }|rJt        |«      }|j                  |«       t        d	| j                  |«      d
z   › dt        |«      › d�«       nt        d|› �«       t        j                  t        j                  dd«      «       Œ’ t!        «       }g }|D ]/  }|d   |vsŒ|j#                  |d   «       |j                  |«       Œ1 t        dt        |«      › dt        |«      › d�«       |D �cg c]  }|d   t$        k\  sŒ|‘Œ }	}t        dt        |	«      › dt        |«      t        |	«      z
  › d�«       t'        j(                  t*        d¬«      }
|
j-                  «       }t!        «       }|j/                  dt        f«      D ]  }|j#                  |d   «       Œ |	D �cg c]  }|d   |vsŒ|‘Œ }}t        dt        |«      › �«       d}d}t1        t2        ¬«      5 }|D �ci c]  }|j5                  t6        |«      |“Œ }}t9        t;        |«      d
«      D ]õ  \  }}||   }|j=                  «       \  }}|s|€0t        d|› dt        |«      › d|d   d d › d |xs d!› �«       |d
z  }ŒR	 |j/                  d"|d#   |d   |d$   |d%   |d&   |d'   f«       |j>                  r9|d
z  }t        d|› dt        |«      › d|d   d d › d(t        |d'   «      › d)�	«       n$t        d|› dt        |«      › d|d   d d › d*�«       |
jC                  «        Œ÷ 	 d d d «       |
jE                  «        t        d,«       t        d-|› d.|› �«       y c c}w c c}w c c}w # t@        $ r5}t        d|› dt        |«      › d|d   d d › d+|› �«       |d
z  }Y d }~Œ�d }~ww xY w# 1 sw Y   Œ†xY w)/Nú[z%H:%M:%Sz] zNhttps://sthjj.km.gov.cn/zfxxgk/fdzdgknr/zdlyxxgk/hjbh/jsxmhjyxpjxx/index.shtmlr%   é   zIhttps://sthjj.km.gov.cn/zfxxgk/fdzdgknr/zdlyxxgk/hjbh/jsxmhjyxpjxx/index_z.shtmlz  List page r   z: z itemsz  [WARN] Failed: g333333Ó?g      à?r   z
Total unique: z (deduped from ú)r(   zWithin 3 years: z (filtered: r@   r   z.SELECT page_url FROM gov_raw WHERE site_name=?r   zNew items to fetch: )Úmax_workersz  [ú/r'   z... zUNKNOWN ERRzšINSERT OR IGNORE INTO gov_raw
                    (site_name, title, page_url, publish_date, source_url, content)
                    VALUES (?,?,?,?,?,?)rA   rB   rC   rD   r3   z... OK (zB)z... DUPz	... ERR: z
=== Done ===zNew: z
, Errors: )#Úprintr   ÚnowÚstrftimerE   r   r.   r#   r6   ÚextendÚindexÚlenr   r   ÚrandomÚuniformÚsetÚaddÚCUTOFFÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚMAX_WORKERSÚsubmitrI   Ú	enumerater   ÚresultÚrowcountr   ÚcommitÚclose)Ú	list_urlsÚiÚ	all_itemsr   r0   r1   ÚseenÚuniquerF   ÚrecentÚconnÚcÚexisting_urlsÚrowÚto_fetchÚ	new_countÚerror_countÚexecutorÚfuturesÚfuturerc   Úerrr!   s                          r"   Úmainrx   c   s\  € Ü	ˆAŒh�l‰l‹n×%Ñ% jÓ1Ð2°"´Y°KÐ
@ÔAð 	Yð€Iô �1�a‹[ò pˆØ×ÑÐdÐefÐdgÐgmÐnÕoðpð €IØò -ˆÜ�S‹zˆÙÜ# DÓ)ˆEØ×Ñ˜UÔ#Ü�L §¡°Ó!5°aÑ!7Ð 8¸¼3¸u»:¸,ÀfÐMÕNäÐ% c UÐ+Ô,Ü�
‰
”6—>‘> # sÓ+Õ,ð-ô ‹5€DØ€FØò  ˆØ�‰;˜dÒ"Ø�H‰H�T˜%‘[Ô!Ø�M‰M˜$Õð ô
 
ÐœS ›[˜M¨¼¸Y»Ð8HÈÐ
JÔKð  Ö7�A 1 V¡9´Ó#6ŠaÐ7€FÐ7Ü	ÐœS ›[˜M¨´c¸&³kÄ#ÀfÃ+Ñ6MÐ5NÈaÐ
PÔQô �?‰?œ7¨BÔ/€DØ�‰‹€AÜ“E€MØ�y‰yÐIÌIÈ<ÓXò "ˆØ×Ñ˜#˜a™&Õ!ð"ð "ÖC�a Q u¡X°]Ò%B’ÐC€HÐCÜ	Ð ¤ X£ Ð
0Ô1ð €IØ€Kä	¬Ô	4ð ¸ØIQÖRÀ�8—?‘?¤<°Ó6¸Ñ<ÐRˆÐRä"¤<°Ó#8¸!Ó<ò 	‰IˆAˆvØ˜6‘?ˆDØ Ÿ-™-›/‰KˆF�Cá�f�nÜ˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀDÈÒI]ÐP]ÐH^Ð_Ô`Ø˜qÑ �Øð!Ø—	‘	ð ,ð ˜KÑ(¨&°©/¸6À*Ñ;MØ˜NÑ+¨V°LÑ-AÀ6È)ÑCTðVôWð
 —:’:Ø ‘N�IÜ˜C ˜s !¤C¨£M ?°"°T¸'±]À3ÀBÐ5GÐ4HÈÔQTÐU[Ð\eÑUfÓQgÐPhÐhjÐkÕlä˜C ˜s !¤C¨£M ?°"°T¸'±]À3ÀBÐ5GÐ4HÈÐPÔQð
 �K‰K�Mñ1	÷ð: 	‡J�J„LÜ	ˆNÔÜ	ˆE�)�˜J { mÐ
4Õ5ùòa 8ùò Dùò Søô, ò !Ü˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀIÈaÈSÐQÔRØ˜qÑ •ûð!ú÷/ð úsb   ÅN6Å1N6ÈN;ÈN;ÉPÉO É1A)PËBOÍ.PÏ PÏ	PÏ+O>Ï9PÏ>PÐPÐPÚ__main__)é   )#Ú__doc__Úosr)   r[   r   ÚsysrV   Úurllib.parser   r   r   Úconcurrent.futuresr   r   Úenvironr   r]   rE   r   rQ   rR   rZ   r`   ÚHEADERSÚrequestsÚSessionr   ÚheadersÚupdater#   r6   r>   rI   rx   Ú__name__© r7   r"   ú<module>rˆ      sË   ðñ Yç 7× 7× 7Ó 7ß (ß ?à
�*‰*�.‰.˜Ð&7Ó
8€ØK€	Ø €Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø€ð ð  Dð€ó Ø€x×ÑÓ€Ø ‡�× Ñ �GÔ ó	òò""ò6ò&P6ðf ˆzÒÙ…Fð r7   