Ë
    6ß©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mZmZ ddlm	Z	 ddl
mZ dZedz   ZdZd	Zd
ZddddœZdZ ej&                  «       Zej*                  j-                  e«       d„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÃ   
Crawler for å…­å®‰å¸‚è£•å®‰åŒºç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€ - çŽ¯è¯„å®¡æ‰¹/è¡Œæ”¿å®¡æ‰¹
CMS: å®‰å¾½æ”¿åŠ¡å…¬å¼€CMS, UTF-8
Site: www.yuan.gov.cn/public/column/6596771?type=4&catId=7260215&action=list&nav=3
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttps://www.yuan.gov.cnz=/public/column/6596771?type=4&catId=7260215&action=list&nav=3u2   å…­å®‰å¸‚è£•å®‰åŒº-ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€-è¡Œæ”¿å®¡æ‰¹é   é   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                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)ÚsessionÚgetÚTIMEOUTÚencodingÚtext)ÚurlÚresps     úcrawl_yuan_zhq.pyÚfetchr      s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðó    c                 óü  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  dd¬«      D ]À  }|j                  dd	d
¬«      }|sŒ|d   j                  «       }|j	                  d
¬«      }|r|sŒD|j                  dd¬«      }|r|j	                  d
¬«      nd}	|j                  d«      rn+|j                  d«      r
t        |z   }nt        t        |«      }|j                  |||	dd f«       ŒÂ |S )uC   Parse list â€” ul.xxgk_nav_list > li.clearfix > a.title + span.dateúhtml.parserÚulÚxxgk_nav_list©Úclass_ÚliF)Ú	recursiveÚaÚtitleT)r   Úhrefr!   ©ÚstripÚspanÚdateÚ Úhttpú/Né
   )
r   ÚfindÚfind_allr#   Úget_textÚ
startswithÚBASE_URLr   ÚLIST_URLÚappend)
ÚhtmlÚsoupÚitemsr   r   r   r!   r    Ú	date_spanÚdate_strs
             r   Ú
parse_listr6   "   s  € ä˜˜}Ó-€DØ€EØ	�‰�4 ˆÓ	0€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò 3ˆØ�G‰G�C ¨dˆGÓ3ˆÙØØ�‰y�‰Ó ˆØ—
‘
 �
Ó&ˆÙ™DØà—G‘G˜F¨6�GÓ2ˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆð �?‰?˜6Ô"ØØ�_‰_˜SÔ!Ü˜d‘?‰Däœ8 TÓ*ˆDà�‰�e˜T 8¨C¨R =Ð1Õ2ð)3ð* €Lr   c           	      óº  — |€
t        «       }g }| j                  D �]·  }t        |t        «      r$|j	                  «       }|r|j                  |«       Œ8|j                  sŒEt        |«      |v rŒS|j                  t        |«      «       |j                  j                  «       }|dk(  �râg }|j                  D �]¨  }t        |t        «      r%|j	                  «       }|sŒ'|j                  |«       Œ9|j                  dk(  r›|j                  t        |«      «       |j                  dd«      j	                  «       }	|j                  d¬«      }
|	r8|
r6|	j                  d«      s%t        ||	«      }|j                  d|
› d	|› d
�«       ŒÎ|
sŒÑ|j                  |
«       Œã|j                  dk(  rp|j                  t        |«      «       |j                  dd«      }|s�Œ"|j                  dd«      }t        ||«      }|j                  |r	d|› d	|› d
�nd|› d
�«       �Œb|j                  dk(  r�Œst        |d«      s�Œ�|j                  dd¬«      }|s�Œ˜|j                  |«       �Œ« dj!                  |«      }|s�Œ\|j                  |«       �Œo|dk(  r˜g }|j#                  d«      D ]\  }|j#                  ddg«      D �cg c]  }|j                  dd¬«      ‘Œ }}|sŒ7|j                  ddj!                  |«      z   dz   «       Œ^ |s�Œê|j                  dj!                  |«      «       �Œ|dk(  rV|j                  dd«      }|s�Œ'|j                  dd«      }t        ||«      }|j                  |r	d|› d	|› d
�nd|› d
�«       �Œg|dv r|j%                  t'        |||«      «       �Œ‰|dk(  r�Œ�|j                  dd¬«      }|s�Œ§|j                  |«       �Œº |S c c}w )z•Recursively render content div children into text parts.
    Each <p> becomes one paragraph. <table> as Markdown. <div>/<section> recursed into.
    Úpr   r!   r&   Tr"   Ú
