Ë
    p3€js+  ã                   ó  — 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dZ	e	dz   Z
dZdZdZdZd	Zd
ZdZdZdZ	 ddlmZ ej.                  j1                  dd«      Zej.                  j1                  dd«      Zde	ez   dœZdZ eej<                  «      D ]k  \  ZZ e jC                  d«      r	  e"e jG                  dd«      d   «      ZŒ4e dk(  sŒ:edz    e%ej<                  «      k  sŒS	  e"ej<                  edz      «      ZŒm edk\  rendZ&dZ' ejP                  d ejR                   ej                  «       e'dz  z
  «      «      Z*d„ Z+d„ Z,d„ Z-d„ Z.d „ Z/d!„ Z0d"„ Z1e2d#k(  r e1«        yy# e$ r dZY �Œ2w xY w# e$$ r Y Œéw xY w# e$$ r Y Œôw xY w)$uÒ   
é‡‘æ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - é¡¹ç›®å�—ç�†æƒ…å†µå…¬ç¤º
URL: https://sthj.jcs.gov.cn/xmsp/xmslqkgs/index.html
CMS: JPAAS publish API
åˆ—è¡¨: GET /api-gateway/jpaas-publish-server/front/page/build/unit + paramJson
é    Nzhttps://sthj.jcs.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitu1   é‡‘æ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é¡¹ç›®å�—ç�†æƒ…å†µå…¬ç¤ºu   ç”˜è‚ƒzcrawl_jcs_xmslqkgs.pyu   çŽ¯è¯„å®¡æ‰¹Ú 47f74ec6fa054832961ddb79491f6065Ú be6c9f14178c495cbc663bf14fc7d26bÚ a7ce57f894724fb1970fb836e7b631ffu   åˆ†é¡µz/xmsp/xmslqkgs/index.html)ÚBeautifulSoupÚDB_PATHz/root/search.dbÚ
JSONL_PATHÚ zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36)z
User-AgentÚRefereré   z--pages=ú=z--pagesiG  z%Y-%m-%di€Q c                 ó€   — | sydd l }|j                  | «      } t        j                  dd| «      } | j	                  «       S )Nr	   r   z\s+ú )ÚhtmlÚunescapeÚreÚsubÚstrip)ÚtÚhtml_libs     ú'/root/gov_crawler/crawl_jcs_xmslqkgs.pyÚclean_titler   7   s9   € ÙØÛØ×Ñ˜!Ó€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 ó8  — dd l }dd l}|j                  |j                  j                  «       dt
        t        dt        dt        dœ}t        j                  | ddœd¬	«      |d
<   	 |j                  t        |t        dd¬«      }|j                  dk7  ry|j                  «       }|j                  d«      sy|d   d   }t        j                   d|«      }|rt#        |j%                  d«      «      nd}||fS # t&        $ r}	t)        d|	z  d¬«       Y d }	~	yd }	~	ww xY w)Nr   ÚbulidstaticÚcolumnÚnull)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdé   )ÚpageNoÚpageSizeF©Úensure_asciiÚ	paramJsoné   )ÚparamsÚheadersÚtimeoutÚverifyéÈ   )Nr   ÚsuccessÚdatar   zcount="(\d+)"r   z  [API fail] %sT©Úflush)ÚrequestsÚurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningÚWEB_IDÚTPL_SETÚTAG_IDÚPAGE_IDÚjsonÚdumpsÚgetÚAPI_URLÚHEADERSÚstatus_coder   ÚsearchÚintÚgroupÚ	ExceptionÚprint)
Úpager4   r5   r+   Úrr1   r   ÚmÚtotalÚes
             r   Ú	fetch_apirM   @   s   € ßØ×Ñ˜W×/Ñ/×FÑFÔGà"ÜÜØÜØÜñ€Fô Ÿ*™*°À"Ñ%EÐTYÔZ€Fˆ;ÑðØ�L‰Lœ¨¼È"ÐUZˆLÓ[ˆØ�=‰=˜CÒØØ�v‰v‹xˆØ�x‰x˜	Ô"ØØ�F‰|˜FÑ#ˆÜ�I‰IÐ&¨Ó-ˆÙ#$”�A—G‘G˜A“J”¨!ˆØ�Uˆ{ÐøÜò ÜÐ !Ñ#¨4Õ0Üûðús$   Á&-C6 Â!C6 Â6?C6 Ã6	DÃ?DÄDc                 ó  — g }t         s|S t        | d«      }|j                  d«      D ]Ý  }|j                  dd¬«      }|sŒ|d   j                  «       }|j	                  dd«      xs |j                  d¬	«      }d}|j                  d
