Ë
    ¸¬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dœ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)uP   crawl_taihe_hp.py â€” å¤ªå’ŒåŽ¿ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€-å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶å®¡æ‰¹é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu:   å¤ªå’ŒåŽ¿ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€-å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶å®¡æ‰¹zhttps://www.taihe.gov.cniG  )Údaysz%Y-%m-%dé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36ÚXMLHttpRequest)z
User-AgentzX-Requested-Withc                 óÒ   — t        d«      D ].  }	 t        j                  | |¬«      }d|_        |j                  c S  y # t
        $ r}t        j                  d«       Y d }~ŒUd }~ww xY w)Né   ©Útimeoutzutf-8é   )ÚrangeÚsessÚgetÚencodingÚtextÚ	ExceptionÚtimeÚsleep)Úurlr   Ú_ÚrÚes        ú#/root/gov_crawler/crawl_taihe_hp.pyÚfetchr      s`   € Ü�1‹Xò ˆð	Ü—‘˜ g�Ó.ˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	Ü�J‰J�q�M‰Mûð	ús   �)>¾	A&ÁA!Á!A&c           	      óT  — g }t        j                  d| t         j                  «      }|s|S t        j                  d|j	                  d«      t         j                  «      D ]Å  }|j	                  d«      }t        j                  d|«      }t        j                  d|«      }|sŒC|sŒF|j                  t        j                  j                  t        |j	                  d«      «      |j	                  d«      j                  «       |j	                  d«      j                  «       dœ«       ŒÇ |S )z"Parse articles from AJAX list HTMLz<ul>(.*?)</ul>z<li>(.*?)</li>r   z%<a\s+href="([^"]+)"\s+title="([^"]*)"z<span>([^<]+)</span>é   )r   ÚtitleÚdate)ÚreÚsearchÚDOTALLÚfinditerÚgroupÚappendÚurllibÚparseÚurljoinÚBASEÚstrip)ÚhtmlÚitemsÚul_matchÚliÚcontentÚaÚspans          r   Úparse_list_htmlr4   $   sà   € à€EÜ�y‰yÐ*¨D´"·)±)Ó<€HÙØˆä�k‰kÐ+¨X¯^©^¸AÓ->ÄÇ	Á	ÓJò 	ˆØ—(‘(˜1“+ˆÜ�I‰IÐ>ÀÓHˆÜ�y‰yÐ0°'Ó:ˆÚ’Ø�L‰LÜ—|‘|×+Ñ+¬D°!·'±'¸!³*Ó=ØŸ™ ›×)Ñ)Ó+ØŸ
™
 1›×+Ñ+Ó-ñõ ð	ð €Ló    c                 óÆ  — t        j                  d| «      }|r|j                  d«      nd}|sHt        j                  d| t         j                  «      }|r|j                  d«      j	                  «       nd}d}t        j                  d| t         j                  «      }|r|j                  d«      j	                  «       }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 title and content from detail pagez/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   Ú z,<div class="text-center u-title">(.*?)</div>zU<div class="g-detailbox[^"]*"\s+id="zoom"[^>]*>(.*?)</div>\s*</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)r-   Útitle_mr    Útr1   Úms         r   Úparse_detailr=   8   s  € ä�i‰iÐJÈDÓQ€GÙ 'ˆG�M‰M˜!Ô¨R€EáÜ�I‰IÐEÀtÌRÏYÉYÓWˆÙ&'�—‘˜“
× Ñ Ô"¨Rˆà€GÜ
�	‰	ÐjÐlpÔrt×r{Ñr{Ó|€AÙØ—'‘'˜!“*×"Ñ"Ó$ˆô �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à�'—-‘-“/Ð!Ð!r5   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 insert datar   NzFETCH_ERR: r    é   r!   )Ú	site_namer    Úpage_urlÚpublish_dateÚ
source_urlr1   )r   r=   Ú	SITE_NAME)Úitemr-   Údtr1   Úfinal_titles        r   Úprocess_itemrH   P   s�   € ä��e‘Ó€DÙØ�{ 4¨¡=°°"Ð#5Ð"6Ð7Ð7Ð7ä˜tÓ$�K€BˆØÒ%˜˜W™€Kô ØØ˜‘KØ˜V™Ø˜5‘kØñð ðð r5   c                  óú  — t        dt        j                  «       j                  d«      › dt        › �«       t        d«      } | st        d«       y t        j                  d| «      }|rt        |j                  d«      «      nd}t        d	|› �«       t        | «      }t        d
|dz   «      D ]h  }t        d|› d�«      }|rt        |«      }|j                  |«       nt        d|› d�«       t        j                  t        j                   dd«      «       Œj t#        «       }g }|D ]/  }	|	d   |vsŒ|j%                  |	d   «       |j'                  |	«       Œ1 t        dt)        |«      › �«       |D �
cg c]  }
|
d   t*        k\  sŒ|
‘Œ }}
t        dt)        |«      › dt)        |«      t)        |«      z
  › d�«       t-        j.                  t0        d¬«      }|j3                  «       }t#        «       }|j5                  dt        f«      D ]  }|j%                  |d   «       Œ |D �
