Ë
    ¸¬uj°  ã                   ó  — 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mZ ddl	m	Z	 ej                  j                  d¬«       ej                  j                  d¬«       ej                  j                  dej                  j                  ej                  j!                  e«      «      «       ddlmZ dZd	Zd
ZdZdZeez   ZddddœZdZdZd„ Zdd„Zd„ Zdd„Z e!dk(  r$dejD                  v Z# e e#¬«      Z$ e%de$› d�«       yy)ug   crawl_yjgx_gkmlpt.py - é˜³æ±Ÿå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€é«˜æ–°åˆ†å±€-æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° (NFCMS gkmlpt API)é    N)ÚBeautifulSoup)ÚdatetimeT)Úline_buffering)Úpush_to_searchdbu$   é˜³æ±Ÿå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€é«˜æ–°åˆ†å±€u   å¹¿ä¸œu   ç”Ÿæ€�çŽ¯å¢ƒzhttp://www.yjgx.gov.cnz/yjgxyjshjbhjgxfjzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36ÚXMLHttpRequestzapplication/json)ú
User-AgentzX-Requested-WithÚAcceptéd   é
   c                  ó  — 	 t        j                  t        › d�dt        d   id¬«      } t	        j
                  d| j                  «      }|r|j                  d«      S 	 y	# t        $ r}t        d|› �«       Y d}~y	d}~ww xY w)
u"   ä»Žé¦–é¡µèŽ·å�–æœ€æ–°çš„CSRF tokenz/gkmlpt/indexr   é   ©ÚheadersÚtimeoutzCSRF\s*:\s*'([^']+)'é   u     Ã— CSRFèŽ·å�–å¤±è´¥: NÚ )
ÚrequestsÚgetÚBASE_URLÚHEADERSÚreÚsearchÚtextÚgroupÚ	ExceptionÚprint)ÚrespÚmÚes      ú&/root/gov_crawler/crawl_yjgx_gkmlpt.pyÚget_csrfr!      s„   € ð-Ü�|‰|œx˜j¨Ð6ÀÌwÐWcÑOdÐ@eÐoqÔrˆÜ�I‰IÐ-¨t¯y©yÓ9ˆÙØ—7‘7˜1“:Ðð ð øô ò -ÜÐ'¨ sÐ+×,Ð,Øûð-ús   ‚AA Á	B Á(A;Á;B c           	      óÂ  — t         › d|› dt        › �}i t        ¥d| i¥}	 t        j                  ||d¬«      }|j
                  dk7  rt        d|j
                  › �«       g dfS |j                  «       }|j	                  d	g «      }|j	                  d
d«      }t        d|› dt        |«      › d|› d�«       ||fS # t        $ r}t        d|› �«       g dfcY d}~S d}~ww xY w)u'   èŽ·å�–APIåˆ—è¡¨é¡µï¼Œè¿”å›žæ–‡ç« åˆ—è¡¨z/gkmlpt/api/all/0?page=z
&pageSize=úX-CSRF-TOKENé   r   éÈ   u     Ã— API HTTP r   ÚarticlesÚtotalu	     âˆš ç¬¬u   é¡µ: u   æ�¡ (å…±u   æ�¡)u     Ã— APIå¼‚å¸¸: N)
r   Ú	PAGE_SIZEr   r   r   Ústatus_coder   ÚjsonÚlenr   )	ÚcsrfÚpageÚurlr   r   Údatar&   r'   r   s	            r    Ú
fetch_listr0   +   sí   € äˆJÐ-¨d¨V°:¼i¸[Ð
I€CØ/”Ð/˜.¨$Ñ/€GðÜ�|‰|˜C¨¸"Ô=ˆØ×Ñ˜sÒ"Ü�N 4×#3Ñ#3Ð"4Ð5Ô6Ø�q�5ˆLØ�y‰y‹{ˆØ—8‘8˜J¨Ó+ˆØ—‘˜ !Ó$ˆÜ�	˜$˜˜u¤S¨£] O°8¸E¸7À$ÐGÔHØ˜ˆÐøÜò ÜÐ   Ð$Ô%Ø�1ˆu�ûðús%    AB9 Á#AB9 Â9	CÃCÃCÃCc           
      ó2  — i t         ¥d| i¥}	 t        j                  ||d¬«      }d|_        |j                  dk7  ry	 |j                  }t        |d«      }d	}|j                  d