«      }|r|j                  d¬	«      }t        |«      }|rt        |«      dk  rŒ•|j                  d«      s$t        j                  j                  t        |«      }|j                  |||f«       Œß |S )Núhtml.parserÚliÚaT©ÚhrefrS   Útitler	   ©r   Úspané   Úhttp)r   Úfind_allÚfindr   r?   Úget_textr   ÚlenÚ
startswithÚurllibÚparseÚurljoinÚBASE_URLÚappend)	r   ÚitemsÚsouprP   rQ   rS   rT   ÚdaterV   s	            r   Ú
parse_listrf   ]   sö   € Ø€EÝØˆÜ˜˜}Ó-€DØ�m‰m˜DÓ!ò *ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰y�‰Ó ˆØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆØˆØ�w‰w�v‹ˆÙØ—=‘= t�=Ó,ˆDÜ˜EÓ"ˆÙœ˜E›
 QšØØ�‰˜vÔ&Ü—<‘<×'Ñ'¬°$Ó7ˆDØ�‰�d˜E 4Ð(Õ)ð*ð  €Lr   c                 ó$  — dd l }dd l}|j                  |j                  j                  «       	 |j                  | t        dd¬«      }|j                  dk(  rd|_        |j                  S 	 y # t        $ r}t        d|z  d¬	«       Y d }~y d }~ww xY w)
Nr   r*   F)r,   r-   r.   r/   úutf-8z  [fetch fail] %sTr2   )r4   r5   r6   r7   r8   r?   rA   rB   ÚencodingÚtextrF   rG   )Úurlr4   r5   rI   rL   s        r   Úfetchrl   u   sˆ   € ßØ×Ñ˜W×/Ñ/×FÑFÔGð3Ø�L‰L˜¤g°rÀ%ˆLÓHˆØ�=‰=˜CÒØ ˆAŒJØ—6‘6ˆMð  ð
 øô ò 3ÜÐ! AÑ%¨T×2Ñ2Øûð3ús   ¯:A, Á,	BÁ5B
Â
Bc                 óR	  ‡‡‡‡‡— | sddg fS dd l Št        j                  dd| t        j                  ¬«      } t        j                  dd| t        j                  t        j                  z  ¬«      } t        j                  dd| t        j                  t        j                  z  ¬«      } g Ši Št
        �r6	 t        | d«      }|j                  dd	¬
«      D �]  }|j                  d«      s6t        j                  d|j                  dd«      t        j                  «      sŒK|d   }|j                  d«      xs |}|j                  d	¬«      xs1 t        j                  j                  |j                  d«      d   «      }t        j                  j!                  ‰|«      }‰j#                  ||f«       dt%        ‰«      z  }d|›d|›d�‰|<   |j'                  |«       �Œ
 t)        |«      } ˆˆˆˆfd„}	t        j                  d|	| t        j                  t        j                  z  ¬«      } g Šˆfd„}