cg c]  }
|
d   |vsŒ|
‘Œ }}
t        dt)        |«      › �«       dx}}t7        t8        ¬«      5 }|D �	ci c]  }	|j;                  t<        |	«      |	“Œ }}	t?        tA        |«      d«      D ]Ø  \  }
}||   }	|jC                  «       \  }}|s|s0t        d|
› dt)        |«      › d|	d   d d › d |xs d!› �«       |dz  }ŒR	 |j5                  d"|d#   |d   |d$   |d%   |d&   |d'   f«       |jD                  r|dz  }d(t)        |d'   «      › d)�}nd*}t        d|
› dt)        |«      › d|	d   d d › d |› �«       |jI                  «        ŒÚ 	 d d d «       |jK                  «        t        d,|› d-|› �«       y c c}
w c c}
w c c}	w # tF        $ 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] z=https://www.taihe.gov.cn/OpennessTarget/350/29374/page_1.htmlz[ERROR] Failed to fetch page 1zpagecount="(\d+)"r   é'   zTotal pages: r   z7https://www.taihe.gov.cn/OpennessTarget/350/29374/page_z.htmlz  [WARN] Page z failedgš™™™™™É?gš™™™™™Ù?r   zTotal unique: r!   zWithin 3 years: z (filtered: ú)r?   r   z.SELECT page_url FROM gov_raw WHERE site_name=?r   zNew items: )Úmax_workersz  [ú/r    z... ÚFAILzšINSERT OR IGNORE INTO gov_raw
                    (site_name, title, page_url, publish_date, source_url, content)
                    VALUES (?,?,?,?,?,?)r@   rA   rB   rC   r1   zOK (zB)ÚDUPz	... ERR: z
=== Done === New: z
, Errors: )&Úprintr   ÚnowÚstrftimerD   r   r"   r#   Úintr&   r4   r   Úextendr   r   ÚrandomÚuniformÚsetÚaddr'   ÚlenÚCUTOFFÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚMAX_WORKERSÚsubmitrH   Ú	enumerater   ÚresultÚrowcountr   ÚcommitÚclose)r-   ÚpcÚtotal_pagesÚ	all_itemsÚpÚhr.   ÚseenÚuniquerE   ÚiÚrecentÚconnÚcÚexistingÚrowÚto_fetchÚ	new_countÚerror_countÚexecutorÚfuturesÚfuturerd   ÚerrÚstatusr   s                             r   Úmainr}   c   s$  € Ü	ˆAŒh�l‰l‹n×%Ñ% jÓ1Ð2°"´Y°KÐ
@ÔAô ÐPÓQ€DÙÜÐ.Ô/Øô 
�‰Ð'¨Ó	.€BÙ&(”#�b—h‘h˜q“kÔ"¨b€KÜ	ˆM˜+˜Ð
'Ô(ô   Ó%€IÜ�1�k A‘oÓ&ò -ˆÜÐKÈAÈ3ÈeÐTÓUˆÙÜ# AÓ&ˆEØ×Ñ˜UÕ#ä�N 1 # WÐ-Ô.Ü�
‰
”6—>‘> # sÓ+Õ,ð-ô ‹5€DØ€FØò  ˆØ�‰;˜dÒ"Ø�H‰H�T˜%‘[Ô!Ø�M‰M˜$Õð ô
 
ˆNœ3˜v›;˜-Ð
(Ô)ð  Ö7�A 1 V¡9´Ó#6ŠaÐ7€FÐ7Ü	ÐœS ›[˜M¨´c¸&³kÄ#ÀfÃ+Ñ6MÐ5NÈaÐ
PÔQô �?‰?œ7¨BÔ/€DØ�‰‹€AÜ‹u€HØ�y‰yÐIÌIÈ<ÓXò ˆØ�‰�S˜‘VÕðð "Ö>�a Q u¡X°XÒ%=’Ð>€HÐ>Ü	ˆKœ˜H›�Ð
'Ô(ð  Ð€I�ä	¬Ô	4ð ¸ØIQÖRÀ�8—?‘?¤<°Ó6¸Ñ<ÐRˆÐRÜ"¤<°Ó#8¸!Ó<ò 	‰IˆAˆvØ˜6‘?ˆDØ Ÿ-™-›/‰KˆF�Cá™&Ü˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀDÈÊÐPVÈÐXÔYØ˜qÑ �Øð!Ø—	‘	ð ,ð ˜KÑ(¨&°©/¸6À*Ñ;MØ˜NÑ+¨V°LÑ-AÀ6È)ÑCTðVôWð
 —:’:Ø ‘N�IØ#¤C¨¨yÑ(9Ó$:Ð#;¸2Ð>‘Fà"�FÜ˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀDÈÈÐQÔRð
 �K‰K�Mñ3	÷ð: 	‡J�J„LÜ	Ð   ¨:°k°]Ð
CÕDùò] 8ùò ?ùò Søô, ò !Ü˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀIÈaÈSÐQÔRØ˜qÑ •ûð!ú÷/ð úsb   Å2N!ÆN!È#N&È0N&É!O1É&N+ÊA)O1Ë.A6N0Í$O1Î+O1Î0	O.Î9+O)Ï$O1Ï)O.Ï.O1Ï1O:Ú__main__)é   )#Ú__doc__Úosr"   r\   r   ÚsysrV   Úurllib.parser(   r   r   Úconcurrent.futuresr   r   Úenvironr   r^   rD   r+   rR   rS   r[   ra   ÚHEADERSÚrequestsÚSessionr   ÚheadersÚupdater   r4   r=   rH   r}   Ú__name__© r5   r   ú<module>r�      sÊ   ðñ Wç 7× 7× 7Ó 7ß (ß ?à
�*‰*�.‰.˜Ð&7Ó
8€ØH€	Ø!€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø€ð DØ(ñ€ó
 Ø€x×ÑÓ€Ø ‡�× Ñ �GÔ óòò("ò0ò&REðj ˆzÒÙ…Fð r5   