Ë
    V~jò  ã                   ó\  — 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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ad„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d#d„Z#e$dk(  rƒejJ                  dd Z&dZ'dZ(ddjS                  e&«      v r7 e* ejV                  d djS                  e&«      «      jY                  d«      «      Z'd!e&v re&e&j[                  d!«      dz      Z( e#e'e(¬"«       yy)$u<  
éƒŽæºªåŽ¿ - åŸºå±‚æ”¿åŠ¡å…¬å¼€çŽ¯è¯„å®¡æ‰¹ (ahlx.gov.cn/XxgkContent/showList/1/4953)
CMS: éƒŽæºªå®šåˆ¶ (Jczwgk/show/{id}.html)
âš ï¸� éœ€ token_verified cookie ç»•è¿‡ JS éªŒè¯�
åˆ—è¡¨: a[title] /Jczwgk/show/
åˆ†é¡µ: page_N.html
è¯¦æƒ…: å®¹å™¨ .zoom
ç”¨æ³•: python3 crawl_ahlx_4953.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu"   éƒŽæºªåŽ¿-åŸºå±‚æ”¿åŠ¡å…¬å¼€çŽ¯è¯„zhttp://www.ahlx.gov.cnz>http://www.ahlx.gov.cn/XxgkContent/showList/1/4953/page_1.htmlúwww.ahlx.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_ahlx_4953.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó´   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sK   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                  ó
  — t         €it        j                  «       } | j                  j	                  t
        «       	 | j                  ddd¬«       | j                  j                  dddd¬	«       | a t         S # t        $ r Y Œ2w xY w)
Nzhttp://www.ahlx.gov.cn/é   F©ÚtimeoutÚverifyÚtoken_verifiedÚtruer   ú/)ÚdomainÚpath)
Ú_sessionÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚ	ExceptionÚcookiesÚset)Úss    r   Úget_sessionr0   )   sz   € äÐÜ×ÑÓˆØ	�	‰	×ÑœÔ!ð	Ø�E‰EÐ+°RÀˆEÔFð 	
�	‰	�‰Ð&¨Ð7HÈsˆÔSØˆÜ€Oøô	 ò 	Ùð	ús   »A6 Á6	BÂBc                 ó´   — t        «       }t        j                  dd| › d�«      }|j                  |dd¬«      }|j                  xs d|_        |j                  S )Nzpage_1.htmlÚpage_z.htmlr   Fr   úutf-8)r0   ÚLIST_URLÚreplacer+   Úapparent_encodingÚencodingÚtext)Úpr/   ÚurlÚrs       r   Ú
fetch_pager<   7   sS   € Ü‹€AÜ
×
Ñ
˜=¨E°!°°EÐ*:Ó
;€CØ	�‰ˆc˜2 eˆÓ,€AØ×$Ñ$Ò/¨€A„JØ�6‰6€Mr   c                 ó€   — t        «       }|j                  | dd¬«      }|j                  xs d|_        |j                  S )Nr   Fr   r3   )r0   r+   r6   r7   r8   )r:   r/   r;   s      r   Úfetch_detailr>   >   s8   € Ü‹€AØ	�‰ˆc˜2 eˆÓ,€AØ×$Ñ$Ò/¨€A„JØ�6‰6€Mr   c                 óð  — t        | d«      }g }|j                  dd¬«      D �]  }|j                  dd«      }t        j                  d|«      sŒ-t        |j                  dd«      xs |j                  d¬	«      «      }|rt        |«      d
k  rŒmd}|j                  ddg«      }|rjt        j                  d|j                  «       «      }|rD|j                  d«      j                  dd«      j                  dd«      j                  dd«      d d }|j                  |t        t        |«      |dœ«       �Œ t        «       }	g }
|D ]/  }|d   |	vsŒ|	j                  |d   «       |
j                  |«       Œ1 |
S )Núhtml.parserÚaT©ÚhrefrC   r   z/Jczwgk/show/\d+\.htmlÚtitle©r   é   ÚliÚdivõ#   20\d{2}[-/å¹´]\d{1,2}[-/æœˆ]\d{1,2}r   õ   å¹´ú-õ   æœˆr"   é
   )rD   r:   Úpub_dater:   )r   Úfind_allr+   r   Úsearchr   Úget_textÚlenÚfind_parentÚgroupr5   Úappendr   ÚBASE_URLr.   Úadd)ÚhtmlÚsoupÚitemsrA   rC   rD   rN   ÚparentÚmÚseenÚuniqÚits               r   Ú
