Ë
    ,„j:  ã                   óV  — 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 ddlmZ dZdZe› d�Zd	Zd
Z ej&                  «        e	d¬«      z
  j)                  d«      Zej,                  j/                  dd«      ZddiZd„ Zd„ Zd!d„Zd„ Zd"d„Zd„ Zd#d„Z e!dk(  rƒejD                  dd Z#dZ$dZ%ddjM                  e#«      v r7 e' ejP                  ddjM                  e#«      «      jS                  d«      «      Z$de#v re#e#jU                  d«      dz      Z% e e$e%¬ «       yy)$u?  
æ³¸å·žå¸‚é¾™é©¬æ½­åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š (longmatan.gov.cn/xw/tzgg)
åˆ—è¡¨: /xw/tzgg (P1), /xw/tzgg_{N} (PN, å…±82é¡µ)
åˆ—è¡¨é¡¹: ul.infoList li a(title="æ ‡é¢˜ï¼šxxx...") + span.date
è¯¦æƒ…: div#content (éœ€æ¸…é�¢åŒ…å±‘/æ ‡é¢˜/å­—å�·æ�¡)
ç”¨æ³•: python3 crawl_longmatan_tzgg.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu.   æ³¸å·žå¸‚é¾™é©¬æ½­åŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šzhttps://www.longmatan.gov.cnz/xw/tzggzwww.longmatan.gov.cnu   å››å·�iG  )Údaysz%Y-%m-%dÚDB_PATHz/root/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú)/root/gov_crawler/crawl_longmatan_tzgg.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 óâ   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz!&nbsp;|&#160;|\u200b|\ufeff|\r|\nÚ u	   æ ‡é¢˜ï¼šz\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      s]   € Ü
�‰Ð3°R¸º¸bÓA€AÜ
�‰ˆ|˜R Ó#€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 ó&  — t        d«      D ]3  }	 t        j                  | t        |¬«      }d|_        |j
                  c S  y# t        $ rD}|dk(  rt        d| dd  › d|› �«       Y d }~ yt        j                  d	|d
z   z  «       Y d }~Œd }~ww xY w)Né   )ÚheadersÚtimeoutúutf-8é   z
fetch ERR iÎÿÿÿú: r   é   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   ÚtimeÚsleep)Úurlr   ÚattemptÚrÚes        r   Úfetchr0   "   s�   € Ü˜“8ò 	*ˆð	*Ü—‘˜S¬'¸7ÔCˆAØ ˆAŒJØ—6‘6ŠMð		*ð øô ò 	*Ø˜!Š|Ü�j  S T  ¨2¨a¨SÐ1Ô2ÝÜ�J‰J�q˜G a™KÑ(×)Ñ)ûð		*ús   �.AÁ	BÁBÁ+BÂBc                 óF  — | dk(  rt         n
t         › d| › �}t        |«      }|sg S g }t        |d«      }|j                  dd¬«      }|sg S |j	                  d«      D ]Â  }|j                  dd	¬
«      }|sŒ|j                  dd«      }|j                  dd«      xs |j                  d	¬«      }	t        |	«      }	|j                  dd¬«      }
|
r|
j                  d	¬«      nd}|j                  d«      st        t        |«      }|	sŒ©d|v sŒ®|j                  |	||dœ«       ŒÄ |S )Nr"   Ú_úhtml.parserÚulÚinfoList)Úclass_ÚliÚaT©Úhrefr:   r   Útitle©r   ÚspanÚdateÚhttpz/xw/tzgg/content_)r;   r,   r>   )ÚLIST_URLr0   r   ÚfindÚfind_allr%   Úget_textr   Ú
startswithr   ÚBASE_URLÚappend)Úpager,   ÚhtmlÚitemsÚsoupr4   r7   r8   r:   r;   Úspr>   s               r   Ú
fetch_listrL   /   s%  € Ø˜a’i�(¬ z°°4°&Ð%9€CÜ�‹:€DÙØˆ	Ø€EÜ˜˜}Ó-€DØ	�‰�4 
ˆÓ	+€BÙØˆ	Ø�k‰k˜$Óò FˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�u‰u�V˜RÓ ˆØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆÜ˜EÓ"ˆØ�W‰W�V FˆWÓ+ˆÙ*,ˆr�{‰{ ˆ{Ô&°"ˆØ�‰˜vÔ&Üœ8 TÓ*ˆDÚÐ(¨DÒ0Ø�L‰L 5°¸tÑDÕEðFð €Lr   c                 ó  — | syt        j                  dd| t         j                  ¬«      } t        | d«      }|j	                  t        j
                  d«      ¬«      D ](  }|j                  g d¢«      }|sŒ|j                  «        Œ* |j	                  dt        j
                  d	«      i¬
