Ë
    '}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mZmZ ddl	m
Z
 dZdZdZdZd	Zd
ZddgZg d¢ez   Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u¦   
Crawler for å²³é˜³å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - é€šçŸ¥å…¬å‘Š
CMS: TRS-style static HTML, GBK encoding
Site: hbj.yueyang.gov.cn/6790/6792/default.htm
Province: æ¹–å�— (Hunan)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupzhttps://hbj.yueyang.gov.cnz
/6790/6792u%   å²³é˜³å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘Šé   é   é   z-AzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36)Úcurlz-sz-kz--connect-timeoutÚ10z
--max-timeÚ20c                 óþ   — t         | gz   }t        j                  |dd¬«      }|j                  dk7  r2t	        dj                  |j                  |j                  d d «      «      ‚|j                  j                  d«      S )NTé   )Úcapture_outputÚtimeoutr   zcurl failed: {} (stderr: {})éÈ   Úgbk)	Ú	BASE_CURLÚ
subprocessÚrunÚ
returncodeÚ	ExceptionÚformatÚstderrÚstdoutÚdecode)ÚurlÚcmdÚrs      ú&/root/gov_crawler/crawl_yueyang_hbj.pyÚfetchr      sh   € Ü
�s�eÑ
€CÜ�‰�s¨4¸Ô<€AØ‡|�|�qÒÜÐ6×=Ñ=¸a¿l¹lÈAÏHÉHÐUYÐVYÈNÓ[Ó\Ð\Ø�8‰8�?‰?˜5Ó!Ð!ó    c                 ó8  — t        | d«      }g }|j                  dd¬«      }|D ]ó  }|j                  dd¬«      }|sŒ|j                  dd¬	«      }|sŒ/|d
   j                  «       }|j	                  d¬«      }|j                  dd¬«      }	|	r|	j	                  d¬«      nd}