parse_listr`   E   sb  € Ü˜˜}Ó-€DØ€EØ�]‰]˜3 Tˆ]Ó*ó ]ˆØ�u‰u�V˜RÓ ˆÜ�y‰yÐ2°DÔ9ØÜ˜AŸE™E '¨2Ó.ÒH°!·*±*À4°*Ó2HÓIˆÙœ˜E›
 QšØØˆØ—‘  e˜}Ó-ˆÙÜ—	‘	Ð@À&Ç/Á/ÓBSÓTˆAÙØŸ7™7 1›:×-Ñ-¨e°SÓ9×AÑAÀ%ÈÓM×UÑUÐVYÐ[^Ó_Ð`cÐacÐd�Ø�‰˜u¬W´X¸tÓ-DÐRZÑ[Ö\ð]ô ‹5€DØ€DØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�K‰K˜�Oðð €Kr   c                 óð  — ddddœ}t        | d«      }|j                  d«      }|r7|j                  d¬«      }t        j                  dd|«      }t        |«      |d<   |d   s3|j                  dd	g«      }|rt        |j                  d¬«      «      |d<   |j                  d
ddi¬«      }|r|j                  d«      r|d   d d |d<   |d   sbt        j                  d| d d «      }|rG|j                  d«      j                  dd«      j                  dd«      j                  dd«      d d |d<   d}|j                  dd¬«      xs |j                  dd¬«      }	|	rt        |	«      }|rt        |«      |d<   |S )Nr   ©rD   Úpublish_dateÚcontentr@   rD   TrE   u�   [-_â€”]\s*(æ ‡å‡†åŒ–è§„èŒƒåŒ–å·¥ä½œä¸“é¢˜|åŸºå±‚æ”¿åŠ¡å…¬å¼€|å…¨é�¢æŽ¨è¿›åŸºå±‚æ”¿åŠ¡å…¬å¼€|éƒŽæºª|é€šçŸ¥å…¬å‘Š|æ”¿åŠ¡å…¬å¼€|äººæ°‘æ”¿åºœ).*$Úh1Úh2ÚmetaÚnameÚPubDate)Úattrsrd   rM   rc   rI   i@  r   rJ   rK   rL   r"   rH   Úzoom)Úid)Úclass_)r   ÚfindrQ   r   r   r   r+   rP   rT   r5   ÚstrÚextract_clean_text)
rX   ÚresultrY   Ú	title_tagr   ÚhÚ	meta_dater\   Úcontent_htmlrH   s
             r   Úparse_detailrv   ^   s‘  € Ø¨2¸"Ñ=€FÜ˜˜}Ó-€DØ—	‘	˜'Ó"€IÙØ×Ñ TÐÓ*ˆÜ�F‰Fð  dð  fhð  jkó  lˆÜ% a›.ˆˆw‰Ø�'Š?Ø�I‰I�t˜T�lÓ#ˆÙÜ)¨!¯*©*¸4¨*Ó*@ÓAˆF�7‰OØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø!*¨9Ñ!5°c°rÐ!:ˆˆ~ÑØ�.Ò!Ü�I‰IÐ<¸dÀ5ÀD¸kÓJˆÙØ%&§W¡W¨Q£Z×%7Ñ%7¸¸sÓ%C×%KÑ%KÈEÐSVÓ%W×%_Ñ%_Ð`cÐehÓ%iÐjmÐkmÐ%nˆF�>Ñ"Ø€LØ
