Ë
     ·‰jÍ6  ã                   ól  — 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„ Z ej4                  dej6                  «      Zd„ Zdd„Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  r e#«        yy)us   
Crawler for åŽŸå¹³å¸‚äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
CMS: TRS (æ‹“å°”æ€�), UTF-8
Site: www.yuanping.gov.cn/zwyw/tzgg/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.yuanping.gov.cnz/zwyw/tzgg/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                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)ÚsessionÚgetÚTIMEOUTÚencodingÚtext)ÚurlÚresps     ú(/root/gov_crawler/crawl_yuanping_tzgg.pyÚfetchr      s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðó    c           
      ó†  — t        | d«      }g }|j                  dd¬«      D �]  }|j                  dd¬«      D �]  }|j                  dd	¬
«      }|sŒ|d   j                  «       }|j	                  d	¬«      }|r|sŒD|j                  d«      }|r|j	                  d	¬«      nd}	|j                  d«      rnP|j                  d«      rt        t        |dd «      }n+|j                  d«      r
t        |z   }nt        t        |«      }|j                  |j                  «       ||	dd j                  dd«      f«       �Œ �Œ |S )u8   Parse list â€” div.jyfw > ul.jyfw2 > li > a + span(date)úhtml.parserÚulÚjyfw2©Úclass_ÚliF)Ú	recursiveÚaT©Úhrefr!   ©ÚstripÚspanÚ Úhttpz./é   Nú/é
   ú.ú-)r   Úfind_allÚfindr#   Úget_textÚ
startswithr   ÚLIST_URLÚBASE_URLÚappendÚreplace)
ÚhtmlÚsoupÚitemsr   r   r   r!   ÚtitleÚ	date_spanÚdate_strs
             r   Ú
parse_listr:   "   s4  € ä˜˜}Ó-€DØ€EØ�m‰m˜D¨ˆmÓ1ó QˆØ—+‘+˜d¨e�+Ó4ó 	QˆBØ—‘˜ $�Ó'ˆAÙØØ�V‘9—?‘?Ó$ˆDØ—J‘J T�JÓ*ˆEÙ¡ØØŸ™ ›ˆIÙ9B�y×)Ñ)°Ð)Ô5ÈˆHØ�‰˜vÔ&ØØ—‘ Ô&Üœx¨¨a¨b¨Ó2‘Ø—‘ Ô%Ü $‘‘äœx¨Ó.�Ø�L‰L˜%Ÿ+™+›-¨¨x¸¸¨}×/DÑ/DÀSÈ#Ó/NÐOÖPò%	QðQð( €Lr   c                  ó”   — t         g} t        dt        dz   «      D ]*  }|dz
  dk  sŒ| j                  t         d|dz
  › d�z   «       Œ, | S )Nr'   é   éW   Úindex_z.html)r0   ÚrangeÚ	MAX_PAGESr2   )ÚurlsÚis     r   Úget_page_urlsrC   =   sS   € Üˆ:€DÜ�1”i !‘mÓ$ò 8ˆØˆq‰5�B‹;Ø�K‰Kœ V¨A¨a©C¨5°Ð#6Ñ6Õ7ð8ð €Kr   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|txt)$c                 ó  — t        | t        «      r| j                  «       }|r	|dk7  r|g fS dg fS | j                  sdg fS | j                  j	                  «       }|dk(  rz| j                  dd«      j                  «       }| j                  dd¬«      }|sdg fS |r;t        ||«      }t        j                  |«      rd|› d	|› d
�||dœgfS d|› d	|› d
�g fS |g fS |dk(  rE| j                  dd«      }|sdg fS | j                  dd«      xs d}t        ||«      }	d|	› d	|› d
�g fS |dv rdg fS g }
g }| j                  D ]5  }t        ||«      \  }}|r|
j                  |«       |j                  |«       Œ7 dj                  |
«      |fS )uœ   Render a node to inline HTML, preserving <a href> links and converting
    <img> to <a href=full_src>æŸ¥çœ‹å›¾ç‰‡</a>. Returns (html_str, attachments).
    ú&nbsp;r%   r   r!   ú Tr"   z	<a href="ú">z</a>©r7   r   ÚimgÚsrcÚaltõ   æŸ¥çœ‹å›¾ç‰‡©ÚbrÚstyleÚscriptÚiframeÚobjectÚembedÚparam)Ú
