Ë
    ¸¬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!d„ Z"e#dk(  r e"«        yy)uG   crawl_xiapu_ycz_tzgg.py â€” éœžæµ¦åŽ¿ç‰™åŸŽé•‡äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šé    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu+   éœžæµ¦åŽ¿ç‰™åŸŽé•‡äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘ŠzJhttps://www.xiapu.gov.cn/zwgk/gkzl/bmzfxxgk/xzjdbsc/yczzf/gkml_25199/tzgg/iG  )Ú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                 óè   — | xs t         }t        d«      D ]/  }	 t        j                  |dd¬«      }d|_        |j
                  c S  y# t        $ r}t        j                  d«       Y d}~ŒVd}~ww xY w)zFetch a pageé   é   F)ÚtimeoutÚverifyúutf-8é   N)	ÚBASE_URLÚrangeÚsessÚgetÚencodingÚtextÚ	ExceptionÚtimeÚsleep)ÚurlÚtargetÚ_ÚrÚes        ú)/root/gov_crawler/crawl_xiapu_ycz_tzgg.pyÚ
fetch_pager       sk   € àŠ_”H€FÜ�1‹Xò ˆð	Ü—‘˜¨°E�Ó:ˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	Ü�J‰J�q�M‰Mûð	ús   š*A	Á		A1ÁA,Á,A1c                 ó  — g }t        j                  d| «      D ]k  }|j                  d«      }|j                  d«      j                  «       }t        j
                  j                  t        |«      }|j                  ||ddœ«       Œm |S )z$Parse article items from static HTMLz1href="(\./\d+/t\d+_\d+\.htm)"[^>]*title="([^"]*)"r   é   Ú )r   ÚtitleÚdate)	ÚreÚfinditerÚgroupÚstripÚurllibÚparseÚurljoinr   Úappend)ÚhtmlÚitemsÚmÚurl_pathr$   Úfull_urls         r   Úparse_static_itemsr3   %   s~   € à€Eä�[‰[ÐMÈtÓTò ˆØ—7‘7˜1“:ˆØ—‘˜“
× Ñ Ó"ˆä—<‘<×'Ñ'¬°(Ó;ˆð 	�‰ØØØñ
õ 	ðð €Ló    c                 óÞ   — t        d«      D ]4  }	 t        j                  | t        dd¬«      }d|_        |j
                  c S  y# t        $ r}t        j                  d«       Y d}~Œ[d}~ww xY w)zFetch detail pager   r   F)Úheadersr   r   r   r   N)	r   Úrequestsr   ÚHEADERSr   r   r   r   r   )r   r   Úrespr   s       r   Úfetch_detailr:   8   sc   € ä�1‹Xò ˆð	Ü—<‘< ¬W¸bÈÔOˆDØ#ˆDŒMØ—9‘9Òð	ð øô ò 	Ü�J‰J�q�M‰Mûð	ús   �/AÁ	A,ÁA'Á'A,c                 ó$  — d}d}t        j                  d| «      }|r|j                  d«      j                  «       }|sFt        j                  d| t         j                  «      }|r|j                  d«      j                  «       }t        j                  d| «      }|r"|j                  d«      j                  «       dd }|s)t        j                  d| «      }|r|j                  d«      }d}t        j                  d	| t         j                  «      }|r|j                  d«      j                  «       }t        j
                  d
d|t         j                  ¬«      }t        j
                  dd|t         j                  ¬«      }|||j                  «       fS )z1Extract title, date, and content from detail pager#   z-<meta name="ArticleTitle"\s+content="([^"]+)"r   z1<div class="article_title[^"]*">\s*(.*?)\s*</div>z(<meta name="PubDate"\s+content="([^"]+)"Né
   u"   å�‘å¸ƒæ—¶é—´ï¼š(\d{4}-\d{2}-\d{2})z*<div class=TRS_Editor>(.*?)</div>\s*</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)r&   Úsearchr(   r)   ÚDOTALLÚsub)r.   r$   Úpub_dater0   Úcontents        r   Úextract_detailrC   D   sG  € à€EØ€Hô 	�	‰	ÐBÀDÓI€AÙØ—‘˜“
× Ñ Ó"ˆñ Ü�I‰IÐJÈDÔRT×R[ÑR[Ó\ˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEô 	�	‰	Ð=¸tÓD€AÙØ—7‘7˜1“:×#Ñ#Ó% c rÐ*ˆñ Ü�I‰IÐ;¸TÓBˆÙØ—w‘w˜q“zˆHð €GÜ
�	‰	Ð?ÀÄrÇyÁyÓQ€AÙØ—'‘'˜!“*×"Ñ"Ó$ˆô �f‰fÐ1°2°wÄbÇiÁiÔP€GÜ�f‰fÐ/°°WÄBÇIÁIÔN€Gà�(˜GŸM™M›OÐ+Ð+r4   c                 óˆ   — t        | d   «      }|syt        |«      \  }}}t        |xs | d   | d   |xs | d   | d   |dœdfS )zProcess one articler   )NÚ	FETCH_ERRr$   r%   )Ú	site_namer$   Úpage_urlÚpublish_dateÚ
source_urlrB   N)r:   rC   Ú	SITE_NAME)Úitemr.   r$   rA   rB   s        r   Úprocess_itemrL   l   si   € ä˜˜U™Ó$€DÙØ ä-¨dÓ3Ñ€Eˆ8�Wô ØÒ'˜$˜w™-Ø˜‘KØ Ò0 D¨¡LØ˜5‘kØñð ðð r4   c                  ó”  — t        dt        j                  «       j                  d«      › dt        › �«       t        «       } | st        d«       y t        | «      }t        dt        |«      › �«       t        j                  d| «      }t        |«      D ]  \  }}|t        |«      k  sŒ||   |d<   Œ |D �cg c]  }|d   t        k\  sŒ|‘Œ }}t        dt        |«      › d	t        |«      t        |«      z
  › d
