Ë
    Í«£jÞ#  ã                   ó8  — 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
ZdZdZedz   ZdZdZd	Zd
ZddddœZdZ ej*                  «       Zej.                  j1                  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)é    N)ÚdatetimeÚ	timedelta©ÚBeautifulSoupzhttp://www.yussen.com.cnÚ10z/news-{}-{}.htmlu   å®‡æ–°èƒ½æº�-ä¿¡æ�¯å…¬ç¤ºé   é   é   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 m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   úhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   z//zdata:)	Úbs4r   ÚstrÚfind_allÚgetÚ
startswithÚurllibÚparseÚurljoin)ÚtableÚbase_urlr   Útblr   r   r   r   s           úcrawl_yussen.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¬«      }|s|S |j                  d«      }|s|S |j                  d«      D ]Á  }|j                  dd¬	«      }|j                  d
«      }|r|sŒ,|d   j                  «       }|j	                  d¬«      }	|j	                  d¬«      }
|	r|sŒh|j                  d«      s'|j                  d«      r
t        |z   }nt        dz   |z   }|j                  |	j                  «       ||
f«       ŒÃ |S )z3Parse list page, return list of (title, url, date).r   Údivzchanping-liebiao©Úclass_ÚulÚlir   T©r   Úspanr   ©Ústripr   ú/)r   Úfindr   r7   Úget_textr   ÚBASE_URLÚappend)ÚhtmlÚsoupÚitemsr/   r2   r3   r   r5   r   ÚtitleÚdates              r"   Ú
parse_listrB   4   s	  € ä˜˜}Ó-€DØ€Eà
�)‰)�EÐ"4ˆ)Ó
5€CÙØˆØ	�‰�$‹€BÙØˆØ�k‰k˜$Óò 2ˆØ�G‰G�C˜dˆGÓ#ˆØ�w‰w�v‹ˆÙ™ØØ�‰y�‰Ó ˆØ—
‘
 �
Ó&ˆØ�}‰} 4ˆ}Ó(ˆÙ™DØà�‰˜vÔ&Ø�‰˜sÔ#Ü $‘‘ä #‘~¨Ñ,�Ø�‰�e—k‘k“m T¨4Ð0Õ1ð!2ð" €Lr$   c                 ól  ‡— t        | d«      }d}d}d}|j                  dd¬«      }|rü|j                  dd¬«      }|r|j                  d¬	«      }|j                  dd
¬«      }|r;|j                  d¬	«      }	t        j                  d|	«      }
|
r|
j                  d«      }g }d}d}|j                  D ]_  }|j                  dk(  r4|s|j                  d«      dgk(  rd}Œ,|s|j                  d«      d
gk(  rd}ŒF|j                  t        |«      «       Œa dj                  |«      }g }|r…t        |d«      }|j                  dd¬«      D ]c  }|d   j                  «       j                  «       Št        ˆfd„dD «       «      sŒ9|j                  |j                  d¬	«      xs d|d   dœ«       Œe |||||dœS )zParse detail page content.r   r   r/   Úxiangqing_neiror0   ÚpÚp03Tr6   Úp04z(\d{4}-\d{2}-\d{2})é   FÚclassr   r4   r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚextÚahrefs     €r"   ú	<genexpr>zparse_detail.<locals>.<genexpr>   s   øè ø€ Òf C�3˜%”<Ñfùs   ƒ)z.pdfz.docz.docxz.xlsz.xlsxz.zipz.raru   é™„ä»¶)r@   r+   ©r@   rA   ÚcontentÚattachmentsÚ
source_url)r   r9   r:   ÚreÚsearchÚgroupÚchildrenÚnamer   r<   r   Újoinr   r7   ÚlowerÚany)r=   r+   r>   r@   Úpub_dateÚcontent_htmlÚneiroÚp_titleÚp_dateÚ	date_textÚmÚcontent_partsÚfound_firstÚfound_secondÚchildrS   Úcsoupr   rO   s                     @r"   Úparse_detailri   S   sÒ  ø€ ä˜˜}Ó-€Dà€EØ€HØ€Là�I‰I�eÐ$5ˆIÓ6€EÙà—*‘*˜S¨�*Ó/ˆÙØ×$Ñ$¨4Ð$Ó0ˆEð —‘˜C¨�Ó.ˆÙØŸ™¨d˜Ó3ˆIÜ—	‘	Ð0°)Ó<ˆAÙØŸ7™7 1›:�ð ˆØˆØˆØ—^‘^ò 	-ˆEØ�z‰z˜SÒ Ù" u§y¡y°Ó'9¸e¸WÒ'DØ"&�KØÙ#¨¯	©	°'Ó(:¸u¸gÒ(EØ#'�LØØ× Ñ ¤ U£Õ,ð	-ð —w‘w˜}Ó-ˆð €KÙÜ˜l¨MÓ:ˆØ—‘ ¨$�Ó/ò 	ˆAØ�f‘I—O‘OÓ%×+Ñ+Ó-ˆEÜÓfÐ+eÔfÕfØ×"Ñ"ØŸZ™Z¨d˜ZÓ3Ò?°xØ˜V™9ñ$õ ð	ð ØØØ"Øñð r$   c                 ó.  — | rt        | j                  «       «      dk  rdj                  ||«      S t        | d«      }g }|j                  D �][  }|j
                  €$|j                  «       }|rG|j                  |«       n5|j
                  dk(  r&|j                  dd¬«      }|r|j                  |«       |j
                  dk(  r|j                  t        ||«      «       Œ”|j
                  d	k(  r|j                  d
«       Œµ|j
                  dk(  r(|j                  dd¬«      }|sŒÚ|j                  |«       Œì|j
                  dk(  sŒü|j                  dd
«      }|j                  d¬«      }|s�Œ$|s�Œ(|j                  d«      r�Œ;|j                  dj                  ||«      «       �Œ^ dj                  d„ |D «       «      j                  «       }t        j                  dd|«      }t        |j                  «       «      dk  rdj                  ||«      S |S )zConvert HTML to readable text.é2   ú[{}]({})r   rE   ú Tr6   r   Úbrr   r/   r   r   r   z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wrK   rL   )rM   rE   s     r"   rP   z!render_content.<locals>.<genexpr>­   s   è ø€ Ò/˜qªQœÑ/ùs   ‚Šz\n{3,}r   )Úlenr7   Úformatr   rX   rY   r<   r:   r#   r   r   rZ   rU   Úsub)	r^   r@   r+   r>   ÚpartsÚelr*   r   Úresults	            r"   Úrender_contentrv   Ž   s´  € áœ3˜|×1Ñ1Ó3Ó4°rÒ9Ø× Ñ  ¨Ó,Ð,ä˜ }Ó5€DØ€Eà�m‰mó <ˆØ�7‰7ˆ?Ø—8‘8“:ˆDÙØ—‘˜TÕ"Ø�W‰W˜Š^Ø—;‘;˜s¨$�;Ó/ˆDÙØ—‘˜TÔ"Ø�7‰7�gÒØ�L‰LÔ+¨B°Ó4Õ5Ø�W‰W˜Š_Ø�L‰L˜ÕØ�W‰W˜ÒØ—;‘;˜s¨$�;Ó/ˆDÚØ—‘˜TÕ"Ø�W‰W˜‹^Ø—6‘6˜& "Ó%ˆDØ—;‘; T�;Ó*ˆDÛ› T§_¡_°\Ö%BØ—‘˜Z×.Ñ.¨t°TÓ:Ö;ð+<ð. �[‰[Ñ/ 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 )NrH   Úincremental)rp   ÚsysÚargvrL   r$   r"   Úis_incrementalr{   µ   s'   € ÜŒs�x‰x‹=˜1ÑÒ=¤§¡¨!¡°Ñ!=Ð=r$   c                  ó^  — t        «       } t        dj                  t        | t        «      «       g }t        dt        dz   «      D ]†  }t        j                  t        |«      }t        dj                  ||«      «       	 t        |«      }t        |«      }t        dj                  t        |«      «      «       |s 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"«       y t        d#j                  |«      «       tC        jD                  d«       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)$Nz2[{}] Starting crawl (incremental={}, max_pages={})rH   z  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: {}...é(   rl   rQ   r@   rA   rR   z
  Total valid items: {}z  No items to import, exitingÚwz.jsonlFz/tmp)ÚmodeÚsuffixÚdeleteÚdiru
   {} ({}æ�¡)rT   rS   )r@   Úpage_urlrR   Úpublish_dateÚ	site_namerT   rS   )Úensure_asciiú
