Ë
    5wj¼   ã                   ó`  — 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
Zedz   ZdZdZdZdZdedz   dœZd„ Z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_jiangshan_hpsp.py - æ±Ÿå±±å¸‚-çŽ¯è¯„ä¿¡æ�¯å…¬ç¤º

ç«™ç‚¹: https://www.jiangshan.gov.cn/col/col1229857236/index.html?uid=9057648
CMS: æµ™æ±Ÿ JPAAS (unitbuild.js, webId=1839, å�Œæ‰¬å·žä½“ç³»)
åˆ—è¡¨: /api-gateway/jpaas-publish-server/front/page/build/unit?parseType=bulidstatic&webId=1839
      &tplSetId=DdaSIvZkD2fqQMzw19yIN&pageType=column&tagId=æ–‡ç« åˆ—è¡¨&pageId=1229857236
      &paramJson={"pageNo":N,"pageSize":15} â†’ JSON data.html
      âš ï¸� ä¸¤ç§�é“¾æŽ¥æ ¼å¼�: æ–° art_<32hex>.html (/col/col.../art/YYYY/) + æ—§ /art/YYYY/M/D/art_<colid>_<numid>.html
      âš ï¸� P2 ç¨€ç–�(4æ�¡) å�Ž P3 æ�¢å¤� 15 æ�¡(æ—§æ ¼å¼�) â€” æ··å�ˆåˆ†é¡µ, ç”¨ pageNo å¾ªçŽ¯+åŽ»é‡�
è¯¦æƒ…: meta ArticleTitle + meta PubDate + div.article_text æ­£æ–‡(å¹³è¡¡div)
âš ï¸� WAF: é¡» Chrome UA + Referer, å�¦åˆ™ 403
é    N)Úpush_to_searchdb)ÚdatetimeÚ	timedeltaiG  )Údaysz%Y-%m-%du   æ±Ÿå±±å¸‚-çŽ¯è¯„ä¿¡æ�¯å…¬ç¤ºu   æµ™æ±Ÿzhttps://www.jiangshan.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚ
1229857236Ú1839ÚDdaSIvZkD2fqQMzw19yINé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z)/col/col1229857236/index.html?uid=9057648)z
User-AgentÚRefererc                 óÒ   — 	 t        j                  | dt        d¬«      }d|_        |j                  S # t
        $ r+}t        d| › d|› �t        j                  ¬«       Y d }~yd }~ww xY w)	N©é   é   F©ÚtimeoutÚheadersÚverifyzutf-8z[WARN] fetch failed: z - ©ÚfileÚ )	ÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚrÚes      ú)/root/gov_crawler/crawl_jiangshan_hpsp.pyÚfetchr$   $   sZ   € ðÜ�L‰L˜ g´wÀuÔMˆØˆŒ
Ø�v‰vˆøÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   ‚/2 ²	A&»!A!Á!A&c                 óÈ  — dt         t        dddt        t        j                  | t
        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)u   JPAAS API åˆ—è¡¨ÚbulidstaticÚcolumnu   æ–‡ç« åˆ—è¡¨Únull)ÚpageNoÚpageSizeF©Úensure_ascii)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdÚ	paramJsonú?r   r   ÚdataÚhtmlr   z[WARN] API fetch failed page ú: r   N)ÚWEB_IDÚTPL_IDÚPAGE_IDÚjsonÚdumpsÚ	PAGE_SIZEÚAPI_URLÚurllibÚparseÚ	urlencoder   r   r   r   r   r   r   )Úpage_noÚparamsr    r!   r6   r"   s         r#   Ú	fetch_apirE   .   sÀ   € ð #¬VÄØ ~À6ÜÜ—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!Â6!CÃC!c                 ó  — g }t        j                  d| t         j                  «      D �]U  }|j                  d«      |j                  d«      |j                  d«      |j                  d«      j	                  «       f\  }}}}t        j
                  d|«      st        j
                  d|«      sŒ†|xs t        j                  dd	|«      j	                  «       }t        j                  d
d|«      j	                  «       }t        j                  dd	|«      }t        |«      dk  rŒú|j                  d«      r	t        |z   n|}t        j
                  d|«      }	|	r|	j                  d«      nd	}
|j                  ||
|dœ«       �ŒX |S )u?   ä»Ž API HTML æ��å�–æ�¡ç›®, å�ªæŠ“æœ¬æ �ç›® (ä¸¤ç§�é“¾æŽ¥æ ¼å¼�)zM<a\s+href="([^"]+)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>\s*<span>([^<]*)</span>é   é   é   é   zart_[0-9a-f]{32}\.htmlzart_1229857236_\d+\.htmlú<[^>]+>r   ú\s+ú õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+ú/ú(\d{4}-\d{2}-\d{2}))r    Úpub_dateÚtitle)ÚreÚfinditerÚDOTALLÚgroupÚstripÚsearchÚsubÚlenÚ
startswithÚBASEÚappend)r7   ÚitemsÚmÚhrefÚ
title_attrÚ
title_htmlÚ	date_textrR   r    ÚmdÚpds              r#   Úextract_itemsrf   @   sC  € à€EÜ�[‰[ÐiÐkoÔqs×qzÑqzÓ{ó CˆØ23·'±'¸!³*¸a¿g¹gÀa»jÈ!Ï'É'ÐRSË*ÐVW×V]ÑV]Ð^_ÓV`×VfÑVfÓVhÐ2hÑ/ˆˆj˜* iä—	‘	Ð3°TÔ:¼b¿i¹iÐHcÐeiÔ>jØØÒAœrŸv™v j°"°jÓA×HÑHÓJˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆä—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>ØØ!Ÿ_™_¨SÔ1Œd�TŠk°tˆÜ�Y‰YÐ-¨yÓ9ˆÙˆR�X‰X�aŒ[ BˆØ�‰˜S¨b¸5ÑAÖBðCð €Ló    c                 óà  — t        j                  || t         j                  «      }|sy| j                  d|j	                  «       «      }|dk(  ry|dz   }d}t        j
                  d| |d t         j                  «      D ]j  }|j                  d«      j                  d«      s |j                  d«      j                  d	«      r|dz  }ŒI|dz  }|dk(  sŒT| |||j	                  «       z    c S  | |d S )
