Ë
    wju"  ã                   ó\  — 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Zej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ ddlmZmZ  ej$                  «        ed¬«      z
  j'                  d«      ZdZd	Zd
ddœZdZedz   ZdZdZdZdZdZefd„Zd„ Z d„ Z!d„ Z"d d„Z#e$dk(  rW ejJ                  «       Z&e&jO                  de(d¬«       e&jS                  «       Z* e#e*jV                  «      Z, e-de› de,› d�«       yy)!uæ  crawl_yangzhou_tzgg.py - æ‰¬å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘Š

ç«™ç‚¹: https://sthj.yangzhou.gov.cn/zfxxgk/fdzdgk/tzgg/index.html
CMS: JPAAS å�‘å¸ƒç³»ç»Ÿ (ä¸Ž crawl_yangzhou.py çŽ¯è¯„å®¡æ‰¹å�Œæº�, API åŠ¨æ€�åŠ è½½)
åˆ—è¡¨: /api-gateway/jpaas-publish-server/front/page/build/unit
      webId=5biGb8ANMvmWd52WUVRQu tplSetId=Y3ymqFLmqouIDOIdPh2n8
      pageId=KlS5SScWzHtnTxPQ7g7lk tagId=åˆ—è¡¨åˆ—è¡¨ (æ³¨æ„�: ä¸�æ˜¯ ajaxåˆ†é¡µ!)
      paramJson={"pageNo":N,"pageSize":15}; count=171 å…±12é¡µ
      è¿”å›ž HTML: li.clearfix > a[href=.../tzgg/art/YYYY/art_xxx.html] æ ‡é¢˜ + span æ—¥æœŸ
é™·é˜±: tagId=åˆ—è¡¨åˆ—è¡¨ è¿”å›žå…¨ç«™æœ€æ–°æ–‡ç« (å�« ywgz/wrfz ç­‰å…¶ä»–æ �ç›®)
      â†’ å¿…é¡»è¿‡æ»¤ href å�« /zfxxgk/fdzdgk/tzgg/ çš„æ�¡ç›®, å�ªæŠ“ç²¾å‡†å­�æ �ç›®
è¯¦æƒ…: div.artTitle æ ‡é¢˜ + ul.xxgk_head ç”Ÿæˆ�æ—¥æœŸ + div.artTxt æ­£æ–‡(å›žé€€ div.bt-content)
é™„ä»¶: /api-gateway/jpaas-web-server/front/document/download?fileUrl=... ç›¸å¯¹æ ¹è·¯å¾„ â†’ BASE+href
æ ‡é¢˜: strip &middot;&nbsp; å®žä½“å‰�ç¼€
é    N)Úpush_to_searchdb)ÚdatetimeÚ	timedeltaiG  )Údaysz%Y-%m-%du   æ‰¬å·žå¸‚-é€šçŸ¥å…¬å‘Šu   æ±Ÿè‹�zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z:https://sthj.yangzhou.gov.cn/zfxxgk/fdzdgk/tzgg/index.html)z
User-AgentÚRefererzhttps://sthj.yangzhou.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚKlS5SScWzHtnTxPQ7g7lkÚ5biGb8ANMvmWd52WUVRQuÚY3ymqFLmqouIDOIdPh2n8é   z/zfxxgk/fdzdgk/tzgg/c                 óÀ  — dt         t        dddt        t        j                  | |dœd¬«      dœ}t
        d	z   t        j                  j                  |«      z   }	 t        j                  |d
