Ë
    ¸¬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mZ ddl	m
Z
 ddlmZ  ej                  dd«      ZdZd	Zd
Ze› d�ZdddœZdZd„ Zd„ Zd„ Zd(d„Zd„ Zedk(  r­ eej8                  «      dkD  rej8                  d   ndZedk(  r e«        yedk(  r e«        yedk(  rg ed«      Zer\ eded   d   › d�«       ed   d   dd D ];  Zed    Z  e!d!e jE                  d"d#«      dd$ › d%e jE                  d&d#«      dd' › �«       Œ= yyyy))uË   
Crawler: ä¸°åŸŽå¸‚äººæ°‘æ”¿åºœ - å›žåº”å…³åˆ‡ (UCAP CMS, JSON API)
API: POST /queryList JSON body {siteCode, channelCode, pageSize, current}
Returns full content directly - no detail page fetch needed.
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   ä¸°åŸŽå¸‚äººæ°‘æ”¿åºœu   å›žåº”å…³åˆ‡zhttps://www.jxfc.gov.cnz
/queryListz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zapplication/json;charset=UTF-8)z
User-AgentzContent-Typeé   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚSITE)Úmsgs    ú"/root/gov_crawler/crawl_fc_hygq.pyÚlogr      s   € Ü	ˆAŒdˆV�2�c�UÐ
 4Ö(ó    c                 óò   — t        j                  t        | dddœ«      }	 t        j                  t
        |t        dd¬«      }|j                  «       S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)	NÚfcsrmzfÚhygq2c)ÚpageSizeÚcurrentÚsiteCodeÚchannelCodeé   F)ÚdataÚheadersÚtimeoutÚverifyzAPI error page z: )	ÚjsonÚdumpsÚ	PAGE_SIZEÚrequestsÚpostÚAPI_URLÚHEADERSÚ	Exceptionr   )Úpage_noÚbodyÚrÚes       r   Ú
fetch_pager*      sp   € Ü�:‰:ÜØØØñ	ó €DðÜ�M‰Mœ'¨´gÀrÐRWÔXˆØ�v‰v‹xˆøÜò Üˆo˜g˜Y b¨¨Ð,Ô-Üûðús    1A Á	A6ÁA1Á1A6c                 ó   — | syt        | d«      }|j                  dd¬«      D ]R  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }|j                  d	|› d
|› d�«       ŒT |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]u  }|j                  dk(  r|j                  t        |«      «       Œ-|j                  dk(  sŒ=|j                  d«      rŒO|j                  dd¬«      }	|	sŒe|j                  |	«       Œw |rdj                  |«      S | j                  «       S )NÚ zhtml.parserÚaT)Úhrefr.   )Ústripu   é™„ä»¶r
   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorr/   z

)r   Úfind_allÚgetÚget_textr   ÚBASE_URLÚreplace_withÚunwrapÚnameÚappendÚstrÚfind_parentÚjoinr/   )
Úcontent_htmlÚsoupÚa_tagr.   ÚtextÚfull_urlÚtagÚpartsÚelÚts
             r   Úextract_clean_textrP   +   s6  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò 4ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ×Ñ˜Q˜t˜f B x j°Ð2Õ3ð	4ð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò  ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜Q•ð ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c                 ó  — t        j                  «       t        | dz  ¬«      z
  j                  d«      }t	        d|› d�«       t        d«      }|sy |d   d   }|t        z   dz
  t        z  }t	        d	|› d
|› �«       g }t        d|dz   «      D �]V  }t        |«      }|s �nF|d   d   D �]  }|d   }	|	j                  dd«      xs dd d }
|
|k  rŒ(|	j                  dd«      }|	j                  di «      j                  dd«      }t        |«      }|j                  |t        |	j                  d«      t        «      red|	j                  dd«      v rQ|	j                  dd«      j                  dd«      j                  d«      d   j                  «       j                  d«      nd|
|t         › dt"        › �t"        dœ«       �Œ t	        d|› d�«       t%        j&                  d«       �ŒY t	        dt)        |«      › d�«       d }d }d d l}|j-                  t.        «      }|j1                  d!«       |j1                  d"«       |j3                  «       }|D ]V  }	 |j1                  d#|d$   |d%   |d%   |d   |d&   |d   |d   xs dd d' |d(   f«       |j4                  d kD  r|dz  }n|dz  }ŒX |j9                  «        |j;                  «        t	        d*|› d+|› d,�«       y # t6        $ r}t	        d)|› �«       |dz  }Y d }~Œ­d }~ww xY w)-Nr   ©Údaysú%Y-%m-%dzFull crawl (cutoff: r0   é   r   ÚtotalúTotal: z	, pages: ÚresultsÚsourceÚpubDater,   é
   ÚtitleÚcontentÚurlsÚpcz{}ú"ú:éÿÿÿÿú}ú-©r\   Úpage_urlÚpublish_dater]   Ú	site_nameÚcolumnz  Page z: processedg      à?zAfter filter: z itemsr   úPRAGMA journal_mode=WALúPRAGMA busy_timeout=10000ú‰INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category) VALUES (?,?,?,?,?,?,?,?)rh   rf   rg   éô  ri   ú