�«       t        j                  t        d¬«      }|j                  «       }t!        d„ |j#                  dt        f«      D «       «      }|D �cg c]  }|d   |vsŒ|‘Œ }	}t        dt        |	«      › �«       dx}
}t%        t&        ¬«      5 }|	D �ci c]  }|j)                  t*        |«      |“Œ }}t        t-        |«      d«      D ]õ  \  }}||   }|j/                  «       \  }}|s|s0t        d|› dt        |	«      › d|d   d d › d|xs d› �«       |dz  }ŒR	 |j#                  d|d   |d   |d   |d   |d   |d   f«       |j0                  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!�«       |j5                  «        Œ÷ 	 d d d «       |j7                  «        t        d#|
› d$|› �«       y c c}w c c}w c c}w # t2        $ 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[ERROR] Failed to fetch pagezStatic items: z <span>(\d{4}-\d{2}-\d{2})</span>r%   zWithin 3 years: z (filtered: ú)é   )r   c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   N© )Ú.0r   s     r   ú	<genexpr>zmain.<locals>.<genexpr>•   s   è ø€ Òk˜A�1�Q•4Ñkùs   ‚z.SELECT page_url FROM gov_raw WHERE site_name=?r   zNew items: r   )Úmax_workersr   z  [ú/r$   z... ÚFAILzšINSERT OR IGNORE INTO gov_raw
                    (site_name, title, page_url, publish_date, source_url, content)
                    VALUES (?,?,?,?,?,?)rF   rG   rH   rI   rB   z... OK (zB)z... DUPz	... ERR: z
=== Done === New: z
, Errors: )Úprintr   ÚnowÚstrftimerJ   r    r3   Úlenr&   ÚfindallÚ	enumerateÚCUTOFFÚsqlite3ÚconnectÚDB_PATHÚcursorÚsetÚexecuter   ÚMAX_WORKERSÚsubmitrL   r   ÚresultÚrowcountr   ÚcommitÚclose)r.   r/   Ú
date_spansÚirK   ÚrecentÚconnÚcÚexistingÚto_fetchÚnewÚerrÚexecutorÚfuturesÚfuturerg   Úerrorr   s                     r   Úmainrx   ~   st  € Ü	ˆAŒh�l‰l‹n×%Ñ% jÓ1Ð2°"´Y°KÐ
@ÔAä‹<€DÙÜÐ,Ô-Øä˜tÓ$€EÜ	ˆNœ3˜u›:˜,Ð
'Ô(ô —‘Ð?ÀÓF€JÜ˜UÓ#ò )‰ˆˆ4ØŒs�:‹ÓØ% a™=ˆD�ŠLð)ð Ö6�A ! F¡)¬vÓ"5ŠaÐ6€FÐ6Ü	ÐœS ›[˜M¨´c¸%³jÄÀVÃÑ6LÐ5MÈQÐ
OÔPä�?‰?œ7¨BÔ/€DØ�‰‹€AÜÑk §¡Ð+[Ô^gÐ]iÓ!jÔkÓk€Hà!Ö>�a Q u¡X°XÒ%=’Ð>€HÐ>Ü	ˆKœ˜H›�Ð
'Ô(à€M€Cˆ#Ü	¬Ô	4ð ¸ØIQÖRÀ�8—?‘?¤<°Ó6¸Ñ<ÐRˆÐRÜ"¤<°Ó#8¸!Ó<ò 	‰IˆAˆvØ˜6‘?ˆDØ"ŸM™M›O‰MˆF�EÙ™FÜ˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀDÈÊÐRXÐHYÐZÔ[Ø�q‘�ØðØ—	‘	ð ,ð ˜{Ñ+¨V°G©_¸fÀZÑ>PØ˜~Ñ.°°|Ñ0DÀfÈYÑFWð.YôZð
 —:’:Ø˜1‘H�CÜ˜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ñ+	÷ð2 	‡J�J„LÜ	Ð    Z°¨uÐ
5Õ6ùòK 7ùò ?ùò
 Søô& ò Ü˜˜A˜3˜a¤ H£˜¨b°°g±¸sÀÐ1CÐ0DÀIÈaÈSÐQÔRØ�q‘•ûðú÷)ð úsb   Â5K.ÃK.ÅK3Å K3ÆL>ÆK8Æ4A)L>ÈBK=Ê1L>Ë8L>Ë=	L;Ì+L6Ì1L>Ì6L;Ì;L>Ì>MÚ__main__)N)$Ú__doc__Úosr&   r_   r   ÚsysÚrandomÚurllib.parser*   r   r   Úconcurrent.futuresr   r   Úenvironr   ra   rJ   r   rY   rZ   r^   re   r8   r7   ÚSessionr   r6   Úupdater    r3   r:   rC   rL   rx   Ú__name__rR   r4   r   ú<module>r„      sÐ   ðñ Nç 7× 7× 7Ó 7ß (ß ?à
�*‰*�.‰.˜Ð&7Ó
8€Ø9€	ØW€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø€ð ð  Dð€ó Ø€x×ÑÓ€Ø ‡�× Ñ �GÔ ó
òò&	ò%,òPò$77ðt ˆzÒÙ…Fð r4   