Ë
    ¸¬uju  ã                   ó´  — 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 d dlmZmZ dZ	dZ
dZ e j                  dd«      Zd	Zd
e
dz   dœZ ej                   «        ed¬«      z
  j#                  d«      Zd„ Zd„ Zdd„Zd„ Zdd„Zedk(  rRdej2                  v ZdZej2                  dd D ]%  Zej;                  «       r
 ee«      Z nedk(  sŒ#dZ n  eee¬«       yy)é    N)Úurljoin)ÚdatetimeÚ	timedeltau(   æ–°ç–†ç”Ÿæ€�çŽ¯å¢ƒåŽ…-é¡¹ç›®å�—ç�†å…¬ç¤ºzhttps://sthjt.xinjiang.gov.cnz/xjepd/hjyxpjsl/common_list1Ú	SEARCH_DBz/root/search.dbé
   z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z"/xjepd/hjyxpjsl/common_list1.shtml)z
User-AgentÚRefereriG  )Údaysz%Y-%m-%dc                 óÔ   — |dk(  rt         › t        › d�nt         › t        › d|› d�}	 | j                  |t        d¬«      }|j                  dk7  ryd|_        |j                  S #  Y yxY w)	zFetch a list page.é   z.shtmlÚ_é   ©ÚheadersÚtimeoutéÈ   Núutf-8)ÚBASEÚ	LIST_PATHÚgetÚHEADERSÚstatus_codeÚencodingÚtext)ÚsessionÚpageÚurlÚrs       ú#/root/gov_crawler/crawl_xj_sthjt.pyÚ
fetch_listr      sn   € à(,°ª	ŒTˆF”9�+˜VÑ
$¼$¸Ä	¸{È!ÈDÈ6ÐQWÐ7X€CðØ�K‰K˜¤W°bˆKÓ9ˆØ�=‰=˜CÒØØˆŒ
Ø�v‰vˆøðÙús   ¨'A# ÁA# Á#A'c                 óˆ  — g }t        j                  dt         j                  «      }|j                  | «      D ]‡  }|j	                  d«      j                  «       }|j	                  d«      }|j                  d«      st        t        |«      }|j	                  d«      j                  «       }|j                  |||dœ«       Œ‰ |S )z˜Extract article items from list HTML.
    Format: <li><span class="cwrq"></span><span>2026-06-10</span><a href="..." target="_blank">title</a></li>
    zo<li>.*?<span>(?:<span[^>]*>)?(\d{4}-\d{1,2}-\d{1,2})(?:</span>)?</span>\s*<a href=\"([^\"]+)\"[^>]*>([^<]+)</a>r   é   Úhttpé   )r   ÚtitleÚdate)
ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithr   r   Úappend)ÚhtmlÚitemsÚpatternÚmÚdate_strr   r$   s          r   Ú
parse_listr3   )   sª   € ð €EÜ�j‰jØzÜ
�	‰	ó€Gð ×Ñ˜dÓ#ò EˆØ—7‘7˜1“:×#Ñ#Ó%ˆØ�g‰g�a‹jˆØ�~‰~˜fÔ%Üœ$ Ó$ˆCØ—‘˜“
× Ñ Ó"ˆØ�‰˜S¨5¸(ÑCÕDðEð €Ló    c                 óÜ  — d}t        j                  d| t         j                  «      }|r4t        j                  dd|j	                  d«      «      j                  «       }|s7t        j                  d| «      }|r|j	                  d«      j                  «       }|s|}d}t        j                  d| «      }|r|j	                  d«      }|s)t        j                  d| «      }|r|j	                  d«      }d}t        j                  d| t         j                  «      }|r|j	                  d«      j                  «       }|r®t        j                  d	d|t         j                  t         j                  z  ¬
«      }t        j                  dd|t         j                  t         j                  z  ¬
«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       }|||fS )z.Extract title, date, content from detail page.Ú zB<div[^>]*class="detail detail2-detail"[^>]*>.*?<h1[^>]*>(.*?)</h1>z<[^>]+>r   z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"z=<meta[^>]*name="PubDate"[^>]*content="(\d{4}-\d{1,2}-\d{1,2})u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})z-<div[^>]*id="NewsContent"[^>]*>(.*?)</div>\s*z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z\s*style="[^"]*"z
<!--.*?-->)r&   Úsearchr(   Úsubr*   r+   ÚI)r.   Úfallback_titler$   r1   r2   ÚcontentÚcms          r   Úparse_detailr>   <   s�  € ð €EÜ
�	‰	ÐWÐY]Ô_a×_hÑ_hÓi€AÙÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÙÜ�I‰IÐLÈdÓSˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEÙØˆð €HÜ
�	‰	ÐRÐTXÓY€AÙØ—7‘7˜1“:ˆÙÜ�I‰IÐEÀtÓLˆÙØ—w‘w˜q“zˆHð €GÜ	�‰ÐCÀTÌ2Ï9É9Ó	U€BÙ	Ø—(‘(˜1“+×#Ñ#Ó%ˆáÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔVX×VZÑVZÑJZÔ[ˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔTV×TXÑTXÑHXÔYˆÜ—&‘&Ð,¨b°'Ó:ˆÜ—&‘&˜¨¨GÓ4ˆØ—-‘-“/ˆà�(˜GÐ#Ð#r4   c                 óè   — d}d}|D ]Z  }	 | j                  d|d   d d |d   |d   |d   |d   |d	   |d
   |d   |d   |d   f
«       | j                  dkD  r|dz  }n|dz  }Œ\ ||fS #  |dz  }Y ŒjxY w)Nr   z»INSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date, summary, content, status, category, tags)
                VALUES (?,?,?,?,?,?,?,?,?,?)Ú	site_namer   Ú