«      }|r|j                  d¬«      }|sJ|j                  d«      }	|	r7|	j                  d¬«      }t        j                  dd	|«      j                  «       }d	}
|j                  d«      }|rGt        j                  d|j                  «       «      }|r!|j                  d«      j!                  dd«      }
|
sL|j"                  D ]=  }t        j                  d|«      }|sŒ|j                  d«      j!                  dd«      }
 n d	}dD ]5  }|j                  |«      }|sŒ|j                  d¬«      sŒ*t%        |«      } n |st%        |j                  d«      xs d	«      }g }t'        «       }dD ]²  }t        j(                  d|›d|›d|›d�|t        j*                  «      D ]~  }|j                  «       }t        j                  dd	|«      j                  «       dd }|r(||vsŒB|j-                  |«       |j/                  |«       Œed|v sd|v sŒn|j/                  |«       Œ€ Œ´ |sAt        j                  dd	|«      }t        j                  dd |«      j                  «       }||
|fS d j1                  |«      }t        j                  d!d"„ |«      }||
|fS # t
        $ r
}Y d}~yd}~ww xY w)#u   èŽ·å�–è¯¦æƒ…é¡µå†…å®¹r#   r$   r   zutf-8r%   )r   r   r   Nzhtml.parserr   z .title.document-number, h1.titleT)ÚstripÚtitleu   [-â€”|].*?$z	.date-rowz(\d{4}[-/]\d{1,2}[-/]\d{1,2})r   ú/ú-)z.article-contentz.policy-article-contentz.contentz#contentz.TRS_EditorÚbody)ÚpÚtableÚaÚimgz(?:<z	[^>]*/>|<z[^>]*>.*?</z>)ú<[^>]+>é(   z<imgz<az\s+ú
z(href|src)="(/(?!http)[^"]*)"c                 óZ   — | j                  d«      ›dt        ›| j                  d«      ›d�S )Nr   z="é   ú")r   ÚDOMAIN)r   s    r    ú<lambda>zfetch_detail.<locals>.<lambda>†   s   € °·±¸µ
½FÀAÇGÁGÈAÅJÐ!O€ ó    )r   r   r   Úencodingr)   r   r   r   Ú
select_oneÚget_textÚfindr   Úsubr2   r   r   ÚreplaceÚstripped_stringsÚstrÚsetÚfinditerÚDOTALLÚaddÚappendÚjoin)r,   r.   r   r   r   ÚhtmlÚsoupr3   Úh1Út_tagÚpub_dateÚdate_rowr   ÚtxtÚcontent_htmlÚselÚelÚpartsÚ	seen_keysÚtag_nameÚtag_htmlÚkeyr   Ú	body_htmls                           r    Úfetch_detailrb   >   sö  € à/”Ð/˜.¨$Ñ/€GðÜ�|‰|˜C¨¸"Ô=ˆØˆŒØ×Ñ˜sÒ"Øð #ð
 �9‰9€DÜ˜˜}Ó-€Dð €EØ	�‰Ð;Ó	<€BÙ	Ø—‘ $�Ó'ˆÙØ—	‘	˜'Ó"ˆÙØ—N‘N¨�NÓ.ˆEÜ—F‘F˜>¨2¨uÓ5×;Ñ;Ó=ˆEð €HØ�‰˜{Ó+€HÙÜ�I‰IÐ6¸×8IÑ8IÓ8KÓLˆÙØ—w‘w˜q“z×)Ñ)¨#¨sÓ3ˆHÙØ×(Ñ(ò 	ˆCÜ—	‘	Ð:¸CÓ@ˆAÚØŸ7™7 1›:×-Ñ-¨c°3Ó7�Ùð		ð €LØeò ˆØ�_‰_˜SÓ!ˆÚ�"—+‘+ D�+Õ)Ü˜r›7ˆLÙð	ñ Ü˜4Ÿ9™9 VÓ,Ò2°Ó3ˆð €EÜ“€IØ.ò 