isinstanceÚstrr#   ÚnameÚlowerr   r.   r   Ú	ATTACH_REÚsearchÚchildrenÚ_render_node_inliner2   ÚextendÚjoin)Únoder   ÚtxtÚtagr!   r   ÚfullrJ   rK   Úfull_srcÚoutÚattsÚchÚhr   s                  r   r\   r\   H   s¿  € ô �$œÔØ�j‰j‹lˆÙ�3˜(’?Ø˜�7ˆNØ�2ˆvˆØ�9Š9Ø�2ˆvˆØ
�)‰)�/‰/Ó
€CØ
ˆc‚zØ�x‰x˜ Ó#×)Ñ)Ó+ˆØ�}‰}˜S¨ˆ}Ó-ˆÙØ�r�6ˆMÙÜ˜3 Ó%ˆDÜ×Ñ Ô%Ø" 4 &¨¨4¨&°Ð5À$ÈtÑ8TÐ7UÐUÐUØ˜t˜f B t f¨DÐ1°2Ð5Ð5Ø�RˆxˆØ
ˆe‚|Ø�h‰h�u˜bÓ!ˆÙØ�r�6ˆMØ�h‰h�u˜bÓ!Ò3 ^ˆÜ˜3 Ó$ˆØ˜8˜* B s e¨4Ð0°"Ð4Ð4Ø
ÐMÑMØ�2ˆvˆà
€CØ€DØ�m‰mò ˆÜ" 2 sÓ+‰ˆˆ1ÙØ�J‰J�qŒMØ�‰�A�ð	ð
 �7‰7�3‹<˜ÐÐr   c                 ój  — |€
t        «       }g }| j                  D �]  }t        |t        «      r-|j	                  «       }|r|dk7  r|j                  d|› d�«       ŒA|j                  sŒNt        |«      |v rŒ\|j                  t        |«      «       |j                  j                  «       }|dk(  r¸g }|j                  D ]m  }t        |t        «      r+|j	                  «       }	|	sŒ&|	dk7  sŒ,|j                  |	«       Œ>|j                  sŒKt        ||«      \  }
}|
sŒ]|j                  |
«       Œo dj                  |«      j	                  «       }|s�Œ6|j                  d|› d�«       �ŒM|dk(  rR|j                  dd«      }|s�Œh|j                  dd«      xs d	}t        ||«      }|j                  d
|› d|› d�«       �Œ¤|dv r|j                  t        |||«      «       �ŒÆ|dv r�ŒÌ|dk(  r|j                  t        |«      «       �Œít        ||«      \  }
}|
s�Œ |j                  d|
› d�«       �Œ |S )uÈ   Recursively render content container children into paragraph parts.
    Produces <p>...</p> HTML segments (text + inline <a href> links),
    images as <p><a href="full_src">æŸ¥çœ‹å›¾ç‰‡</a></p>.
    rE   z<p>z</p>Úpr%   rI   rJ   rK   rL   ú<p><a href="rG   z</a></p>)ÚdivÚsectionrM   Útable)Úsetr[   rU   rV   r#   r2   rW   ÚidÚaddrX   r\   r^   r   r   r]   Ú_render_trs_children)r_   r   Ú	processedÚpartsÚchildr`   ra   Úinnerrf   Útrg   Ú_Úp_textrJ   rK   rc   s                   r   rq   rq   s   sþ  € ð
 ÐÜ“Eˆ	Ø€EØ—‘ó ),ˆÜ�eœSÔ!Ø—+‘+“-ˆCÙ�s˜h’Ø—‘˜s 3 % t˜_Ô-ØØ�zŠzØÜˆe‹9˜	Ñ!ØØ�‰”b˜“iÔ Ø�j‰j×ÑÓ ˆØ�#Š:ØˆEØ—n‘nò (�Ü˜b¤#Ô&ØŸ™›