source_urlÚpage_urlr$   Úpublish_dateÚsummaryr<   ÚstatusÚcategoryÚtagsr   )ÚexecuteÚtotal_changes)ÚdbÚrecordsÚinsertedÚskippedÚitems        r   Ú
push_to_dbrO   d   sÊ   € Ø€HØ€GØò ˆð	Ø�J‰Jð0ð ˜Ñ% d sÐ+Ø˜Ñ&Ø˜Ñ$Ø˜‘MØ˜Ñ(Ø˜‘OØ˜‘OØ˜‘NØ˜Ñ$Ø˜‘Lðô	ð" ×Ñ !Ò#Ø˜A‘‘à˜1‘�øð-ð2 �WÐÐøð	Ø�q‰LŠGús   ‹AA(Á(A1c                 ó  ‡— | €t         } t        j                  t        «      }|j	                  d«       t        d„ |j	                  dt        f«      j                  «       D «       «      Št        dt        ‰«      › �«       t        j                  «       }g }t        d| dz   «      D ]À  }t        d|› d�d¬	«       t        ||«      }|st        d
«        n”t        |«      }|st        d«        nzt        t        |«      › d�«       |rNt        ˆfd„|D «       «      rt        d«        n@|D �cg c]  }|d   ‰vsŒ|‘Œ }	}|	s n%|j!                  |«       Œ°|j!                  |«       ŒÂ |st        d«       |j#                  «        y |D �cg c]  }|d   t$        k\  s|d   rŒ|‘Œ }}t        dt        |«      › d�«       g }
t'        |«      D ]¸  \  }}	 |j)                  |d   t*        d¬«      }d|_        |j.                  }t1        ||d   «      \  }}}|
j3                  t        |d   d d |d   |xs |d   d d |xs |d   d d |xs |d   d d |ddddœ
«       |dz   dz  dk(  sŒ›t        d|dz   › d t        |«      › d!�«       Œº t5        ||
«      \  }}|j7                  «        |j	                  d"t        f«       |j7                  «        |j#                  «        t        d#|› d$|› �«       y c c}w c c}w #  Y �Œ2xY w)%NzPRAGMA journal_mode=WALc              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   N© )Ú.0r   s     r   ú	<genexpr>zrun.<locals>.<genexpr>Š   s   è ø€ ò àð 	
ˆ!�ñùs   ‚z.SELECT page_url FROM gov_raw WHERE site_name=?z  Known in DB: r   z  Page z...ú )Úendz404/FAILÚemptyz itemsc              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­w)r   NrR   )rS   rN   Úknowns     €r   rT   zrun.<locals>.<genexpr>¢   s   øè ø€ Ò:¨D�4˜‘; %Ô'Ñ:ùs   ƒz    All known, stoppingr   z  No items to processr%   z
  Fetching z details...r   r   r   r$   iô  r   Úactiver6   )