'ˆÜ—’ÂHÊhÒX`ÐaØ)¬2¯9©9ó6ò 		'ˆAà—w‘w“yˆHÜ—&‘&˜ R¨Ó2×8Ñ8Ó:¸3¸BÐ?ˆCÙØ˜iÒ'Ø—M‘M #Ô&Ø—L‘L Õ*Ø˜8Ñ# t¨xÒ'7Ø—‘˜XÕ&ñ		'ð
'ñ Ü�v‰v�j " lÓ3ˆÜ�v‰v�f˜d DÓ)×/Ñ/Ó1ˆØ�h Ð$Ð$à—	‘	˜%Ó €IÜ—‘Ð7ÙOÐQZó\€Ià�(˜IÐ%Ð%øôC ò Üûðús   Ž.L Ì	LÌLc                 ó^  — t        «       }|st        d«       yg }t        «       }| rdnt        }t	        d|dz   «      D ]§  }t        ||«      \  }}|s n”|D ]j  }|j                  dd«      }	|	r|	|v rŒ|j                  |	«       |j                  |j                  dd«      |	dt        |j                  dd«      d d d	œ«       Œl t        j                  d
«       |t        z  |k\  sŒ§ n t        dt        |«      › �«       d}
g }t        |«      D ]ñ  \  }}t        ||d   «      \  }}}|xs |d   |d<   |xs |d   |d<   |r#||d<   t!        j"                  dd|«      d d |d<   n
d|d<   d|d<   |j                  |«       t        |«      dk\  r6t%        |d«       |
t        |«      z  }
t        d|
› dt        |«      › �«       g }|dz   dz  dk(  rt        d|dz   › dt        |«      › �«       t        j                  d
«       Œó |rt%        |d«       |
t        |«      z  }
t        d|
› d�«       |
S )Nu   Ã— æ— æ³•èŽ·å�–CSRF tokenr   r   r.   r   r3   Údescriptionr%   )r3   r.   rV   Ú	site_nameÚsummaryg333333Ó?zTotal unique items: rV   Úcontentr;   rf   é2   Úyjgx_gkmlptz  Committed r4   r$   z	  Detail zDetail fetched: z items)r!   r   rL   Ú	MAX_PAGESÚranger0   r   rO   rP   Ú	SITE_NAMEÚtimeÚsleepr(   r+   Ú	enumeraterb   r   rH   r   )Úincrementalr,   Úall_recordsÚseenÚ	max_pagesr-   r&   r'   r9   Úart_urlÚ
total_doneÚbatchÚiÚrecÚdetail_titleÚdetail_daterg   s                    r    Úrunr{   Š   s_  € Ü‹:€DÙÜÐ)Ô*Øà€KÜ‹5€DÙ ‘¤i€Iä�a˜ Q™Ó'ò ˆÜ$ T¨4Ó0‰ˆ�%ÙÙØò 	ˆAØ—e‘e˜E 2Ó&ˆGÙ˜g¨™oØØ�H‰H�WÔØ×ÑØŸ™˜w¨Ó+ØØÜ&ØŸ5™5 °Ó3°D°SÐ9ñ õ ð	ô 	�
‰
�3ŒØ”)Ñ˜uÓ$Ùð%ô( 
Ð ¤ [Ó!1Ð 2Ð
3Ô4à€JØ€EÜ˜KÓ(ò ‰ˆˆ3Ü-9¸$ÀÀEÁ
Ó-KÑ*ˆ�k 7Ø#Ò3 s¨7¡|ˆˆG‰Ø%Ò8¨¨Z©ˆˆJ‰ÙØ$ˆC�	‰NÜŸV™V J°°GÓ<¸T¸cÐBˆC�	ŠNàˆC�	‰NØˆC�	‰NØ�‰�SÔäˆu‹:˜ÒÜ˜U MÔ2Øœ#˜e›*Ñ$ˆJÜ�L  ¨A¬c°+Ó.>Ð-?Ð@ÔAØˆEà�‰E�R‰<˜1ÒÜ�I˜a ™c˜U !¤C¨Ó$4Ð#5Ð6Ô7Ü�
‰
�3�ð)ñ. Ü˜ Ô.Ø”c˜%“jÑ ˆ
ä	Ð˜Z˜L¨Ð
/Ô0ØÐrC   Ú__main__z--incremental)rp   zDone: z records)r   )F)&Ú__doc__ÚsysÚosr   r*   rm   r   Úbs4r   r   ÚstdoutÚreconfigureÚstderrÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   rl   ÚGROUPÚINDUSTRYrA   ÚAPP_PATHr   r   r(   rj   r!   r0   rb   r{   Ú__name__ÚargvÚincÚcntr   © rC   r    ú<module>r’      s  ðá mç (× (× (Ý Ý à ‡
�
× Ñ  dÐ Ô +Ø ‡
�
× Ñ  dÐ Ô +à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à2€	Ø€Ø€Ø	!€Ø€Ø�HÑ€ð DØ(Ø ñ€ð €	Ø€	ò	óò&I&óX>ðB ˆzÒØ
˜SŸX™XÐ
%€CÙ
˜#Ô
€CÙ	ˆF�3�%�xÐ
 Õ!ð rC   