«      D ]  }|j                  «        Œ |j	                  dd¬«      D ]V  }|j                  dd«      }|j                  d¬«      xs d}t        |xs t        |«      }|j                  d|› d|› d�«       ŒX |j	                  g d¢«      D ]  }|j                  «        Œ g }	|j	                  ddg«      D ]y  }
|
j                  dk(  r|	j                  t!        |
«      «       Œ-|
j                  dk(  sŒ=|
j                  d«      rŒO|
j                  dd¬«      }|sŒe|	j                  d|› d�«       Œ{ |	rdj#                  |	«      S | j%                  «       S )Nr   u   æ‚¨çš„ä½�ç½®ï¼š.*?è¯¦ç»†å†…å®¹)Úflagsr3   u4   æ‚¨çš„ä½�ç½®ï¼š|ã€�å­—ä½“ï¼š|å­—å�·ï¼š|ç‚¹èµž|æ”¶è—�)Ústring)ÚpÚdivr=   r7   ÚtdÚclasszposition|crumb|daohang)Úattrsr8   Tr9   r:   r<   u   é™„ä»¶z<p><a href="z">z</a></p>)r=   ÚbÚstrongÚfontÚemÚiÚuÚsÚtablerP   )Ú	separatorr   z<p>z</p>z

)r   r   ÚSr   rB   ÚcompileÚfind_parentÚ	decomposer%   rC   r   rE   Úreplace_withÚunwrapÚnamerF   ÚstrÚjoinr   )Úcontent_htmlÚpage_urlrJ   ÚtagrP   Úa_tagr:   r(   Úfull_urlÚpartsÚelr   s               r   Úextract_clean_textrn   H   sÕ  € ÙØä—6‘6Ð;¸RÀÔUW×UYÑUYÔZ€LÜ˜ }Ó5€Dà�}‰}¤B§J¡JÐ/fÓ$gˆ}Óhò ˆØ�O‰OÒ<Ó=ˆÚØ�K‰K�Mðð �}‰} G¬R¯Z©ZÐ8QÓ-RÐ#Sˆ}ÓTò ˆØ�‰�ðà—‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜ˜8Ò/¤x°Ó6ˆØ×Ñ˜\¨(¨°2°d°V¸8ÐDÕEð	Fð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜s 1 # T˜]Õ+ð,ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c                 ó’  — t        | «      }|sddddœS t        |d«      }ddddœ}|j                  d«      }|r5t        j                  dd|j                  d¬«      «      }t        |«      |d<   t        j                  d|«      }|r|j                  d	«      |d
<   |j                  dd¬«      }|rt        t        |«      | «      |d<   |S )Nr   )r;   Úpublish_dateÚcontentr3   r;   u?   _\w*(é€šçŸ¥å…¬å‘Š|æ–°é—»|æ³¸å·žå¸‚é¾™é©¬æ½­åŒºäººæ°‘æ”¿åºœ)\w*$Tr<   u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r"   rp   rQ   rq   )Úid)r0   r   rA   r   r   rC   r   ÚsearchÚgrouprn   re   )r,   rH   rJ   ÚresultÚttagr   ÚmÚcontent_divs           r   Úparse_detailry   f   sË   € Ü�‹:€DÙØ¨R¸BÑ?Ð?Ü˜˜}Ó-€DØ¨2¸"Ñ=€FØ�9‰9�WÓ€DÙÜ�F‰FÐUÐWYÐ[_×[hÑ[hÐosÐ[hÓ[tÓuˆÜ% a›.ˆˆw‰Ü
�	‰	Ð=¸tÓD€AÙØ!"§¡¨£ˆˆ~ÑØ—)‘)˜E i�)Ó0€KÙÜ.¬s°;Ó/?ÀÓEˆˆyÑØ€Mr   é   c                 ó¨  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]Š  }t	        |«      }d}|D ]4  }|d   |vsŒ|j                  |d   «       |j                  |«       |dz  }Œ6 t        d|› dt        |«      › d|› d	t        |«      › �«       |s nt        j                  d
«       ŒŒ g }t        |d«      D ]ž  \  }	}t        |d   «      }
|
d   s|d   r|
d   xs |d   t        k  rŒ2|j                  |
d   xs |d   |d   |
d   xs |d   |
d   t        ddœ«       |	dz  dk(  rt        d|	› dt        |«      › �«       t        j                  d«       Œ  |rct        |dd¬«      5 }|D ]+  }|j                  t        j                   |d¬«      dz   «       Œ- 	 d d d «       t        dt        |«      › d|› �«       y t#        j$                  t&        «      }|j)                  d«       |j+                  «       }dx}}|D ]W  }	 |j)                  d|d   |d    |d    |d   |d   |d   |d   xs d!d d" |d#   d$f	«       |j,                  dkD  r|dz  }n|dz  }ŒY |j1                  «        |j3                  «        t        d&|› d'|› d(�«       y # 1 sw Y   ŒñxY w# t.        $ r}t        d%|› �«       |dz  }Y d }~Œºd }~ww xY w))NzCrawl pages=z cutoff=r"   r   r,   ÚPr    z items (z new), total g333333ã?rp   r>   r;   rq   u   é€šçŸ¥å…¬å‘Š)r;   rh   rp   rq   Ú	site_nameÚcolumné
   z  ú/g333333Ó?Úwr   )r'   F)Úensure_asciiú