t        j                  d| t        j                  «      rdnd}t        j                  d|
| t        j                  t        j                  z  ¬«      } t        j                  dd| t        j                  ¬«      } t        j                  dd| t        j                  ¬«      } t        j                  dd| t        j                  ¬«      } g }| j                  d «      D ]È  }|j-                  «       }|sŒt        j                  d!d|«      }‰j/                  |«      }t        j                  d"d|«      }|sŒX‰j1                  «       D ]  \  }}|j3                  ||«      }Œ t5        ‰«      D ]  \  }}|j3                  d#|z  |«      }Œ |j#                  |j-                  «       «       ŒÊ d j7                  |«      }‰j1                  «       D ]  \  }}|j3                  ||«      }Œ t5        ‰«      D ]  \  }}|j3                  d#|z  |«      }Œ t        j                  d$d|«      }‰j/                  |«      }t        j                  d%d |«      }|j-                  «       |‰fS # t*        $ r Y �Œ¼w xY w)&Nr	   r   z
<!--.*?-->)Úflagsz<script[^>]*>.*?</script>z<style[^>]*>.*?</style>rO   rQ   TrR   Úappendixú6\.(pdf|docx?|xlsx?|zip|rar|wps)|fileName=.*\.(pdf|doc)rS   ÚoldsrcrU   ú?z__ATTACH__%d__ú	<a href="ú" target="_blank">ú</a>c                 óÈ  •— | j                  d«      }|j                  d«      ry| j                  d«      }t        j                  dd|«      }‰j	                  |«      j                  «       }t        j                  d|t        j                  «      s$d|j                  «       v sd|j                  «       v r†|s5t        j                  j                  |j                  d	«      d
   «      xs d}t        j                  j                  ‰	|«      }‰j!                  ||f«       dt#        ‰«      z  }d|›d|›d�‰|<   |S t        j                  j                  ‰	|«      }d|›d|›d�S )Nr   zjavascript:r	   é   ú<[^>]+>rp   ÚdownloadÚ