�AÚ˜Q (›]ØŸ™ Q�Ø—W“WÜ.¨r°3Ó7‘D�A�qÚØŸ™ Q�ð(ð —W‘W˜U“^×)Ñ)Ó+ˆFÛØ—‘˜s 6 (¨$Ð/Ö0Ø�EŠ\Ø—)‘)˜E 2Ó&ˆCÛØ—i‘i  rÓ*Ò<¨n�Ü" 3¨Ó,�Ø—‘˜|¨H¨:°R¸°u¸HÐEÖFØÐ&Ñ&Ø�L‰LÔ-¨e°S¸)ÓDÖEØÐSÑSÙØ�GŠ^Ø�L‰Lœ˜U›Ö$ä& u¨cÓ2‰DˆAˆqÛØ—‘˜s 1 # T˜]Ö+ðS),ðT €Lr   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 )z—Clean excessive spaces from TRS inline font/span fragments.
    Use [^\S\n] (whitespace excluding newline) to avoid crossing paragraph boundaries.
    z*([\u4e00-\u9fff])[^\S\n]+([\u4e00-\u9fff])z\1\2u0   ([\u4e00-\u9fff])[^\S\n]+([ã€Šï¼ˆã€�ã€Œã€Ž\[({])u2   [^\S\n]+([ï¼Œã€‚ã€�ï¼›ï¼šï¼Ÿï¼�ï¼‰ã€‘ã€�ã€�)\"\]])z\1u   ([ï¼ˆã€�ã€Œã€Ž\[({ã€Š])[^\S\n]+z(\d)[^\S\n]+([\u4e00-\u9fff])z([\u4e00-\u9fff])[^\S\n]+(\d)z(\d)[^\S\n]+\.z\1.z(\d)[^\S\n]+(\d)z
(:\s*)(\d)z:\2z {2,}rF   z +\nú
z\n +)ÚreÚsubr#   )r   s    r   Ú_clean_trs_spacesr}   ¨   sò   € ô
 �6‰6Ð?ÀÈ$ÓO€Dä�6‰6ÐEÀwÐPTÓU€Dä�6‰6ÐGÈÐPTÓU€Dä�6‰6Ð4°e¸TÓB€Dä�6‰6Ð2°G¸TÓB€DÜ�6‰6Ð2°G¸TÓB€Dä�6‰6Ð# V¨TÓ2€Dä�6‰6Ð% w°Ó5€Dä�6‰6�- ¨Ó.€Dä�6‰6�(˜C Ó&€Dä�6‰6�'˜4 Ó&€DÜ�6‰6�'˜4 Ó&€DØ�:‰:‹<Ðr   c                 óD   — dD ]  }| j                  d|¬«      }|sŒ|c S  y)z4Find the main content container with fallback chain.)Ú
TRS_Editorr   ÚcontentÚarticleÚzwxlÚ
detail_conÚwzconrk   r   N)r-   )r5   Úclsrk   s      r   Ú_find_content_divr†   Å   s0   € àZò ˆØ�i‰i˜ cˆiÓ*ˆÚØŠJðð r   c           
      óÄ  ‡— t        | d«      }d}|j                  dd¬«      }|D ])  }|j                  d«      }|sŒ|j                  d¬«      } n |s%|j                  d	«      }|r|j                  d¬«      }d}t	        |«      }	|	��|	j                  d
«      }
|
D ]y  }|j                  d¬«      }t        j                  d|«      }|sŒ.|j                  d«      › dt        |j                  d«      «      d›dt        |j                  d«      «      d›�} n |s~|
D ]y  }|j                  d¬«      }t        j                  d|«      }|sŒ.|j                  d«      › dt        |j                  d«      «      d›dt        |j                  d«      «      d›�} n d}t	        |«      }	|	r?t        |	‰«      }dj                  |«      }t        j                  dd|«      }t        |«      }ˆfd„}|	r ||	«      ng }|s ||«      }|sx|j                  «       sht        j                  d| t        j                  «      }|rAt!        ‰|j                  d«      «      }|j#                  |j%                  d«      d   |dœ«       d}|D ]  }|d   |vsŒ|d|d   › d|d	   › d�z  }Œ |j                  «       r|j                  «       }n|r	d‰› d|› d�nd}|r|r|dz   |z   n|}n|}||||fS )uK   Parse detail â€” h1 title + date span + content container (fallback chain).r   r%   rk   Újzr   Úh1Tr"   r7   r$   u@   å�‘å¸ƒæ—¶é—´[:ï¼š]\s*(\d{4})[-å¹´/](\d{1,2})[-æœˆ/](\d{1,2})æ—¥?r<   r+   r'   Ú02dé   u+   (\d{4})[-å¹´/](\d{1,2})[-æœˆ/](\d{1,2})æ—¥?rz   z\n{3,}z

