Ë
    †É…j%  ã                   ó0  — 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eez   dz   ZdZd	Zd
ZdZddddœZdZ ej(                  «       Zej,                  j/                  e«       dd„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 (TRS_UEDITOR), static .html pages
Site: www.yx.gov.cn/xwdt/gsgg/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupzhttp://www.yx.gov.cnz
/xwdt/gsggú/u"   é˜³æ–°åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šé   é   é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   z//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparseÚurljoin)ÚtableÚbase_urlÚurllibÚtblr   r   r   r   s           ú!/root/gov_crawler/crawl_yx_gov.pyÚhtml_table_to_htmlr"      sÐ   € ãÜ
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@H˜Ÿ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@H˜Ÿ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Oó    c                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)Úsessionr   ÚTIMEOUTÚencodingÚtext)ÚurlÚresps     r!   Úfetchr,   +   s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðr#   c                 óŠ  — t        | d«      }g }|j                  dd¬«      D �]  }|j                  d«      }|sŒ|j                  dd¬«      }|sŒ.|d	   j                  «       }|j	                  d
«      xs |j                  d¬«      }|j                  dd¬«      }|r|j                  d¬«      nd}	|j                  d«      rt        t        z   dz   |dd z   }n?|j                  d«      r
t        |z   }n$|j                  d«      st        t        z   dz   |z   }|sŒù|sŒü|j                  |j                  «       ||	f«       �Œ  |S )z3Parse list page, return list of (title, url, date).r   Úulzlist-t©Úclass_Úlir   T©r   r   Útitle©ÚstripÚspanÚdater   z./r   é   Nr   )
r   r   Úfindr5   r   Úget_textr   ÚBASE_URLÚ	LIST_PATHÚappend)
ÚhtmlÚsoupÚitemsr.   r1   r   r   r3   r6   r7   s
             r!   Ú
parse_listrA   1   s/  € ä˜˜}Ó-€DØ€EØ�m‰m˜D¨ˆmÓ2ó 6ˆØ�W‰W�T‹]ˆÙØØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰y�‰Ó ˆà—‘�g“Ò8 !§*¡*°4 *Ó"8ˆØ�w‰w�v fˆwÓ-ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆð �?‰?˜4Ô ÜœiÑ'¨#Ñ-°°Q°R°Ñ8‰DØ�_‰_˜SÔ!Ü˜d‘?‰DØ—‘ Ô(ÜœiÑ'¨#Ñ-°Ñ4ˆDâ’TØ�L‰L˜%Ÿ+™+›-¨¨tÐ4Ö5ð-6ð. €Lr#   c                 ó|  — t        | d«      }|j                  d«      }|r|j                  d¬«      nd}d}|j                  dddi¬	«      }|r|j                  d
«      r|d
   dd }d}|j                  dd¬«      }|rt	        |«      }g }	|j                  dd¬«      }
|
r—|
j                  dd¬«      }|r‚|j                  dd¬«      D ]l  }|d   j                  «       }|sŒ|j                  d«      rŒ+|j                  d«      s	t        |z   }|	j                  |j                  d¬«      xs d|dœ«       Œn ||||	|dœS )zParse detail page content.r   Úh2Tr4   r   ÚmetaÚnameÚPubDate)ÚattrsÚcontentNé
   ÚdivÚTRS_UEDITORr/   ÚfilesÚ	file_listr   r2   r   r   r   u   é™„ä»¶)r3   r*   ©r3   r7   rH   ÚattachmentsÚ
source_url)
r   r9   r:   r   r   r   r5   r   r;   r=   )r>   r*   r?   rC   r3   Úpub_daterD   Úcontent_htmlÚcontent_divrO   Ú	files_divÚflistr   Úahrefs                 r!   Úparse_detailrW   O   s\  € ä˜˜}Ó-€Dð 
�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eð €HØ�9‰9�V F¨IÐ#6ˆ9Ó7€DÙ�—‘˜Ô#Ø˜	‘? 3 BÐ'ˆð €LØ—)‘)˜E¨-�)Ó8€KÙÜ˜;Ó'ˆð €KØ—	‘	˜%¨�	Ó0€IÙØ—‘˜u¨[�Ó9ˆÙØ—^‘^ C¨d�^Ó3ò �Ø˜&™	Ÿ™Ó)�Ú ×!1Ñ!1°,Õ!?Ø ×+Ñ+¨FÔ3Ü (¨5Ñ 0˜Ø×&Ñ&Ø!"§¡°$ Ó!7Ò!C¸8Ø$ñ(õ ðð ØØØ"Øñð r#   c                 óª  — | rt        | j                  «       «      dk  rdj                  ||«      S t        | d«      }g }|j	                  g d¢d¬«      D �]�  }|j
                  dk(  r¦|j                  dd¬	«      }|j	                  d