attachmentrr   r   u   é™„ä»¶z__LINK__%d__rs   rt   ru   )rE   r]   r   r   r   r   rC   ÚIÚlowerÚosÚpathÚbasenameÚsplitr^   r_   r`   rb   r\   )
rJ   rS   ÚinnerÚtxtÚabs_urlÚkeyÚattachmentsr   Úlink_protectÚpage_urls
         €€€€r   Ú
_link_replz html_to_text.<locals>._link_replœ   sB  ø€ Ø�w‰w�q‹zˆØ�?‰?˜=Ô)ØØ—‘˜“
ˆÜ�f‰f�Z  UÓ+ˆØ×Ñ Ó$×*Ñ*Ó,ˆÜ�9‰9ÐNÐPTÔVX×VZÑVZÔ[Ð_iÐmq×mwÑmwÓmyÑ_yð  ~Jð  NR÷  NXñ  NXó  NZñ  ~ZÙÜ—g‘g×&Ñ& t§z¡z°#£°qÑ'9Ó:ÒF¸h�Ü—l‘l×*Ñ*¨8°TÓ:ˆGØ×Ñ ¨˜~Ô.Ø ¤3 |Ó#4Ñ4‰CÚIPÒRUÐ VˆL˜ÑØˆJÜ—,‘,×&Ñ& x°Ó6‰Ú8?ÂÐEÐEr   z&<a\s[^>]*href="([^"]+)"[^>]*>(.*?)</a>c                 óf   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  z  S )Nr   ú__TBL__%d__r   )rb   rE   r\   )rJ   Útable_protects    €r   Ú	_tbl_replzhtml_to_text.<locals>._tbl_repl°   s.   ø€ Ø×Ñ˜QŸW™W Q›ZÔ(Ø¤ MÓ 2°QÑ 6Ñ7Ð7r   z<table[^>]*>r   z<table[^>]*>.*?</table>z</p>z</p>

z	<br\s*/?>ú
z</?(?:span|font|o:p)\b[^>]*>z

rx   z[\s\u200b\u200c\u200d\ufeff]+rŠ   z*__LINK__\d+__|__TBL__\d+__|__ATTACH__\d+__z\n{3,})r   r   r   ÚSr{   r   rY   r?   rC   r[   r}   r~   r   r€   r^   r_   r`   rb   r\   Úreplace_withÚstrrF   r   r   rc   ÚreplaceÚ	enumerateÚjoin)Úcontentr‡   Ú_souprQ   rS   Ú	real_hrefr‚   rƒ   r„   rˆ   rŒ   Ú	has_tableÚpartsÚblockÚbÚplainÚkÚvÚiÚtblÚoutr…   r   r†   r‹   s    `                   @@@@r   Úhtml_to_textr¡   ‚   sô  ü€ ÙØ�1�bˆyÐÛÜ�f‰f�] B¨´r·t±tÔ<€GÜ�f‰fÐ1°2°wÄbÇdÁdÌRÏTÉTÁkÔR€GÜ�f‰fÐ/°°WÄBÇDÁDÌ2Ï4É4ÁKÔP€GØ€KØ€LÞð	Ü! '¨=Ó9ˆEØ—^‘^ C¨d�^Ó3ó 	(�Ø—5‘5˜Ô$¬¯	©	Ð2kÐmn×mrÑmrÐsyÐ{}Óm~ô  AC÷  AEñ  AEõ  )FØ˜V™9�DØ !§¡ h£Ò 7°4�IØŸ*™*¨4˜*Ó0Ò]´B·G±G×4DÑ4DÀYÇ_Á_ÐUXÓEYÐZ[ÑE\Ó4]�CÜ$Ÿl™l×2Ñ2°8¸YÓG�GØ×&Ñ&¨° ~Ô6Ø*¬S°Ó->Ñ>‘CÚQXÒZ]Ð(^�L Ñ%Ø—N‘N 3Ö'ð	(ô ˜%“jˆG÷Fô" �f‰fÐ>À
ÈGÔ[]×[_Ñ[_Ôbd×bfÑbfÑ[fÔg€Gà€Mô8ô —Y‘Y˜°¼¿¹Ô>‘ÀA€IÜ�f‰fÐ/°¸GÌ2Ï4É4ÔRT×RVÑRVÉ;ÔW€Gä�f‰f�W˜j¨'¼¿¹Ô>€GÜ�f‰f�\ 4¨¼¿¹Ô=€GÜ�f‰fÐ4°b¸'ÌÏÉÔN€Gà€EØ—‘˜vÓ&ò  ˆØ�K‰K‹MˆÙØÜ—‘�z 2 qÓ)ˆØ×!Ñ! %Ó(ˆÜ—‘Ð7¸¸UÓCˆÙØØ ×&Ñ&Ó(ò 	 ‰DˆAˆqØ—	‘	˜!˜Q“‰Að	 ä Ó.ò 	2‰FˆAˆsØ—	‘	˜-¨!Ñ+¨SÓ1‰Að	2à�‰�Q—W‘W“YÕð ð �+‰+�eÓ
€CØ×"Ñ"Ó$ò  ‰ˆˆ1Ø�k‰k˜!˜QÓ‰ð ä˜MÓ*ò 2‰ˆˆ3Ø�k‰k˜-¨!Ñ+¨SÓ1‰ð2ä
�&‰&Ð>ÀÀCÓ
H€CØ
×
Ñ
˜CÓ
 €CÜ
�&‰&�˜F CÓ
(€CØ�9‰9‹;˜	 ;Ð.Ð.øôq ò 	Úð	ús   Â4A)R ÄCR Ò	R&Ò%R&c                 óÆ  — d}d}d}t         �rPt        | d«      }|j                  d«      }|r"dj                  d„ |j                  D «       «      }|j	                  ddt        j                  dt
        j                  «      i¬«      }|r|j                  d	«      rt        |d	   «      }|j	                  ddt        j                  d
t
        j                  «      i¬«      }|r=|j                  d	«      r,t        j                  d|d	   «      }	|	r|	j                  d«      }|s?|j	                  d«      xs |j	                  d«      }
|
rt        |
j                  «       «      }|||fS )Nr	   rO   z0div.ty-content, div.article-content, div.contentc              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)r�   )Ú.0Úcs     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>Ú   s   è ø€ Ò">¨a¤3 q§6Ñ">ùs   ‚ÚmetaÚnameÚArticleTitle)Úattrsr”   ÚPubDatez([0-9]{4}-[0-9]{2}-[0-9]{2})r   Úh1Úh2)r   Ú
select_oner“   ÚcontentsrZ   r   Úcompiler{   r?   r   rC   rE   r[   )Ú	html_textr‡   rT   re   Úcontent_htmlrd   Údr   ÚmdÚdmr¬   s              r   Úparse_detailr¶   Ô   s   € Ø€E�r�¨"˜<ÞÜ˜Y¨Ó6ˆØ�O‰OÐNÓOˆÙØŸ7™7Ñ">°1·:±:Ô">Ó>ˆLØ�I‰I�f V¬R¯Z©Z¸ÌÏÉÓ-MÐ$NˆIÓOˆÙ�—‘�yÔ!Ü  )¡Ó-ˆEØ�Y‰Y�v f¬b¯j©j¸ÄBÇDÁDÓ.IÐ%JˆYÓKˆÙ�"—&‘&˜Ô#Ü—‘Ð:¸B¸y¹MÓJˆBÙØ—x‘x “{�ÙØ—‘˜4“Ò3 D§I¡I¨d£OˆBÙÜ# B§K¡K£MÓ2�Ø�$˜Ð$Ð$r   c                  ó:  — t         j                  j                  dt        j                  j	                  t        j                  j                  t        «      «      «       ddlm}  d}d}t        «       }g }g }t        dt        dz   «      D �]Î  }t        |«      \  }}|€t        d|z  d¬«        �n«t        |«      }	|	st        d|z  d¬«        �n‹t        d|t        |	«      |fz  d¬«       |	D �]f  \  }
}}|
|v rŒ|j!                  |
«       |r
|t"        k  rŒ*t%        |
«      }|s|dz  }Œ=t'        ||
«      \  }}}|s|}|s|}|r|t"        k  r|dz  }Œft)        ||
«      \  }}}t        t+        j,                  d	d
|«      j/                  «       «      }|dk  rt        d|d d z  d¬«       |dz  }ŒÂt0        |
|
||d
|t2        d
t4        |rdj7                  d„ |D «       «      nd
dœ}t8        r)|j;                  |«       t        d|d d ›d|›d�d¬«       n(|j;                  |«       t        d|d d ›d|›d�d¬«       |dz  }t=        j>                  d«       �Œi �ŒÑ t8        rltA        t8        dd¬«      5 }|D ]+  }|jC                  tE        jF                  |d¬«      dz   «       Œ- 	 d d d «       t        dt8        t        |«      fz  d¬«       n | |tH        ¬«       t        d|z  d¬«       t        d|z  d¬«       t        d t0        z  d¬«       y # 1 sw Y   ŒlxY w)!Nr   )Úpush_to_searchdbr   zPage %d API failedTr2   zPage %d: empty, stopzPage %d: %d items (total=%s)rx   r	   é
   z  skip empty: %sé(   z; c              3   ó0   K  — | ]  \  }}|›d |›�–— Œ y­w)ú|N© )r¤   Úur   s      r   r¦   zmain.<locals>.<genexpr>  s   è ø€ Ò(K¹d¸aÀ²A±qÔ)9Ñ(Kùs   ‚)Ú	site_nameÚ
source_urlrk   rT   Úpub_dateÚsummaryr”   ÚcategoryÚtagsÚ
group_namer…   z
  JSONL + z (ú)z  + gš™™™™™©?Úwrh   )ri   Fr'   r�   zJSONL written: %s (%d rows))Úbatch_labelu
   æ–°å¢ž: %du
   è·³è¿‡: %dz=== %s done ===)%Úsysr~   Úinsertr}   ÚdirnameÚabspathÚ__file__Úcrawler_libr¸   ÚsetÚrangeÚ_PAGESrM   rG   rf   r\   ÚaddÚ_CUTOFF_DATErl   r¶   r¡   r   r   r   Ú	SITE_NAMEÚCATEGORYÚ
GROUP_NAMEr“   r   rb   ÚtimeÚsleepÚopenÚwriter=   r>   ÚSCRIPT_NAME)r¸   Ú	new_countÚ
skip_countÚ	seen_urlsÚbatchÚ
jsonl_rowsrH   r   rK   rc   rk   rT   re   ÚdhtmlÚdtitleÚddater²   r”   r—   ÚattsÚ	plain_lenÚitemÚfÚrows                           r   Úmainré   ê   sñ  € Ü‡H�H‡O�O�A”r—w‘w—‘¤r§w¡w§¡´xÓ'@ÓAÔBÝ,Ø€IØ€JÜ“€IØ€EØ€Jä�aœ !™Ó$ó 0ˆÜ “o‰ˆˆeØˆ<ÜÐ&¨Ñ-°TÕ:ÚÜ˜4Ó ˆÙÜÐ(¨4Ñ/°tÕ<ÚÜÐ,°´c¸%³jÀ%Ð/HÑHÐPTÕUØ %ó &	ÑˆC�˜Ø�iÑØØ�M‰M˜#ÔÙ˜œ|Ò+ØÜ˜#“JˆEÙØ˜a‘�
ØÜ*6°u¸cÓ*BÑ'ˆF�E˜<ÙØ�ÙØ�Ù˜¤Ò-Ø˜a‘�
ØÜ'3°LÀ#Ó'FÑ$ˆG�Y ÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIØ˜2Š~ÜÐ(¨6°#°2¨;Ñ6¸dÕCØ˜a‘�
Øä&°cÀ#Ø¨U¸rØ"´À"Ü(ÙOS˜tŸy™yÑ(KÀdÔ(KÔKÐY[ñˆDõ Ø×!Ñ! $Ô'Ý¨V°C°Rª[º%Ð@ÈÖMà—‘˜TÔ"Ý v¨c¨r¢{²EÐ:À$ÕGØ˜‰NˆIÜ�J‰J�tÖòM&	ð0õd Ü”*˜c¨GÔ4ð 	D¸Ø!ò D�Ø—‘œŸ
™
 3°UÔ;¸dÑBÕCñD÷	Dô 	Ð+¬z¼3¸z»?Ð.KÑKÐSWÖXá˜¬KÕ8ä	ˆ,˜Ñ
"¨$Õ/Ü	ˆ,˜Ñ
#¨4Õ0Ü	Ð
œiÑ
'¨tÖ4÷	Dð 	Dús   É41LÌLÚ__main__)3Ú__doc__rÉ   r}   r   r×   r=   Úurllib.parser^   Úsqlite3ra   r@   rÔ   rÖ   rÛ   rÕ   r9   r<   r:   r;   Ú	LIST_PAGEÚbs4r   ÚImportErrorÚenvironr?   r   r   rA   Ú
_MAX_PAGESr’   Úargvrž   rQ   r]   rD   r€   Ú
ValueErrorr\   rÑ   Ú_DAYS_CUTOFFÚstrftimeÚ	localtimerÓ   r   rM   rf   rl   r¡   r¶   ré   Ú__name__r½   r   r   ú<module>rù      sÝ  ðñ÷ 6× 5× 5Ó 5à$€Ø
ÐNÑ
N€Ø?€	Ø€
Ø%€Ø€à	+€Ø
,€Ø
,€Ø	€Ø'€	ðÝ!ð �*‰*�.‰.˜Ð$5Ó
6€Ø�Z‰Z�^‰^˜L¨"Ó-€
ð @Ø˜)Ñ#ñ€ð
 €
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€à€Øˆt�}‰}˜Z¨¨¯©¸	¸¿	¹	»ÀlÐUZÑFZÑ8ZÓ)[Ó\€òòò:ò0
òO/òd%ò,E5ðP ˆzÒÙ…Fð øðq ò ØƒMðûð  ò 	Ùð	ûð
 ò 	Ùð	ús5   ¹E' Â+E5Ã'F Å'E2Å1E2Å5E=Å<E=Æ FÆF