zJSONL: z
 items -> zPRAGMA busy_timeout=10000z˜INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name) VALUES (?,?,?,?,?,?,?,?,?)r}   rh   r   iô  r~   zcrawl_longmatan_tzgg.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFÚsetr#   rL   ÚaddrF   Úlenr*   r+   Ú	enumeratery   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr   ÚexecuteÚcursorÚrowcountr)   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenrP   rI   ÚnewÚitÚenrichedÚidxÚdÚfÚitemÚconnÚcÚstoredÚskippedr/   s                     r   Úcrawlr£   x   s'  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆÜ˜1“ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ðð €HÜ˜Y¨Ó*ò ‰ˆˆRÜ˜˜E™Ó#ˆØˆnÒ  F¢°!°NÑ2CÒ2QÀrÈ&ÁzÔU[Ò1[ØØ�‰Ø�w‘ZÒ. 2 g¡;Ø˜5™	Ø˜nÑ-Ò;°°F±Ø˜‘|Ü"Ø$ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ðñ  Ü�(˜C¨'Ô2ð 	E°aØ ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜(“m�_ J¨x¨jÐ9Ô:Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@Yð[ô	\ð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3÷9	Eð 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús%   Å=1JÈAJ+ÊJ(Ê+	KÊ4KËKÚ__main__r"   z--pages=r   z--pages=(\d+)z--json)r”   r•   )é   )N)rz   N)+Ú__doc__r   ÚsysÚosr‹   r*   r�   r$   r   r   Úbs4r   Úurllib.parser   r   rE   r@   ÚDOMAINÚGROUPÚnowÚstrftimer„   Úenvironr%   r   r&   r   r   r0   rL   rn   ry   r£   Ú__name__ÚargvÚargsr”   r•   rf   Úintrs   rt   Úindex© r   r   ú<module>r¶      s;  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à<€	Ø)€ØˆZ�xÐ €Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òóòó2Aò<ó$?4ðB ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	� Ö)ð r   