r@   rA   rB   r$   rC   rD   r<   rE   rF   rG   é   r   z    [ú/ú]zÔINSERT INTO gov_search(rowid,title,site_name,summary)
        SELECT r.id, r.title, r.site_name, r.summary
        FROM gov_raw r
        WHERE r.id NOT IN (SELECT rowid FROM gov_search)
        AND r.site_name=?z  Done: new=z, skip=)Ú	MAX_PAGESÚsqlite3Úconnectr   rH   ÚsetÚ	SITE_NAMEÚfetchallÚprintÚlenÚrequestsÚSessionÚranger   r3   ÚallÚextendÚcloseÚCUTOFFÚ	enumerater   r   r   r   r>   r-   rO   Úcommit)Ú	max_pagesÚincrementalrJ   r   Ú	all_itemsr   r.   r/   ÚiÚnewÚresultsrN   r   r$   r2   r<   rL   rM   rY   s                     @r   Úrunru   ƒ   s  ø€ ØÐÜˆ	ä	�‰œÓ	#€BØ‡J�JÐ(Ô)äñ à—‘Ø<¼y¸ló
ç
‰(‹*ô	ó €Eô 
ˆOœC ›J˜<Ð
(Ô)ä×ÑÓ €GØ€Iä�a˜ Q™Ó'ò $ˆÜ�˜�v˜SÐ! sÕ+Ü˜' 4Ó(ˆÙÜ�*ÔÙÜ˜4Ó ˆÙÜ�'ŒNÙÜ”�U“�˜FÐ#Ô$áÜÓ:°EÔ:Ô:ÜÐ/Ô1ÙØ#Ö=˜ q¨¡x°uÒ'<’1Ð=ˆCÐ=ÙÙØ×Ñ˜UÕ#à×Ñ˜UÕ#ð+$ñ. ÜÐ%Ô&Ø
�‰Œ
Øð &ÖN�q¨¨6©´fÒ)<ÀAÀfÃI’ÐN€IÐNÜ	ˆMœ#˜i›.Ð)¨Ð
5Ô6à€GÜ˜YÓ'ò 3‰ˆˆ4ð	Ø—‘˜D ™K´À"�ÓEˆAØ ˆAŒJØ—6‘6ˆDô $0°°d¸7±mÓ#DÑ ˆˆx˜Ø�‰ä&Ø" 5™k¨$¨3Ð/Ø  ™KØÒ0 4¨¡=°$°3Ð7Ø!)Ò!9¨T°&©\¸3¸BÐ ?Ø!Ò2 T¨'¡]°D°SÐ9Ø"Ø"ØØñô	
ð �‰E�R‰<˜1ÓÜ�E˜!˜A™#˜˜a¤ I£Ð/¨qÐ1Õ2ð/3ô2 # 2 wÓ/Ñ€HˆgØ‡I�I„Kà‡J�Jð	ô
 
ˆôð ‡I�I„KØ‡H�H„Jä	ˆL˜˜
 '¨'¨Ð
3Õ4ùòq >ùò Oøð	Úús$   Ä,K/Ä9K/Æ
K4Æ!K4Ç.K9Ë9K>Ú__main__z--incrementalr   z--test)ro   rp   )r6   )NF)ÚosÚsysr&   r_   rf   Úurllib.parser   r   r   rb   r   r   Úgetenvr   r^   r   ÚnowÚstrftimerl   r   r3   r>   rO   ru   Ú__name__Úargvrp   ÚmpÚaÚisdigitÚintrR   r4   r   ú<module>rƒ      s  ðã 	ð÷ Ó Û Ý  ß (à6€	Ø&€Ø*€	ØˆB�I‰I�kÐ#4Ó5€	Ø€	ð QØÐ:Ñ:ñ€ð
 ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€ò
òó&%$òPó>Z5ðz ˆzÒØ! S§X¡XÐ-€KØ	€BØ�X‰X�a�bˆ\ò ˆØ�9‰9Œ;Ù�Q“ˆBÙØ�‹=ØˆBÙðñ �" +Ö.ð r4   