t        d¬«      }|j                  «       }|j                  di «      j                  dd«      S # t        $ r+}t        d| › d|› �t        j                  ¬«       Y d}~yd}~ww xY w)zFetch list page via JPAAS APIÚbulidstaticÚcolumnu   åˆ—è¡¨åˆ—è¡¨Únull)ÚpageNoÚpageSizeF©Úensure_ascii)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdÚ	paramJsonú?©é   é   ©ÚtimeoutÚheadersÚverifyÚdataÚhtmlÚ z[WARN] API fetch failed page ú: )ÚfileN)ÚWEB_IDÚTPL_IDÚPAGE_IDÚjsonÚdumpsÚAPI_URLÚurllibÚparseÚ	urlencodeÚrequestsÚgetÚHEADERSÚ	ExceptionÚprintÚsysÚstderr)Úpage_noÚ	page_sizeÚparamsÚurlÚrr$   Úes          ú(/root/gov_crawler/crawl_yangzhou_tzgg.pyÚ	fetch_apir@   (   sÄ   € ð #ÜÜØØØÜÜ—Z‘Z¨7À	Ñ JÐY^Ô_ñ	€Fô �C‰-œ&Ÿ,™,×0Ñ0°Ó8Ñ
8€CðÜ�L‰L˜ g´wÀuÔMˆØ�v‰v‹xˆØ�x‰x˜ Ó#×'Ñ'¨°Ó3Ð3øÜò ÜÐ-¨g¨Y°b¸¸Ð<Ä3Ç:Á:ÕNÜûðús   ÁAB) Â)	CÂ2!CÃCc                 óÄ  — g }t        j                  d| t         j                  «      D �]4  }|j                  d«      j	                  «       |j                  d«      |j                  d«      j	                  «       }}}t
        |vrŒ\t        j                  dd|«      }t        j                  dd|«      j	                  «       }t        j                  d	d|«      }t        |«      d