�)‰)�E˜fˆ)Ó
%Ò
H¨¯©°5À¨Ó)H€CÙ
Ü˜3“xˆÙÜ.¨|Ó<ˆˆyÑØ€Mr   c                 ó   — | syt        | d«      }|j                  dd¬«      D ]R  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }|j                  d	|› d
|› d�«       ŒT |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]u  }|j                  dk(  r|j                  t        |«      «       Œ-|j                  dk(  sŒ=|j                  d«      rŒO|j                  dd¬«      }	|	sŒe|j                  |	«       Œw |rdj                  |«      S | j                  «       S )Nr   r@   rA   TrB   rC   rE   u   é™„ä»¶r   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚur/   Útabler9   )Ú	separatorr   z

)r   rO   r+   rQ   r   rV   Úreplace_withÚunwraprh   rU   ro   rS   Újoinr   )
ru   rY   Úa_tagrC   r8   Úfull_urlÚtagÚpartsÚelr   s
             r   rp   rp   y   s6  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò 4ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ×Ñ˜Q˜t˜f B x j°Ð2Õ3ð	4ð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò  ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜Q•ð ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   é   c                 ó¨  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]¬  }|dk(  rt        n
t        › d|› �}	 t        |«      }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 ]ž  \  }}
|
d   r|
d   t        k  rŒ	 t        |
d   «      }t        |«      }|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.        «      }|j1                  d#«       |j3                  «       }dx}}|D ]V  }	 |j1                  d$|d%   |d&   |d&   |d   |d   |d   |d   xs dd d' |d(   f«       |j4                  dkD  r|dz  }n|dz  }ŒX |j7                  «        |j9                  «        t        d*|› d+|› d,�«       y # t        $ r}t        d|› d|› �«       Y d }~ �Œd }~ww xY w# t        $ r(}t        d|
d   dd  › d|› �«       ddddœ}Y d }~�Œõd }~ww xY w# 1 sw Y   �ŒNxY w# t        $ r}t        d)|› �«       |dz  }Y d }~�Œd }~ww xY w)-NzCrawl pages=z cutoff=rŠ   Ú_ÚPz ERR: r   r:   z: z items (z new), total gš™™™™™é?rN   z	  detail iØÿÿÿr   rb   rD   rc   rd   u   çŽ¯è¯„å®¡æ‰¹å…¬ç¤º)rD   Úpage_urlrc   rd   Ú	site_nameÚcolumnrM   z  r"   gš™™™™™Ù?Úwr3   )r7   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) VALUES (?,?,?,?,?,?,?,?)r�   rŽ   iô  r�   z
DB error: zResult: z new, z skipped)r   ÚCUTOFFr.   Úranger4   r<   r,   r`   rW   rU   rR   ÚtimeÚsleepÚ	enumerater>   rv   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allr]   r9   r:   rX   ÚerZ   Únewr_   ÚenrichedÚidxÚdetailÚfÚitemÚconnÚcÚstoredÚskippeds                       r   Úcrawlr²   �   s¸  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆØ˜qš&�h¬¨
°!°A°3Ð&7ˆð	Ü˜a“=ˆDô ˜4Ó ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ð#ð& €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5Øð	FÜ  5¡	Ó*ˆDÜ! $Ó'ˆFð 	�‰Ø˜G‘_Ò3¨¨7©Ø˜5™	Ø" >Ñ2ÒD°b¸±nØ˜iÑ(Ü"Ø*ñ
ô 	ð �‰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±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôE ò 	Ü�!�A�3�f˜Q˜CÐ Ô!Þûð	ûô, ò 	FÜ�)˜B˜u™I c d˜OÐ,¨F°1°#Ð6Ô7Ø!°2À"ÑEŽFûð	Fú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰LŽGûð	úsU   ÁK ÄK)Æ1LÈ8AL*Ë 	K&Ë	K!Ë!K&Ë)	LË2LÌLÌL'Ì*	MÌ3MÍMÚ__main__é   z--pages=r   z--pages=(\d+)z--json)r¤   r¥   )rŠ   N).Ú__doc__r   ÚsysÚosr›   r–   r�   r&   r   r   Úbs4r   Úurllib.parser   r   rV   r4   ÚDOMAINÚGROUPÚnowÚstrftimer”   Úenvironr+   r	   r*   r   r   r%   r0   r<   r>   r`   rv   rp   r²   Ú__name__ÚargvÚargsr¤   r¥   r„   ÚintrP   rT   Úindex© r   r   ú<module>rÅ      sF  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à0€	Ø#€ØK€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òð €òòòòò2ò6Aó,J4ðZ ˆ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   