z  JSONL written: {}z3python3 /root/gov_crawler/import_jsonl.py '{}' '{}'r   z  OK Import completez  FAIL Import failed (exit={}))#r{   Úprintrq   Ú	SITE_NAMEÚ	MAX_PAGESÚrangeÚLIST_TPLÚCAT_IDr-   Ú	ExceptionrB   rp   Úextendr   Únowr   ÚINCREMENTAL_DAYSrA   Ú_date_filterÚ	enumerater<   ri   rv   ÚtempfileÚNamedTemporaryFiler   ÚwriteÚjsonÚdumpsÚcloserY   ÚosÚsystemry   Úexit)rx   Ú	all_itemsÚpager„   r=   Úer?   Úcutoff_dateÚtÚuÚdÚfilteredÚresultsÚidxr@   r+   Údate_from_listÚdetailÚtmpÚlabelÚrÚlineÚrets                          r"   Úmainr¯   ¹   sÐ  € Ü Ó"€KÜ	Ð
>×
EÑ
EÄiÐQ\Ô^gÓ
hÔið €IÜ�aœ Q™Ó'ò  ˆÜ—?‘?¤6¨4Ó0ˆÜÐ&×-Ñ-¨d°HÓ=Ô>ð	Ü˜“?ˆDô ˜4Ó ˆÜÐ"×)Ñ)¬#¨e«*Ó5Ô6ÙÙØ×Ñ˜Õð ô 
Ð
)×
0Ñ
0´°Y³Ó
@ÔAÙÜÐ)Ô*Øð €KÙÜ—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Ó:Ô;Ü�‰��øôW ò 	Ü�/×(Ñ(¨Ó+Ô,Ýûð	üô& ^øô ò 	Ü�/×(Ñ(¨Ó+Ô,Ø�N‰NØ¨Ø%×,Ñ,¨U°CÓ8Ø!°ñô õ
 ûð	úsC   Á=NÅOÅ!OÅ.OÇ!OÎ	OÎ(OÏOÏ	P,Ï AP'Ð'P,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   )"r›   ÚrequestsrU   r˜   ry   r•   r   r   r   r   Úurllib.parser   r;   rŽ   r�   rŠ   r’   r‹   ÚPER_PAGEÚHEADERSr(   ÚSessionr'   ÚheadersÚupdater#   r-   rB   ri   rv   r{   r¯   r“   Ú__name__rL   r$   r"   ú<module>r¾      sÇ   ðã 	ð÷
 -× ,× ,ß (Ý Û à%€Ø	€ØÐ(Ñ(€Ø'€	ØÐ Ø€	Ø€ð DØOØ0ñ€ð
 €à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óòòò>8òv$òN>òVòtð ˆzÒÙ…Fð r$   