k  rŒ¾|j                  d«      s&|j                  d«      r	t        |z   nt        dz   |z   }t        j                  d|«      }|r|j                  d«      nd}|j                  |||dœ«       �Œ7 |S )u?   Extract tzgg items from API HTML. å�ªæŠ“ç²¾å‡† /tzgg/ å­�æ �ç›®zC<li[^>]*>\s*<a href="([^"]+)"[^>]*>(.*?)</a>\s*<span>([^<]*)</span>é   é   é   ú<[^>]+>r&   ú\s+ú õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+é   Úhttpú/ú(\d{4}-\d{2}-\d{2}))r<   Úpub_dateÚtitle)ÚreÚfinditerÚDOTALLÚgroupÚstripÚTZGG_PREFIXÚsubÚlenÚ
startswithÚBASEÚsearchÚappend)	r%   ÚitemsÚmÚhrefÚ
title_htmlÚ	date_textrN   ÚmdÚpds	            r?   Úextract_itemsrb   >   s%  € à€EÜ�[‰[Ð_ÐaeÔgi×gpÑgpÓqó DˆØ&'§g¡g¨a£j×&6Ñ&6Ó&8¸!¿'¹'À!»*ÀaÇgÁgÈaÃj×FVÑFVÓFX˜)ˆjˆä˜dÑ"ØÜ—‘�z 2 zÓ2ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆä—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>ØØ�‰˜vÔ&Ø"&§/¡/°#Ô"6”4˜$’;¼DÀ3¹JÈÑ<MˆDÜ�Y‰YÐ-¨yÓ9ˆÙˆR�X‰X�aŒ[ BˆØ�‰˜T¨r¸EÑBÖCðDð  €Ló    c                 ód  — t        j                  || «      }|sy| j                  d|j                  «       «      }|dk(  ry|dz   }d}t        j                  d| |d «      D ]J  }|j                  d«      j                  d«      r|dz  }Œ)|dz  }|dk(  sŒ4| |||j                  «       z    c S  | |d S )	u_   å¹³è¡¡ div åŒ¹é…�: ä»ŽåŒ¹é…�åˆ°çš„ <div...> çš„ '>' ä¹‹å�Ž, åˆ°å¯¹åº” </div>, è¿”å›žå†…éƒ¨ HTMLr&   ú>éÿÿÿÿrB   z<div[\s>]|</div>Nr   z<div)rO   rY   ÚfindÚstartrP   rR   rW   )r%   Úopen_tag_rer\   ÚgtÚiÚdepthÚmms          r?   Úextract_balanced_divrn   T   sº   € ä
�	‰	�+˜tÓ$€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨xÓ8ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)Ø�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€Orc   c                 óD  — 	 t        j                  | dt        d¬«      }d|_        |j                  }d}t        j                  d|t        j                  «      }|rYt        j                  dd|j                  d	«      «      j                  «       }t        j                  d
d|«      j                  «       }|s7t        j                  d|«      }|r|j                  d	«      j                  «       }t        j                  dd|«      }d}t        j                  d|«      }|r8t        j                  d|j                  d	«      «      }|r|j                  d	«      }|sPt        j                  d|«      }|r8t        j                  d|j                  d	«      «      }|r|j                  d	«      }d}dD ]G  }t        |dt        j                  |«      › d�«      }	|	j                  «       sŒ7|	j                  «       } n |j                  «       s,t        |d«      }	|	j                  «       r|	j                  «       }t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dd„ |«      }t        j                  dd„ |«      }t        j                  dd|«      }t        j                  dd|«      }|||j                  «       fS # t
        $ r Y yw xY w)uH   è¯¦æƒ…é¡µ: artTitle æ ‡é¢˜ + xxgk_head æ—¥æœŸ + artTxt/bt-content æ­£æ–‡r   Fr    zutf-8)r&   r&   r&   r&   z4<div[^>]*class="[^"]*artTitle[^"]*"[^>]*>(.*?)</div>rE   rB   rF   rG   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"rH   u   ç”Ÿæˆ�æ—¥æœŸ[^<]*<[^>]*>([^<]+)rL   z*<meta\s+name="PubDate"\s+content="([^"]+)")ÚartTxtz
bt-contentz<div[^>]*class="[^"]*z[^"]*"[^>]*>z?<div[^>]*class="[^"]*(?:TRS_Editor|article|content)[^"]*"[^>]*>z<script.*?</script>)Úflagsz<style.*?</style>z,href="(?!https?://|//|#|javascript:)([^"]+)"c                 ó°   — | j                  d«      j                  d«      rdt        › | j                  d«      › d�S dt        › d| j                  d«      › d�S )NrB   rK   zhref="ú"©rR   rW   rX   ©rm   s    r?   ú<lambda>zfetch_detail.<locals>.<lambda>˜   s[   € ÀÇÁÈ!Ã×AWÑAWÐX[ÔA\ &¬¨¨r¯x©x¸«{¨m¸1Ð =€ ÐdjÔkoÐjpÐpqÐrt×rzÑrzÐ{|Ór}Ðq~Ð~ð  cA€ rc   zsrc="(?!https?://|//)([^"]+)"c                 ó°   — | j                  d«      j                  d«      rdt        › | j                  d«      › d�S dt        › d| j                  d«      › d�S )NrB   rK   zsrc="rs   rt   ru   s    r?   rv   zfetch_detail.<locals>.<lambda>›   sW   € ÀÇÁÈÃ×@VÑ@VÐWZÔ@[ %¬ v¨b¯h©h°q«k¨]¸!Ð <€ ÐchÔimÐhnÐnoÐpr×pxÑpxÐyzÓp{Ðo|Ð|}Ða~€ rc   z%^(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+z%(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+$)r2   r3   r4   ÚencodingÚtextr5   rO   rY   rQ   rU   rR   rS   rn   ÚescapeÚI)
r<   r=   r%   rN   r\   r_   r`   ÚcontentÚclsÚcs
             r?   Úfetch_detailr   h   sŒ  € ðÜ�L‰L˜ g´wÀuÔMˆØˆŒ
Ø�v‰vˆð €EÜ
�	‰	ÐIÈ4ÔQS×QZÑQZÓ[€AÙÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙÜ�I‰IÐHÈ$ÓOˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEä�F‰FÐ4°b¸%Ó@€Eà€IÜ
�	‰	Ð4°dÓ;€AÙÜ�Y‰YÐ-¨q¯w©w°q«zÓ:ˆÙØŸ™ ›ˆIÙÜ�I‰IÐCÀTÓJˆÙÜ—‘Ð1°1·7±7¸1³:Ó>ˆBÙØŸH™H Q›K�	à€GØ'ò ˆÜ  Ð*?ÄÇ	Á	È#ÃÐ?OÈ|Ð'\Ó]ˆØ�7‰7�9Ø—g‘g“iˆGÙð	ð
 �=‰=Œ?Ü  Ð'iÓjˆØ�7‰7Œ9Ø—g‘g“iˆGÜ�f‰fÐ+¨R°ÄÇ	Á	ÌBÏDÉDÑ@PÔQ€GÜ�f‰fÐ)¨2¨w¼b¿i¹iÌ"Ï$É$Ñ>NÔO€Gä�f‰fÐDñ AØó€Gô �f‰fÐ5Ù~Øó€Gô �f‰fÐ=¸rÀ7ÓK€GÜ�f‰fÐ=¸rÀ7ÓK€GØ�)˜WŸ]™]›_Ð,Ð,øôe ò Ùðús   ‚0L Ì	LÌLr   c                 óp  — g }t        «       }t        | «      D �]Ã  }t        |dz   «      }|st        d|dz   › d�«        �nžt	        |«      }|st        d|dz   › d�«        �n|t        d|dz   › dt        |«      › d�«       |D �]U  }|d   r|d   t        k  rŒ|d   |v rŒ|j                  |d   «       t        |d   «      \  }}}	|	st        d	|d   › �«       ŒX|s|d
   }|xs |d   }
g }t        j                  d|	t        j                  «      D ]‚  }t        j                  dd|j                  d«      «      j                  «       }t        j                  dd|«      j                  «       }|j                  |xs d|j                  d«      dœ«       Œ„ |j                  ||d   |d   |
t         |	d|rt#        j$                  |d¬«      ndt&        dœ	«       �ŒX �ŒÆ t        dt        |«      › d�«       |D �cg c]  }|d   j                  «       sŒ|‘Œ }}|rt)        |d«       t        |«      S c c}w )NrB   z  Page z: empty (stop)z: 0 tzgg items (stop)r'   z tzgg itemsrM   r<   z    SKIP empty content: rN   z=<a[^>]*href="([^"]*(?:download|fileUrl)[^"]*)"[^>]*>(.*?)</a>rE   r&   rC   rF   rG   u   é™„ä»¶)rN   r<   Fr   z[])	rN   r<   Ú
source_urlrM   Ú	site_namer|   ÚsummaryÚattachmentsÚ
group_namez	  Total: ú itemsr|   Úyangzhou_tzgg)ÚsetÚranger@   r6   rb   rV   ÚCUTOFFÚaddr   rO   rP   rQ   rU   rR   rS   rZ   Ú	SITE_NAMEr,   r-   Ú
GROUP_NAMEr   )Ú	max_pagesÚrecordsÚseenÚpgr%   r[   ÚitrN   r_   r|   ra   ÚattsÚamÚatr=   Úvalids                   r?   Úrunr—   £   s;  € Ø€GÜ‹5€DÜ�IÓó "ˆÜ˜˜a™Ó ˆÙÜ�G˜B ™F˜8 >Ð2Ô3ÚÜ˜dÓ#ˆÙÜ�G˜B ™F˜8Ð#8Ð9Ô:ÚÜ�˜˜Q™�x˜r¤# e£* ¨[Ð9Ô:Øó 	ˆBØ�*Š~ " Z¡.´6Ò"9ØØ�%‰y˜DÑ ØØ�H‰H�R˜‘YÔÜ(4°R¸±YÓ(?Ñ%ˆE�9˜gÙÜÐ0°°E±°Ð<Ô=ØÙØ˜7™�ØÒ,˜b ™nˆBàˆDÜ—k‘kÐ"bÐdkÔmo×mvÑmvÓwò K�Ü—V‘V˜J¨¨B¯H©H°Q«KÓ8×>Ñ>Ó@�Ü—V‘V˜F C¨Ó,×2Ñ2Ó4�Ø—‘ b¢n¨H¸R¿X¹XÀa»[ÑIÕJðKð �N‰NØ r¨%¡yÀÀ5Á	Ø¬YÀ7ØÑVZ¬d¯j©j¸ÈEÕ.RÐ`dÜ(ñ	ö ò'	ð"ôF 
ˆI”c˜'“l�^ 6Ð
*Ô+ØÖ8�1 1 Y¡<×#5Ñ#5Õ#7ŠQÐ8€EÐ8ÙÜ˜ Ô0Üˆu‹:Ðùò 9s   Ç;H3ÈH3Ú__main__z--pages)ÚtypeÚdefaultz	[RESULT] r'   r†   )r   ).Ú__doc__r7   ÚosrO   r,   ÚargparseÚurllib.parser/   r2   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r   r   ÚnowÚstrftimerŠ   rŒ   r�   r4   rX   r.   r+   r)   r*   Ú	PAGE_SIZErT   r@   rb   rn   r   r—   Ú__name__ÚArgumentParserÚapÚadd_argumentÚintÚ
parse_argsÚargsÚpagesÚnr6   © rc   r?   ú<module>r²      s1  ðñ÷ 1× 0× 0Û à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (ß (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø$€	Ø€
ð DØKñ€ð &€Ø
ÐJÑ
J€Ø
!€Ø	 €Ø	 €Ø€	Ø$€ð "+ó ò,ò,ò(8-óv*ðZ ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø�=‰=‹?€DÙˆD�J‰J‹€AÙ	ˆI�i�[  1 # VÐ
,Õ-ð rc   