c                 óž  •‡— g }t        «       }| j                  dd¬«      D ]¨  Š‰d   j                  «       }t        j	                  |«      sŒ,‰j                  d¬«      }|sŒAd|v sd|v rŒJ‰j                  dd	g«      rŒ^t        ˆfd
„dD «       «      rŒst        ‰|«      }||vsŒ„|j                  |«       |j                  ||dœ«       Œª |S )Nr   Tr    r!   r"   u	   pdfè½¯ä»¶u   ä¸‹è½½è½¯ä»¶ÚnavÚfooterc              3   óB   •K  — | ]  }‰j                  |¬ «      –— Œ y­w)r   N)Úfind_parent)Ú.0Úcr   s     €r   ú	<genexpr>z=parse_detail.<locals>._collect_attachments.<locals>.<genexpr>  s   øè ø€ Òm¨q�1—=‘=¨�=×*Ñmùs   ƒ)rŽ   r�   Ú
pagefooterÚfootÚtopÚheaderrH   )rn   r,   r#   rY   rZ   r.   r�   Úanyr   rp   r2   )Úscoperd   ÚseenÚahrefr   Úfull_urlr   r   s         @€r   Ú_collect_attachmentsz*parse_detail.<locals>._collect_attachments  sÒ   ù€ ØˆÜ‹uˆØ—‘ ¨$�Ó/ò 	=ˆAØ�f‘I—O‘OÓ%ˆEÜ×#Ñ# EÔ*ØØ—:‘: D�:Ó)ˆDÙØØ˜dÑ" n¸Ñ&<ØØ�}‰}˜e XÐ.Ô/ØÜÓmÐ4lÔmÔmØÜ˜s EÓ*ˆHØ˜tÒ#Ø—‘˜Ô"Ø—
‘
 T°(Ñ;Õ<ð!	=ð" ˆ
r   z%pdfurl\s*=\s*['\"]([^'\"]+\.pdf)['\"]r(   éÿÿÿÿrH   r   rj   rG   z	</a></p>
)r   r,   r-   r.   r†   Úfind_all_previousr{   rZ   ÚgroupÚintrq   r^   r|   r}   r#   ÚIr   r2   Úsplit)r4   r   r5   r7   Újz_divsrˆ   r‰   rv   Úpub_dateÚcontent_divÚ
prev_spansr$   r`   ÚmÚcontent_htmlrs   r�   Úattachmentsrœ   Úatt_segmentsÚattÚbodys    `                    r   Úparse_detailr®   Î   s  ø€ ä˜˜}Ó-€Dð €EØ�m‰m˜E¨$ˆmÓ/€GØò ˆØ�W‰W�T‹]ˆÚØ—K‘K d�KÓ+ˆEÙð	ñ
 Ø�I‰I�gÓˆÙØ—J‘J T�JÓ*ˆEð €HÜ# DÓ)€KØÑð
 !×2Ñ2°6Ó:ˆ