javascriptú[ú](ú)ÚimgÚsrcÚaltz![z![](Úbrr,   ú ÚtableÚtrÚtdÚthz| z | z |ú
)ÚdivÚsectionrD   rE   )ÚsetÚchildrenÚ
isinstanceÚstrr#   r0   ÚnameÚidÚaddÚlowerÚcontentsr   r,   r-   r   ÚhasattrÚjoinr+   ÚextendÚ_render_yuan_content)Únoder   Ú	processedÚpartsÚchildÚtxtÚtagÚp_partsÚelemÚahrefÚatxtÚ	full_hrefr>   r?   Úfull_srcÚjoinedÚrowsrC   rD   Úcellss                       r   rU   rU   A   su  € ð ÐÜ“Eˆ	Ø€Eà—‘ó H"ˆÜ�eœSÔ!Ø—+‘+“-ˆCÙØ—‘˜SÔ!ØØ�zŠzØÜˆe‹9˜	Ñ!ØØ�‰”b˜“iÔ à�j‰j×ÑÓ ˆà�#‹:ØˆGØŸ™ó ,�Ü˜d¤CÔ(ØŸ*™*›,�CÚØŸ™ sÕ+Ø—Y‘Y #Ò%Ø—M‘M¤" T£(Ô+Ø ŸH™H V¨RÓ0×6Ñ6Ó8�EØŸ=™=¨t˜=Ó4�DÙ¡¨e×.>Ñ.>¸|Ô.LÜ$+¨C°Ó$7˜	ØŸ™¨¨4¨&°°9°+¸QÐ'?Õ@ÚØŸ™ tÕ,Ø—Y‘Y %Ò'Ø—M‘M¤" T£(Ô+ØŸ(™( 5¨"Ó-�CÛØ"Ÿh™h u¨bÓ1˜Ü#*¨3°Ó#4˜ØŸ™Á#¨¨C¨5°°8°*¸AÑ'>ÈTÐRZÐQ[Ð[\ÐK]Ö^Ø—Y‘Y $Ò&ÙÜ˜T :Ö.ØŸ-™-¨°4˜-Ó8�CÛØŸ™ sÖ+ð5,ð6 —X‘X˜gÓ&ˆFÛØ—‘˜VÖ$à�GŠ^ØˆDØ—n‘n TÓ*ò A�Ø@BÇÁÈTÐSWÈLÓ@YÖZ¸"˜Ÿ™ S°˜Õ5ÐZ�ÐZÚØ—K‘K  u§z¡z°%Ó'8Ñ 8¸4Ñ ?Õ@ðAó Ø—‘˜TŸY™Y t›_Ö-à�EŠ\Ø—)‘)˜E 2Ó&ˆCÛØ—i‘i  rÓ*�Ü" 3¨Ó,�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTàÐ2Ñ2Ø�L‰LÔ-¨e°S¸)ÓDÖEà�DŠ[Ùð —.‘. ¨D�.Ó1ˆCÛØ—‘˜SÖ!ðQH"ðT €Lùò1 [s   Ê:Oc                 óJ  — t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  d	d
| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )uO   Clean excessive spaces from inline font/span fragments (å®‰å¾½æ”¿åŠ¡CMS style).z.([\u4e00-\u9fff])[ \t\u3000]+([\u4e00-\u9fff])z\1\2u4   ([\u4e00-\u9fff])[ \t\u3000]+([ã€Šï¼ˆã€�ã€Œã€Ž\[({])u,   \s+([ï¼Œã€‚ã€�ï¼›ï¼šï¼Ÿï¼�ï¼‰ã€‘ã€�ã€�)"\]])z\1u   ([ï¼ˆã€�ã€Œã€Ž\[({ã€Š])\s+z!(\d)[ \t\u3000]+([\u4e00-\u9fff])z!([\u4e00-\u9fff])[ \t\u3000]+(\d)z	(\d)\s+\.z\1.z(\d)\s+(\d)z
(:\s*)(\d)z:\2z {2,}rA   z +\nrF   z\n +)ÚreÚsubr#   )r   s    r   Ú_clean_yuan_spacesrh   –   sí   € ä�6‰6ÐCÀWÈdÓS€DÜ�6‰6ÐIÈ7ÐTXÓY€DÜ�6‰6ÐAÀ5È$ÓO€DÜ�6‰6Ð/°¸Ó=€DÜ�6‰6Ð6¸ÀÓF€DÜ�6‰6Ð6¸ÀÓF€DÜ�6‰6�, ¨Ó-€DÜ�6‰6�. '¨4Ó0€DÜ�6‰6�- ¨Ó.€DÜ�6‰6�(˜C Ó&€DÜ�6‰6�'˜4 Ó&€DÜ�6‰6�'˜4 Ó&€DØ�:‰:‹<Ðr   c                 óÀ  — t        | d«      }d}|j                  d«      }|r7|j                  d¬«      }t        j                  dd|«      j                  «       }d}|j                  dd¬	«      }|r;|j                  d¬«      }t        j                  d
|«      }|r|j                  d«      }d}	|j                  dd¬	«      }
|
s|j                  dd¬	«      }
|
s&|j                  dt        j                  d«      ¬	«      }
|
r(t        |
|«      }dj                  |«      }	t        |	«      }	|j                  dt        j                  d«      ¬	«      xs |}g }t        «       }|j                  dd¬«      D ]§  }|d   j                  «       j                  «       }t        j                  d|«      sŒ;t        ||d   j                  «       «      }||vsŒ]|j!                  |«       |j#                  |j                  d¬«      xs |j%                  d«      d   |dœ«       Œ© t'        |	j                  «       «      dk  r$|r"d|› d|› d�}	|D ]  }|	d|d   › d|d   › d�z  }	Œ |||	|fS ) uY   Parse detail â€” title from <title>, date from span.fbsj, content from div.xxgk-wenzhang.r   r&   r    Tr"   z_[^_]+$r$   Úfbsjr   z(\d{4}-\d{2}-\d{2})r   rG   ÚwzconÚgkwz_contnetzxxgk.wenzhang|wenzhangz