u&   å¹³è¡¡ div åŒ¹é…� (å¤§å°�å†™ä¸�æ•�æ„Ÿ)r   ú>éÿÿÿÿrG   z<div[\s>]|</div>Nr   z<divz<DIV)rS   rX   ÚIÚfindÚstartrT   rV   r[   )r7   Úopen_tag_rer_   ÚgtÚiÚdepthÚmms          r#   Úextract_balanced_divrs   U   sÛ   € ä
�	‰	�+˜t¤R§T¡TÓ*€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨x¼¿¹Ó>ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)¨R¯X©X°a«[×-CÑ-CÀFÔ-KØ�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€Org   c                 óF  ‡ ‡— t        ‰ «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }|s€t        j                  d|t        j
                  «      }|rYt        j                  dd|j                  d«      «      j	                  «       }t        j                  dd|«      j	                  «       }t        j                  d	d|«      }t        j                  d
d|«      }d}t        j                  d|«      }|r8t        j                  d|j                  d«      «      }|r|j                  d«      }d}t        |d«      }|j	                  «       r|j	                  «       }|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  ¬«      }ddl	m
Š t        j                  dˆ ˆfd„|«      }t        j                  dˆ ˆfd„|«      }t        j                  dd|«      }t        j                  dd|«      }|||j	                  «       fS )uA   è¯¦æƒ…é¡µ: meta ArticleTitle + meta PubDate + article_text æ­£æ–‡)r   r   r   r   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"rG   z<h1[^>]*>(.*?)</h1>rK   rL   rM   rN   uj   _(æ±Ÿå±±å¸‚äººæ°‘æ”¿åºœ|æ±Ÿå±±å¸‚|æ±Ÿå±±å¸‚äººæ°‘æ”¿åºœç½‘ç«™|å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º)$z*<meta\s+name="PubDate"\s+content="([^"]+)"rP   z-<div[^>]*class="[^"]*article_text[^"]*"[^>]*>zS<div[^>]*class="[^"]*(?:article-content|content|TRS_Editor|TRS_UEDITOR)[^"]*"[^>]*>z<script.*?</script>)Úflagsz<style.*?</style>r   )Úurljoinz,href="(?!https?://|//|#|javascript:)([^"]+)"c                 ó<   •— d ‰‰| j                  d«      «      › d�S )Nzhref="rG   ú"©rV   ©rr   r    rv   s    €€r#   ú<lambda>zfetch_detail.<locals>.<lambda>�   s    ø€  &©°°b·h±h¸q³kÓ)BÐ(CÀ1Ð E€ rg   zsrc="(?!https?://|//)([^"]+)"c                 ó<   •— d ‰‰| j                  d«      «      › d�S )Nzsrc="rG   rx   ry   rz   s    €€r#   r{   zfetch_detail.<locals>.<lambda>‘   s    ø€  %©°°R·X±X¸a³[Ó(AÐ'BÀ!Ð D€ rg   z%^(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+z%(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+$)r$   rS   rX   rV   rW   rU   rY   rs   rk   Úurllib.parserv   )	r    r7   rR   r_   rc   rd   ÚcontentÚcrv   s	   `       @r#   Úfetch_detailr€   i   s  ù€ ä�‹:€DÙØà€EÜ
�	‰	ÐDÀdÓK€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ,¨d´B·I±IÓ>ˆÙÜ—F‘F˜: r¨1¯7©7°1«:Ó6×<Ñ<Ó>ˆEÜ—F‘F˜6 3¨Ó.×4Ñ4Ó6ˆEÜ�F‰FÐ4°b¸%Ó@€EÜ�F‰Fð  Að  CEð  GLó  M€Eà€IÜ
�	‰	Ð?ÀÓF€AÙÜ�Y‰YÐ-¨q¯w©w°q«zÓ:ˆÙØŸ™ ›ˆIà€GÜ˜TÐ#SÓT€AØ‡w�w„yØ—'‘'“)ˆØ�=‰=Œ?Ü  Ð'}Ó~ˆØ�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ÜEÀwóP€Gä�f‰fÐ5ÜDÀgóO€Gô �f‰fÐ=¸rÀ7ÓK€GÜ�f‰fÐ=¸rÀ7ÓK€GØ�)˜WŸ]™]›_Ð,Ð,rg   r   c                 ó¾  — 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 �]|  }|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 ]©  }|j                  d«      t        j                  dd|j                  d«      «      j                  «       }}t        j                  d|t        j                   «      s%d|j#                  «       v sd|j#                  «       v sŒ’|j%                  |xs d|dœ«       Œ« |j%                  ||d   |d   |
t&        |	d|rt)        j*                  |d¬«      ndt,        dœ	«       �Œ �Œí t        dt        |«      › d�«       |D �cg c]  }|d   j                  «       sŒ|‘Œ }}|rt/        |d«       t        |«      S c c}w )NrG   z  Page z: 0 items (stop)r8   ú itemsrQ   r    z    SKIP empty content: rR   z$<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>rK   r   rH   z*\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps)$ÚdownloadÚfileUrlu   é™„ä»¶)rR   r    Fr+   z[])	rR   r    Ú
source_urlrQ   Ú	site_namer~   ÚsummaryÚattachmentsÚ
group_namez	  Total: r~   Újiangshan_hpsp)ÚsetÚrangerE   r   rf   rZ   ÚCUTOFFÚaddr€   rS   rT   rU   rV   rY   rW   rX   rk   Úlowerr]   Ú	SITE_NAMEr<   r=   Ú
GROUP_NAMEr   )Ú	max_pagesÚrecordsÚseenÚpgr7   r^   ÚitrR   rc   r~   re   ÚattsÚamÚhÚtr!   Úvalids                    r#   Úrunrœ   ˜   sr  € Ø€GÜ‹5€DÜ�IÓó "ˆÜ˜˜a™Ó ˆÙÜ�G˜B ™F˜8Ð#3Ð4Ô5ÚÜ˜dÓ#ˆÙÜ�G˜B ™F˜8Ð#3Ð4Ô5ÚÜ�˜˜Q™�x˜r¤# e£* ¨VÐ4Ô5Øó 	ˆ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Ð"IÈ7ÔTV×T]ÑT]Ó^ò D�Ø—x‘x “{¤B§F¡F¨:°r¸2¿8¹8ÀA»;Ó$G×$MÑ$MÓ$O�1�Ü—9‘9ÐJÈAÌrÏtÉtÔTÐXbÐfg×fmÑfmÓfoÑXoÐs|ð  AB÷  AHñ  AHó  AJò  tJØ—K‘K¨!ª-¨xÀÑ BÕCðDð �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Ô1Üˆu‹:Ðùò 9s   È"IÈ;IÚ__main__z--pages)ÚtypeÚdefaultz	[RESULT] r8   r‚   )r   ).Ú__doc__r   ÚosrS   r<   Úargparser}   r@   r   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r   r   ÚnowÚstrftimer�   r�   r‘   r\   r?   r;   r9   r:   r>   r   r$   rE   rf   rs   r€   rœ   Ú__name__ÚArgumentParserÚapÚadd_argumentÚintÚ
parse_argsÚargsÚpagesÚnr   © rg   r#   ú<module>rµ      s0  ðñ÷ 1× 0× 0Û à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (ß (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø*€	Ø€
Ø%€Ø
ÐJÑ
J€Ø
€Ø	€Ø	 €Ø€	ð DØÐAÑAñ€òòò$ò*ò(,-ó^*ðZ ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø�=‰=‹?€DÙˆD�J‰J‹€AÙ	ˆI�i�[  1 # VÐ
,Õ-ð rg   