Øò 	ˆDØ—-‘- d�-Ó+ˆCÜ—	‘	Ð]Ð_bÓcˆAÚØŸg™g a›j˜\¨¬3¨q¯w©w°q«z«?¸3Ð*?¸qÄÀQÇWÁWÈQÃZÃÐQTÐ@UÐV�Ùð	ñ Ø"ò �Ø—m‘m¨$�mÓ/�Ü—I‘IÐLÈcÓR�ÚØ"#§'¡'¨!£* ¨Q¬s°1·7±7¸1³:«¸sÐ.CÀ1ÄSÈÏÉÐQRËÃ_ÐUXÐDYÐZ�HÙðð €LÜ# DÓ)€KÙÜ$ [°#Ó6ˆØ—y‘y Ó'ˆÜ—v‘v˜i¨°Ó>ˆÜ(¨Ó6ˆô
ñ, 8CÑ& {Ô3È€KÙÙ*¨4Ó0ˆñ ˜|×1Ñ1Ô3Ü�I‰IÐ>ÀÄbÇdÁdÓKˆÙÜ˜s A§G¡G¨A£JÓ/ˆHØ×Ñ¨¯©¸Ó)<¸RÑ)@ÈÑRÔSð
 €LØò RˆØˆu‰:˜\Ò)Ø˜l¨3¨u©:¨,°b¸¸W¹¸ÀjÐQÑQ‰LðRð ×ÑÔØ×!Ñ!Ó#‰á:?�˜c˜U " U G¨:Ñ6ÀRˆÙÙ7;�t˜f‘} |Ò3À‰àˆà�(˜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Ústrptimer2   Ú
ValueError)r6   ÚcutoffÚfilteredr7   r   r9   Ú	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        «       }g }t        |«      D ]_  \  }}	 t        |«      }t	        |«      }|s nAt        d|dz   › dt        |«      › d�t        j                  ¬«       |j                  |«       Œa t        d
t        |«      › �t        j                  ¬«       | r2t        |«      }t        dt        |«      › �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        $ r2}t        d|dz   › d|› d	|› �t        j                  ¬«       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)r‘   Úargs     r   r“   zmain.<locals>.<genexpr>K  s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚinczPage r<   z: z items)Úfilez error (z): zTotal: zIncremental: zUnique: F)Úensure_asciir%   )r7   Úpage_urlÚpublish_dater€   rª   Ú	site_namez  OK: é2   z  ERR )r˜   rC   Ú	enumerater   r:   ÚprintÚlenr¼   Ústderrr]   Ú	Exceptionr¸   rn   rp   r2   r®   ÚjsonÚdumpsÚ	SITE_NAME)Úis_incrementalÚ	page_urlsÚ	all_itemsÚidxr   r4   r6   Úerš   Úunique_itemsÚitemÚresultsr7   Ú	list_dateÚ	det_titleÚdet_dater€   rª   Úfinal_titleÚ
final_dateÚrs                        r   ÚmainrÝ   J  se  € ÜÑ\Ð4[Ô\Ó\€NÜ“€Ià€IÜ˜iÓ(ò 	G‰ˆˆSð	GÜ˜“:ˆDÜ˜tÓ$ˆEÙÙÜ�E˜#˜a™%˜ ¤3 u£: ,¨fÐ5¼C¿J¹JÕGØ×Ñ˜UÕ#ð	Gô 
ˆG”C˜	“NÐ#Ð
$¬3¯:©:Õ6ÙÜ& yÓ1ˆ	Ü�œc )›nÐ-Ð.´S·Z±ZÕ@ä‹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øôI ò 	GÜ�E˜#˜a™%˜ ¨¨¨S°°Ð4¼3¿:¹:×FÓFûð	GûôB ò 	8Ü�F˜3˜%˜r ! Ð%¬C¯J©J×7Ó7ûð	8ús6   ±HÁ?HÅA>I È	H=È'H8È8H=É 	I5É	!I0É0I5Ú__main__r»   )%Ú__doc__Úrequestsr{   rÌ   r¼   Úosr   r   Úbs4r   Úurllib.parser   r1   r0   rÎ   r²   r@   ÚHEADERSr   ÚSessionr   ÚheadersÚupdater   r:   rC   Úcompiler¢   rY   r\   rq   r}   r†   r®   r¸   rÝ   Ú__name__© r   r   ú<module>rë      sÝ   ðñ÷
 #× "Ó "ß (Ý Ý  à'€Ø�mÑ#€Ø$€	ØÐ Ø€	ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòò6ð ˆB�J‰JÐ@À"Ç$Á$ÓG€	ò(óV2òjò:òi6òXò 21ðj ˆzÒÙ…Fð r   