DB error: úResult: ú new, ú skipped)r   Únowr   Ústrftimer   r*   r    Úranger=   rP   rC   Ú
isinstancerD   ÚreplaceÚsplitr/   r   ÚCOLUMNÚtimeÚsleepÚlenÚsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚrowcountr%   ÚcommitÚclose)Úmonths_backÚcutoffÚfirstrV   Útotal_pagesÚenrichedÚpgr   ÚitemÚsrcÚpub_dater\   r]   ÚcleanÚstoredÚskippedr|   ÚconnÚcr)   s                       r   Ú	crawl_allr’   A   s  € Ü�l‰l‹nœy¨k¸BÑ.>Ô?Ñ?×IÑIÈ*ÓU€FÜÐ
˜v˜h aÐ(Ô)ä�q‹M€EÙØØ�&‰M˜'Ñ"€EØœ9Ñ$ qÑ(¬YÑ6€KÜˆ'�%�˜	 + Ð/Ô0à€HÜ�A�{ Q‘Ó'ó ˆÜ˜"‹~ˆÙÚØ˜‘L Ñ+ó 	ˆDØ�x‘.ˆCØŸ™ 	¨2Ó.Ò4°"°c°rÐ:ˆHØ˜&Ò ØØ—G‘G˜G RÓ(ˆEØ—g‘g˜i¨Ó,×0Ñ0°¸BÓ?ˆGÜ& wÓ/ˆEà�O‰OØä& s§w¡w¨v£¼Ô<ÀÈÏÉÐQWÐY[ÓI\ÑA\ð  ŸG™G F¨DÓ1×9Ñ9¸#¸rÓB×HÑHÈÓMÈbÑQ×WÑWÓY×_Ñ_Ð`cÔdØbdØ (Ø Ü $˜v Q¤v hÐ/Ü ñö ð	ô$ 	ˆg�b�T˜Ð%Ô&Ü�
‰
�3Žð/ô2 ˆ.œ˜X›˜ vÐ.Ô/à€FØ€GÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØò ˆð	Ø�I‰Ið,ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øô ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   ÉAKË	LË&K>Ë>Lc                  ó  — t        j                  «       t        d¬«      z
  j                  d«      } t	        d| › d�«       t        d«      }|sy g }|d   d   D ]£  }|d	   }|j                  d
d«      xs dd d }|| k  rŒ'|j                  dd«      }|j                  di «      j                  dd«      }t        |«      }|j                  |d||t        › dt        › �t        dœ«       t        j                  d«       Œ¥ d}	d}
dd l}|j                  t        «      }|j!                  d«       |j!                  d«       |j#                  «       }|D ]V  }	 |j!                  d|d   |d   |d   |d   |d   |d   |d   xs dd d |d   f«       |j$                  dkD  r|	dz  }	n|
dz  }
ŒX |j)                  «        |j+                  «        t	        d|	› d|
› d�«       y # t&        $ r}t	        d|› �«       |
dz  }
Y d }~Œ­d }~ww xY w)Né   rR   rT   zIncremental (since r0   rU   r   rX   rY   rZ   r,   r[   r\   r]   rd   re   g333333Ó?r   rj   rk   rl   rh   rf   rg   rm   ri   rn   ro   rp   rq   )r   rr   r   rs   r   r*   r=   rP   rC   r   rx   ry   rz   r|   r}   r~   r   r€   r�   r%   r‚   rƒ   )r…   r   rˆ   rŠ   r‹   rŒ   r\   r]   r�   rŽ   r�   r|   r�   r‘   r)   s                  r   Úcrawl_incrementalr•   „   s*  € Ü�l‰l‹nœy¨aÔ0Ñ0×:Ñ:¸:ÓF€FÜÐ
˜f˜X QÐ'Ô(Ü�a‹=€DÙØà€HØ�V‘˜YÑ'ò ˆØ�8‰nˆØ—G‘G˜I rÓ*Ò0¨b°#°2Ð6ˆØ�fÒØØ—‘˜ Ó$ˆØ—'‘'˜) RÓ(×,Ñ,¨Y¸Ó;ˆÜ" 7Ó+ˆà�‰ØØØ$ØÜ ˜6 ¤6 (Ð+Üñ
ô 	ô 	�
‰
�3�ð#ð& €FØ€GÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØò ˆð	Ø�I‰Ið,ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øô ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   ÅAGÇ	HÇ$G<Ç<HÚ__main__rU   ÚincrementalÚfullÚlistrW   r   rV   z, first 5 items:rX   é   rY   z  rZ   r,   r[   z | r\   é<   )é$   )#Ú__doc__ÚsysÚosr   Úrery   r!   r   r   Úbs4r   Úurllib.parser   Úgetenvr~   r   rx   r?   r#   r$   r    r   r*   rP   r’   r•   Ú__name__r{   ÚargvÚmoder   rŠ   r‹   r   r=   © r   r   ú<module>r¨      sd  ðñ÷
 )× (× (ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø€Ø	€Ø$€ØˆJ�jÐ
!€àPØ4ñ€ð €	ò)òòAó,@4òF44ðn ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ�Ø	�ŠÙ˜!‹}ˆÙÙ�'˜$˜v™, wÑ/Ð0Ð0@ÐAÔBØ˜V™ YÑ/°°Ð3ò X�Ø˜8‘n�Ù˜˜CŸG™G I¨bÓ1°3°BÐ7Ð8¸¸C¿G¹GÀGÈBÓ<OÐPSÐQSÐ<TÐ;UÐVÕWñXð ð 
ð r   