«      }d}|rX|D ]S  }	|	j                  dd«      }
|
sŒ|
j                  d«      s	t        |
z   }
|j                  dj                  |
«      «       d}ŒU |r|j                  |«       Œ§|j                  d«       Œ¹|j
                  dk(  r!t        ||«      }|sŒ×|j                  |«       Œé|j
                  dv r9|j                  dd¬	«      }|s�Œ|j                  dj                  |«      «       �Œ0|j
                  d
k(  s�ŒA|j                  dd«      }
|
s�ŒW|
j                  d«      s	t        |
z   }
|j                  dj                  |
«      «       �Œ“ dj                  d„ |D «       «      j                  «       }t        j                  dd|«      }t        |j                  «       «      dk  rdj                  ||«      S |S )z×Convert TRS_UEDITOR HTML to readable markdown with tables.
    Note: content_html is str() of the TRS_UEDITOR div (includes wrapper div).
    We iterate all <p> elements directly to avoid the wrapper div issue.
    é2   ú[{}]({})r   )Úpr   Úh1rC   Úh3Úh4r   T)Ú	recursiver[   ú r4   r   Fr   r   r   u   ![å›¾ç‰‡]({})r   )r\   rC   r]   r^   z
{}z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w)N© )Ú.0r[   s     r!   ú	<genexpr>z!render_content.<locals>.<genexpr>¨   s   è ø€ Ò/˜qªQœÑ/ùs   ‚Šz\n{3,}r   )Úlenr5   Úformatr   r   rE   r:   r   r   r;   r=   r"   ÚjoinÚreÚsub)rR   r3   r*   r?   ÚpartsÚelr)   ÚimgsÚhas_imgr   r   Útbl_htmlÚresults                r!   Úrender_contentrp   |   s	  € ñ
 œ3˜|×1Ñ1Ó3Ó4°rÒ9Ø× Ñ  ¨Ó,Ð,ä˜ }Ó5€DØ€Eð �m‰mÒIÐUYˆmÓZó :ˆØ�7‰7�cŠ>Ø—;‘;˜s¨$�;Ó/ˆDØ—;‘;˜uÓ%ˆDØˆGÙØò '�CØŸ'™' %¨Ó,�CÚØ"Ÿ~™~¨fÔ5Ü"*¨S¡.˜CØŸ™ _×%;Ñ%;¸CÓ%@ÔAØ"&™ð'ñ Ø—‘˜TÕ"à—‘˜RÕ Ø�W‰W˜ÒÜ)¨"¨cÓ2ˆHÚØ—‘˜XÕ&Ø�W‰WÐ0Ñ0Ø—;‘;˜s¨$�;Ó/ˆDÛØ—‘˜VŸ]™]¨4Ó0Ö1Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCÛØ—~‘~ fÔ-Ü" S™.�CØ—‘˜_×3Ñ3°CÓ8Ö9ð=:ð@ �[‰[Ñ/ 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 )Né   Úincremental)re   ÚsysÚargvrb   r#   r!   Úis_incrementalrv   °   s'   € ÜŒs�x‰x‹=˜1ÑÒ=¤§¡¨!¡°Ñ!=Ð=r#   c                  óT	  — t        «       } t        dj                  t        | t        «      «       g }t        dt        dz   «      D ]¨  }|dk(  rt        }n%dj                  t        j                  d«      |«      }t        dj                  ||«      «       	 t        |«      }t        |«      }t        dj                  t        |«      «      «       |st        d«        n|j                  |«       Œª t        d	j                  t        |«      «      «       |st        d