|r|sŒ‚|j                  d«      r|}n6|j                  d«      r
t        |z   }ndj                  t        t        |«      }|sŒÏ|sŒÒ|j                  |j                  «       ||
f«       Œõ |S )z3Parse list page, return list of (title, url, date).úhtml.parserÚlizentry-wrapper©Úclass_ÚdivÚtitleÚaT©Úhrefr*   ©ÚstripÚdateÚ Úhttpú/z{}{}/{})
r   Úfind_allÚfindr,   Úget_textÚ
startswithÚBASE_URLr   Ú	LIST_PATHÚappend)ÚhtmlÚsoupÚitemsÚentriesÚentryÚ	title_divr(   r*   r'   Údate_divr-   Úfull_urls               r   Ú
parse_listr@   "   s  € ä˜˜}Ó-€DØ€Eð �m‰m˜D¨ˆmÓ9€GØò :ˆØ—J‘J˜u¨W�JÓ5ˆ	ÙØØ�N‰N˜3 TˆNÓ*ˆÙØØ�‰y�‰Ó ˆØ—
‘
 �
Ó&ˆð —:‘:˜e¨F�:Ó3ˆÙ08ˆx× Ñ  tÐ Ô,¸bˆá™DØð �?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ü $‘‰Hà ×'Ñ'¬´)¸TÓBˆHâ’XØ�L‰L˜%Ÿ+™+›-¨°4Ð8Õ9ð5:ð8 €Lr    c                 ó”  ‡— t        | d«      }d}|j                  d«      }|rC|j                  d¬«      }dD ](  }||v sŒ|j                  |d«      j	                  «       } n |s|}d}|j                  dd¬	«      }|r9|j                  «       }	t        j                  d
|	«      }
|
r|
j                  d«      }|s_dD ]Z  }|j                  dd|i¬«      }|sŒ|j                  d«      sŒ-t        j                  d
|d   «      }
|
sŒI|
j                  d«      } n d}|j                  dd¬	«      }|r|j                  «       }|rt        |j	                  «       «      dk  r'|r%|j                  dd¬	«      }|r|j                  «       }g }|r»t        |d«      }|j                  dd¬«      D ]™  }|d   j	                  «       Št        ˆfd„dD «       «      sŒ+‰j                  d«      s6‰j                  d«      r
t        ‰z   Šn|j                  dd«      d   dz   ‰z   Š|j!                  |j                  d¬«      xs d‰dœ«       Œ› |||||dœS )zParse detail page content.r"   r.   r'   Tr+   )u   -å²³é˜³å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€u   _å²³é˜³å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€r&   zdetail-content-wrapperr$   z(\d{4}[-/]\d{1,2}[-/]\d{1,2})é   )ÚPubDateÚpublishdatezdc.dateÚmetaÚname)ÚattrsÚcontentzcontent-wrapperé2   r(   r)   r*   c              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­w©N©Úlower©Ú.0ÚextÚahrefs     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>ƒ   s   øè ø€ Òn¨C�3˜%Ÿ+™+›-Ô'Ñnùó   ƒ©z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarr/   r0   r   u   é™„ä»¶)r'   r   ©r'   r-   rH   ÚattachmentsÚ
source_url)r   r2   r3   Úreplacer,   ÚreÚsearchÚgroupÚgetÚdecode_contentsÚlenr1   Úanyr4   r5   Úrsplitr7   )r8   r   r9   r'   Ú	title_tagÚ
full_titleÚsuffixÚpub_dateÚdetail_wrapperÚtextÚmÚ	meta_namerE   Úcontent_htmlÚcontent_wrapperÚinnerrV   ÚcsoupÚa_tagrQ   s                      @r   Úparse_detailrn   H   ss  ø€ ä˜˜}Ó-€Dð €EØ—	‘	˜'Ó"€IÙØ×'Ñ'¨dÐ'Ó3ˆ
àPò 	ˆFØ˜Ò#Ø"×*Ñ*¨6°2Ó6×<Ñ<Ó>�Ùð	ñ ØˆEð €Hð —Y‘Y˜uÐ-E�YÓF€NÙà×&Ñ&Ó(ˆÜ�I‰IÐ6¸Ó=ˆÙØ—w‘w˜q“zˆHñ Ø>ò 	ˆIØ—9‘9˜V¨F°IÐ+>�9Ó?ˆDÚ˜Ÿ™ Õ+Ü—I‘IÐ>ÀÀYÁÓP�ÚØ Ÿw™w q›z�HÙð	ð €LØ—i‘i Ð.?�iÓ@€OÙØ&×6Ñ6Ó8ˆñ œ3˜|×1Ñ1Ó3Ó4°rÒ9Ùà"×'Ñ'¨Ð6GÐ'ÓHˆEÙØ$×4Ñ4Ó6�ð €KÙÜ˜l¨MÓ:ˆØ—^‘^ C¨d�^Ó3ò 	ˆEØ˜&‘M×'Ñ'Ó)ˆEÜÓnÐ3mÔnÕnØ×'Ñ'¨Ô/Ø×'Ñ'¨Ô,Ü (¨5Ñ 0™à #§
¡
¨3°Ó 2°1Ñ 5¸Ñ ;¸eÑ C˜Ø×"Ñ"Ø"Ÿ^™^°$˜^Ó7ÒC¸8Ø ñ$õ ð	ð ØØØ"Øñð r    c                 ó  ‡
— | rt        | j                  «       «      dk  rdj                  ||«      S t        | d«      }g }|j                  D �]Å  }|j
                  €%|j                  «       }|sŒ#|j                  |«       Œ5|j
                  dk(  r(|j                  dd¬«      }|sŒZ|j                  |«       Œl|j
                  d	k(  rHt        |«      }|j                  d
||j                  d«      d j                  dd«      d   z   dz   «       ŒÃ|j
                  dk(  r(|j                  dd¬«      }|sŒè|j                  |«       Œú|j
                  dk(  s�Œ|j                  dd«      Š
|j                  d¬«      }|s�Œ3‰
s�Œ7‰
j                  d«      r�ŒJt        ˆ
fd„dD «       «      r#|j                  dj                  |‰
«      «       �Œ�‰
j                  d«      r#|j                  dj                  |‰
«      «       �Œµ|j                  |«       �ŒÈ dj                  d„ |D «       «      j                  «       }	t        j                   dd|	«      }	t        |	j                  «       «      dk  rdj                  ||«      S |	S )z9Convert HTML to readable text with paragraphs and tables.rI   ú[{}]({})r"   NÚpú Tr+   Útablez<table>ú>z</table>rB   r   r&   r(   r*   r.   Ú
javascriptc              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrK   rL   rN   s     €r   rR   z!render_content.<locals>.<genexpr>³   s   øè ø€ Òr°�s˜eŸk™k›mÔ+ÑrùrS   rT   r/   z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wrK   © )rO   rq   s     r   rR   z!render_content.<locals>.<genexpr>º   s   è ø€ Ò/˜qªQœÑ/ùs   ‚Šz\n{3,}é   )r^   r,   r   r   ÚchildrenrF   r7   r3   ÚstrÚindexr`   r\   r4   r_   ÚjoinrY   Úsub)ri   r'   r   r9   ÚpartsÚelrf   Ú
table_htmlÚatextÚresultrQ   s             @r   Úrender_contentr„   —   s  ø€ áœ3˜|×1Ñ1Ó3Ó4°rÒ9Ø× Ñ  ¨Ó,Ð,ä˜ }Ó5€DØ€Eà�m‰mó (ˆØ�7‰7ˆ?Ø—8‘8“:ˆDÚØ—‘˜TÕ"Ø�W‰W˜Š^Ø—;‘;˜s¨$�;Ó/ˆDÚØ—‘˜TÕ"Ø�W‰W˜ÒÜ˜R›ˆJØ�L‰L˜ Z°
×0@Ñ0@ÀÓ0EÐ0FÐ%G×%NÑ%NÈzÐ[\Ó%]Ð^_Ñ%`Ñ`ÐcmÑmÕnØ�W‰W˜ÒØ—;‘;˜s¨$�;Ó/ˆDÚØ—‘˜TÕ"Ø�W‰W˜Œ^Ø—F‘F˜6 2Ó&ˆEØ—K‘K d�KÓ+ˆEÛ› u×'7Ñ'7¸Ö'EÜÓrÐ7qÔrÔrØ—L‘L ×!2Ñ!2°5¸%Ó!@ÖAØ×%Ñ% fÔ-Ø—L‘L ×!2Ñ!2°5¸%Ó!@ÖAà—L‘L Ö'ð3(ð6 �[‰[Ñ/ EÔ/Ó/×5Ñ5Ó7€FÜ�V‰V�I˜v vÓ.€Fä
ˆ6�<‰<‹>Ó˜RÒØ× Ñ  ¨Ó,Ð,Ø€Mr    c                  ój   — t        t        j                  «      dkD  xr t        j                  d   dk(  S )NrB   Úincremental)r^   ÚsysÚargvrx   r    r   Úis_incrementalr‰   Â   s'   € ÜŒs�x‰x‹=˜1ÑÒ=¤§¡¨!¡°Ñ!=Ð=r    c                  ó 	  — t        «       } t        dj                  t        | t        «      «       g }t        dt        dz   «      D ]ª  }|dk(  rdj                  t        t        «      }ndj                  t        t        |dz
  «      }t        dj                  ||«      «       	 t        |«      }t        |«      }t        dj                  t        |«      «      «       |s n|j                  |«       Œ¬ t        dj                  t        |«      «      «       |st        d	«       y | rœt        j                  «       t        t         ¬
«      z
  }t        dj                  |j#                  «       «      «       |D ��	�
cg c]  \  }}	}
|
sŒ
t%        |
|«      sŒ||	|
f‘Œ }}	}}
|}t        dj                  t        |«      «      «       g }t'        |«      D ]‡  \  }\  }}}t        dj                  |dz   t        |«      |d d «      «       	 t        |«      }t+        ||«      }|d   s||d<   |d   s||d<   t-        |d   |d   |«      |d<   |j)                  |«       Œ‰ t        dj                  t        |«      «      «       |st        d«       y t/        j0                  dddd¬«      }dj                  t        t        |«      «      }|D ]X  }|d   |d   |d   |d   t        |d   |j3                  dg «      dœ}|j5                  t7        j8                  |d¬«      d z   «       ŒZ |j;                  «        t        d!j                  |j<                  «      «       t?        j@                  d"j                  |j<                  |«      «      }|d#k(  rt        d$«       n/t        d%j                  |«      «       tC        jD                  d«       	 t?        jF                  |j<                  «       y # t        $ r%}t        dj                  |«      «       Y d }~�ŒÆd }~ww xY wc c}
}	}w # t        $ rL}t        dj                  |«      «       |j)                  ||dj                  ||«      g |dœ«       Y d }~�Œœd }~ww xY w# tH        $ r Y y w xY w)&Nz2[{}] Starting crawl (incremental={}, max_pages={})rB   z{}{}/default.htmz{}{}/default_{}.htmz  Fetching page {}: {}z    ERROR: {}z    Found {} itemsz
  Total items from list: {}z  No items found, exiting)Údaysz  Incremental mode: cutoff = {}z$  After incremental filter: {} itemsz  [{}/{}] Fetching: {}...é(   rp   rU   r'   r-   rH   z
  Total valid items: {}z  No items to import, exitingÚwz.jsonlFz/tmp)Úmoderc   ÚdeleteÚdiru
   {} ({}æ�¡)rW   rV   )r'   Úpage_urlrH   Úpublish_dateÚ	site_namerW   rV   )Úensure_asciiú
z  JSONL written: {}z3python3 /root/gov_crawler/import_jsonl.py '{}' '{}'r   z  OK Import completez  FAIL Import failed (exit={}))%r‰   Úprintr   Ú	SITE_NAMEÚ	MAX_PAGESÚranger5   r6   r   r   r@   r^   Úextendr   Únowr   ÚINCREMENTAL_DAYSr-   Ú_date_filterÚ	enumerater7   rn   r„   ÚtempfileÚNamedTemporaryFiler\   ÚwriteÚjsonÚdumpsÚcloserF   ÚosÚsystemr‡   ÚexitÚunlinkÚOSError)r†   Ú	all_itemsÚpager‘   r8   Úer:   Úcutoff_dateÚtÚuÚdÚfilteredÚresultsÚidxr'   r   Údate_from_listÚdetailÚtmpÚlabelr   ÚlineÚrets                          r   Úmainrº   Æ   s  € Ü Ó"€KÜ	Ð
>×
EÑ
EÄiÐQ\Ô^gÓ
hÔið €IÜ�aœ Q™Ó'ò  ˆØ�1Š9Ø)×0Ñ0´¼9ÓE‰Hà,×3Ñ3´H¼iÈÐPQÉÓRˆHäÐ&×-Ñ-¨d°HÓ=Ô>ð	Ü˜“?ˆDô ˜4Ó ˆÜÐ"×)Ñ)¬#¨e«*Ó5Ô6ÙÙØ×Ñ˜Õð! ô$ 
Ð
)×
0Ñ
0´°Y³Ó
@ÔAÙÜÐ)Ô*Øñ Ü—l‘l“n¤yÔ6FÔ'GÑGˆÜÐ/×6Ñ6°{×7GÑ7GÓ7IÓJÔKØ-6×]Ð]¡' ! Q¨º!ÄÈQÐP[Õ@\�Q˜˜1’IÐ]ˆÒ]Øˆ	ÜÐ4×;Ñ;¼CÀ	»NÓKÔLð €GÜ-6°yÓ-Aò Ñ)ˆÑ)ˆe�S˜.ÜÐ)×0Ñ0°°q±¼#¸i».È%ÐPSÐQSÈ*ÓUÔVð		Ü˜“:ˆDô ˜d CÓ(ˆØ�gŠØ#ˆF�7‰OØ�fŠ~Ø+ˆF�6‰Nä*¨6°)Ñ+<¸fÀW¹oÈsÓSˆˆyÑØ�‰�vÕð)ô, 
Ð
%×
,Ñ
,¬S°«\Ó
:Ô;ÙÜÐ-Ô.Øô ×
%Ñ
%¨3°xÈÐSYÔ
Z€CØ×Ñ¤	¬3¨w«<Ó8€EØò 
?ˆà�w‘ZØ˜,™Ø˜‘|Ø˜f™IÜ"Ø˜L™/ØŸ5™5 °Ó3ñ
ˆð 	�	‰	”$—*‘*˜T°Ô6¸Ñ=Õ>ð
?ð ‡I�I„KÜ	Ð
×
&Ñ
& s§x¡xÓ
0Ô1ô �)‰)ÐI×PÑPÐQT×QYÑQYÐ[`ÓaÓ
b€CØ
ˆa‚xÜÐ$Õ%äÐ.×5Ñ5°cÓ:Ô;Ü�‰�ŒðÜ
�	‰	�#—(‘(Õøô[ ò 	Ü�/×(Ñ(¨Ó+Ô,Ýûð	üô$ ^øô ò 	Ü�/×(Ñ(¨Ó+Ô,Ø�N‰NØ¨Ø%×,Ñ,¨U°CÓ8Ø!°ñô õ
 ûð	ûôd ò ÙðúsU   Â!O!Å7PÆPÆPÈPÏQ1 Ï!	PÏ*P
Ð
PÐ	Q.Ð"AQ)Ñ)Q.Ñ1	Q=Ñ<Q=c                 óX   — 	 t        j                  | d«      }||k\  S # t        $ r Y yw xY w)Nz%Y-%m-%dT)r   ÚstrptimeÚ
ValueError)Údate_strÚcutoffr°   s      r   r�   r�   (  s5   € ðÜ×Ñ˜h¨
Ó3ˆØ�F‰{ÐøÜò Ùðús   ‚ �	)¨)Ú__main__)Ú__doc__r¥   rY   r¢   r‡   r   rŸ   r   r   Úbs4r   r5   r6   r—   rœ   r˜   ÚPER_PAGEÚHEADERSr   r   r@   rn   r„   r‰   rº   r�   Ú__name__rx   r    r   ú<module>rÆ      s”   ðñ÷ /× .× .ß (Ý à'€Ø€	Ø3€	ØÐ Ø€	Ø€ð 	Ð
{ð€ò PÐRYÑY€	ò"ò#òLLò^(òV>ò_òDð ˆzÒÙ…Fð r    