r   )r!   r!   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|txt)$r(   éÿÿÿÿ)r    r   r
   z<p><a href="z">u   </a></p>

é™„ä»¶åˆ—è¡¨ï¼š
z  - [r;   r   z)
)r   r*   r,   rf   rg   r#   ÚsearchÚgroupÚcompilerU   rS   rh   rI   r+   rP   r   rO   r0   ÚsplitÚlen)r1   r   r2   r    Ú	title_tagÚrawÚpub_dater4   ÚmÚcontent_htmlÚcontent_divrX   ÚscopeÚattachmentsÚ	seen_urlsr   r^   Úfull_urlÚatts                      r   Úparse_detailr~   §   s^  € ä˜˜}Ó-€Dð €EØ—	‘	˜'Ó"€IÙØ× Ñ  tÐ Ó,ˆä—‘�z 2 sÓ+×1Ñ1Ó3ˆð €HØ—	‘	˜&¨�	Ó0€IÙØ× Ñ  tÐ Ó,ˆÜ�I‰IÐ,¨cÓ2ˆÙØ—w‘w˜q“zˆHð €LØ—)‘)˜E¨'�)Ó2€KÙØ—i‘i ¨n�iÓ=ˆÙØ—i‘i ¬b¯j©jÐ9RÓ.S�iÓTˆÙÜ$ [°#Ó6ˆØ—{‘{ 5Ó)ˆä)¨,Ó7ˆð �I‰I�e¤B§J¡JÐ/HÓ$IˆIÓJÒRÈd€EØ€KÜ“€IØ�^‰^˜C dˆ^Ó+ò rˆØ�&‘	—‘Ó!×'Ñ'Ó)ˆÜ�9‰9Ð>ÀÕFÜ˜s A f¡I§O¡OÓ$5Ó6ˆHØ˜yÒ(Ø—‘˜hÔ'Ø×"Ñ"¨Q¯Z©Z¸d¨ZÓ-CÒ-^ÀxÇ~Á~ÐVYÓGZÐ[]ÑG^ÐgoÑ#pÕqðrô ˆ<×ÑÓÓ  2Ò%©+Ø% c U¨"¨U¨GÐ3PÐQˆØò 	DˆCØ˜e C¨¡L >°°C¸±J°<¸sÐCÑC‰Lð	Dð �(˜L¨+Ð5Ð5r   c                 ó>  — t        j                  «       t        t        ¬«      z
  }g }| D ]M  \  }}}|r1	 t        j                  |d«      }||k\  r|j                  |||f«       Œ:|j                  |||f«       ŒO |S # t        $ r |j                  |||f«       Y Œqw xY w)N)Údaysz%Y-%m-%d)r   Únowr   ÚINCREMENTAL_DAYSÚstrptimer0   Ú