«       y d }| 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                  jI                  |j<                  «      r!	 t?        jJ                  |j<                  «       y 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# tL        $ r Y y w xY w)'Nz2[{}] Starting crawl (incremental={}, max_pages={})rr   z{}/index_{}.htmlr   z  Fetching page {}: {}z    ERROR: {}z    Found {} itemsz    No more items, stoppingz
  Total items from list: {}z  No items found, exiting)Údaysz  Incremental mode: cutoff = {}z$  After incremental filter: {} itemsz  [{}/{}] Fetching: {}...é(   rZ   rN   r3   r7   rH   z
  Total valid items: {}z  No items to import, exitingÚwz.jsonlFz/tmp)ÚmodeÚsuffixÚdeleteÚdiru
   {} ({}æ�¡)rP   rO   )r3   Úpage_urlrH   Úpublish_dateÚ	site_namerP   rO   )Úensure_asciiú
z  JSONL written: {}z3python3 /root/gov_crawler/import_jsonl.py '{}' '{}'r   z  OK Import completez  FAIL Import failed (exit={}))'rv   Úprintrf   Ú	SITE_NAMEÚ	MAX_PAGESÚrangeÚLIST_URLÚrstripr,   Ú	ExceptionrA   re   Úextendr   Únowr   ÚINCREMENTAL_DAYSr7   Údate_filterÚ	enumerater=   rW   rp   ÚtempfileÚNamedTemporaryFiler   ÚwriteÚjsonÚdumpsÚcloserE   ÚosÚsystemrt   ÚexitÚpathÚexistsÚunlinkÚOSError)rs   Ú	all_itemsÚpager   r>   Úer@   Úcutoff_dateÚtÚuÚdÚfilteredÚresultsÚidxr3   r*   Údate_from_listÚdetailÚtmpÚlabelÚrÚlineÚrets                          r!   Úmainr®   ´   s3  € Ü Ó"€KÜ	Ð
>×
EÑ
EÄiÐQ\Ô^gÓ
hÔið €IÜ�aœ Q™Ó'ò  ˆØ�1Š9Ü‰Hà)×0Ñ0´·±ÀÓ1EÀtÓLˆHÜÐ&×-Ñ-¨d°HÓ=Ô>ð	Ü˜“?ˆDô ˜4Ó ˆÜÐ"×)Ñ)¬#¨e«*Ó5Ô6ÙÜÐ/Ô0ÙØ×Ñ˜Õð! ô$ 
Ð
)×
0Ñ
0´°Y³Ó
@ÔAÙÜÐ)Ô*Øð €KÙÜ—l‘l“n¤yÔ6FÔ'GÑGˆÜÐ/×6Ñ6°{×7GÑ7GÓ7IÓJÔKØ-6×\Ð\¡' ! Q¨º!ÄÈAÈ{Õ@[�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Ó:Ô;Ü�‰�Œô 
‡w�w‡~�~�c—h‘hÔð	Ü�I‰I�c—h‘hÕð  øô_ ò 	Ü�/×(Ñ(¨Ó+Ô,Ýûð	üô( ]øô ò 	Ü�/×(Ñ(¨Ó+Ô,Ø�N‰NØ¨Ø%×,Ñ,¨U°CÓ8Ø!°ñô õ
 ûð	ûôh ò 	Ùð	úsU   ÂPÅ7P<ÆP<ÆP<ÈQÏ*R Ð	P9ÐP4Ð4P9Ñ	RÑARÒRÒ	R'Ò&R'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__)r   )!Ú__doc__Úrequestsrh   r“   rt   r–   r�   r   r   Úbs4r   r;   r<   rˆ   r…   r�   r†   ÚPER_PAGEÚHEADERSr'   ÚSessionr&   ÚheadersÚupdater"   r,   rA   rW   rp   rv   r®   rŽ   Ú__name__rb   r#   r!   ú<module>r¾      sÅ   ðñ÷
 -× ,× ,ß (Ý à!€Ø€	Ø�iÑ #Ñ%€Ø0€	ØÐ Ø€	Ø€ð DØOØ0ñ€ð
 €à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óòòò<*òZ1òh>òaòHð ˆzÒÙ…Fð r#   