ValueError)r3   ÚcutoffÚfilteredr    r   r5   Ú	item_dates          r   Úincremental_filterrˆ   Ý   s©   € Ü�\‰\‹^œiÔ-=Ô>Ñ>€FØ€HØ %ò 	4Ñˆˆs�HÙð8Ü$×-Ñ-¨h¸
ÓC�	Ø Ò&Ø—O‘O U¨C°Ð$:Ô;øð �O‰O˜U C¨Ð2Õ3ð	4ð €Oøô	 ò 8Ø—‘ ¨¨XÐ 6Ö7ð8ús   ´/A<Á<BÂBc                  ó*  — t        d„ dD «       «      } 	 t        t        «      }t        |«      }t        dt        |«      › d�t        j                  ¬«       | r3t        |«      }t        dt        |«      › d�t        j                  ¬«       t        «       }g }|D ]/  }|d   |vsŒ|j                  |d   «       |j                  |«       Œ1 t        d	t        |«      › �t        j                  ¬«       g }|D ]…  \  }}	}
	 t        |	«      }t        ||	«      \  }}}}|xs |}|xs |
}|j                  ||	|||rt        j                  |d
¬«      ndt         dœ«       t        d|d d › �t        j                  ¬«       Œ‡ |D ]"  }t        t        j                  |d
¬«      «       Œ$ y # t        $ r+}t        d|› �t        j                  ¬«       g }Y d }~�Œ§d }~ww xY w# t        $ r,}t        d|	› d|› �t        j                  ¬«       Y d }~�Œd }~ww xY w)Nc              3   ó@   K  — | ]  }|t         j                  v –— Œ y ­w©N)ÚsysÚargv)Ú.0Úargs     r   ú	<genexpr>zmain.<locals>.<genexpr>î   s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚinczList error: )ÚfilezTotal: z itemszIncremental: r   zUnique: F)Úensure_asciir&   )r    Úpage_urlÚpublish_dateÚcontentrz   Ú	site_namez  OK: é2   z  ERR z: )Úanyr   r/   r6   Ú	ExceptionÚprintrŒ   Ústderrrr   rˆ   rI   rO   r0   r~   ÚjsonÚdumpsÚ	SITE_NAME)Úis_incrementalr1   r3   ÚeÚseenÚunique_itemsÚitemÚresultsr    r   Ú	list_dateÚ	det_titleÚdet_dater—   rz   Úfinal_titleÚ
final_dateÚrs                     r   Úmainr­   í   s÷  € ÜÑ\Ð4[Ô\Ó\€NðÜ”X‹ˆÜ˜4Ó ˆô
 
ˆG”C˜“J�<˜vÐ
&¬S¯Z©ZÕ8ÙÜ" 5Ó)ˆÜ�œc %›j˜\¨Ð0´s·z±zÕBä‹5€DØ€LØò &ˆØ�‰7˜$ÒØ�H‰H�T˜!‘WÔØ×Ñ Õ%ð&ô
 
ˆH”S˜Ó&Ð'Ð
(¬s¯z©zÕ:à€GØ!-ò 8Ñˆˆs�Ið	8Ü˜“:ˆDÜ8DÀTÈ3Ó8OÑ5ˆI�x ¨+Ø#Ò, uˆKØ!Ò. YˆJØ�N‰NØ$ØØ *Ø"ÙNYœtŸz™z¨+ÀEÕJÐ_aÜ&ñô ô �F˜; s¨Ð+Ð,Ð-´C·J±JÖ?ð8ð$ ò 1ˆÜŒd�j‰j˜¨Ô/Õ0ñ1øôK ò Ü�˜Q˜CÐ ¤s§z¡zÕ2ØŽûðûôD ò 	8Ü�F˜3˜%˜r ! Ð%¬C¯J©J×7Ó7ûð	8ús0   ”F& Ã>A>GÆ&	GÆ/ GÇGÇ	HÇ&!HÈHÚ__main__r‹   )Ú__doc__Úrequestsrf   rž   rŒ   Úosr   r   Úbs4r   Úurllib.parser   r.   r/   r    r‚   Ú	MAX_PAGESÚHEADERSr   ÚSessionr   ÚheadersÚupdater   r6   rU   rh   r~   rˆ   r­   Ú__name__© r   r   ú<module>r»      sµ   ðñ÷
 #× "Ó "ß (Ý Ý  à$€ØÐUÑU€Ø@€	ØÐ Ø€	ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòó>Ròjò"36òlò ,1ð^ ˆzÒÙ…Fð r   