Ë
    ¸¬ujX$  ã            	       óò  — 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ddiZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd d„Zd„ Zedk(  rŒ eej<                  «      dkD  rej<                  d   ndZedk(  r e«        yedk(  r e«        yedk(  rF ed«      Z e r ee «      ng Z! ed ee!«      › d�«       e!dd D ]  \  Z"Z#Z$ e%de$› de"dd › �«       Œ yyy)!u“   
Crawler: èŠ’å¸‚äººæ°‘æ”¿åºœ - å¾�é›†è°ƒæŸ¥ (æ˜†æ˜Žæ…§è½¯ CMS)
List: /Web/zjdcindex.do?page=N
Detail: /Web/_F0_0_XXXX.htm
Content div: div.content
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   èŠ’å¸‚äººæ°‘æ”¿åºœu   å¾�é›†è°ƒæŸ¥zhttps://www.dhms.gov.cnz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36é   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚSITE)Úmsgs    ú$/root/gov_crawler/crawl_dhms_zjdc.pyÚlogr      s   € Ü	ˆAŒdˆV�2�c�UÐ
 4Ö(ó    c                 óæ   — | dk(  r
t         › d�}nt         › d| › �}	 t        j                  |t        dd¬«      }d|_        |j
                  S # t        $ r}t        d| › d	|› �«       Y d }~y d }~ww xY w)
Né   z/Web/zjdcindex.doz/Web/zjdcindex.do?page=é   F©ÚheadersÚtimeoutÚverifyúutf-8z
List page z error: )ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   )Úpage_noÚurlÚrÚes       r   Úfetch_list_pager%      sx   € Ø�!‚|Ü�
Ð+Ð,‰ä�
Ð1°'°Ð;ˆðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ø�v‰vˆøÜò Üˆj˜˜	 ¨!¨Ð-Ô.Üûðús   œ/A Á	A0ÁA+Á+A0c                 ó"  — g }t        | d«      }|j                  dd¬«      D ]j  }|j                  d¬«      }|j                  dd«      }|j	                  d	«      }|r|j                  d¬«      nd}|sŒQ|sŒT|sŒW|j                  |||f«       Œl |S )
z"Extract (title, url, date) tuples.úhtml.parserÚaÚ
leftboxula©Úclass_T©ÚstripÚhrefÚ Úspan)r   Úfind_allÚget_textr   Úfind_next_siblingÚappend)ÚhtmlÚitemsÚsoupÚa_tagÚtitler"   r0   Údates           r   Úparse_list_pager;   )   s”   € à€EÜ˜˜}Ó-€Dà—‘˜s¨<�Ó8ò -ˆØ—‘ T�Ó*ˆØ�i‰i˜ Ó#ˆà×&Ñ& vÓ.ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆÚ’SšTØ�L‰L˜%  dÐ+Õ,ð-ð €Lr   c                 óô   — | j                  d«      st        t        | «      } 	 t        j                  | t
        dd¬«      }d|_        |j                  S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)NÚhttpr   Fr   r   zDetail error ú: )
Ú
startswithr   r   r   r   r   r   r   r    r   )Ú
detail_urlr#   r$   s      r   Úfetch_detailrA   9   sm   € Ø× Ñ  Ô(ÜœX zÓ2ˆ
ðÜ�L‰L˜¬W¸bÈÔOˆØˆŒ
Ø�v‰vˆøÜò Üˆm˜J˜< r¨!¨Ð-Ô.Üûðús   £/A Á	A7ÁA2Á2A7c                 ó¨  — ddddœ}t        | d«      }|j                  dd¬«      }|r(|j                  d«      }|r|j                  d¬	«      |d
<   |d
   sS|j                  ddd
i¬«      xs |j                  d
«      }|r)|j                  dd«      xs |j                  d¬	«      |d
<   |j                  dddi¬«      }|r,|j                  d«      r|d   j	                  dd«      dd |d<   |d   sr|j                  dt        j                  d«      ¬«      }|rJt        j                  d|j                  «       «      }|r$|j                  d«      j	                  dd«      |d<   |j                  dd¬«      }	|	rt        t        |	«      «      |d<   |S |j                  dd¬«      }
|
r-|
j                  dd„ ¬«      }	|	rt        t        |	«      «      |d<   |S )zExtract title, date, content.r/   ©r9   Úpublish_dateÚcontentr'   ÚdivÚcontitler*   Úh1Tr,   r9   ÚmetaÚname)ÚattrsrE   ÚPubDateú/ú-Né
   rD   r0   u   æ—¥æœŸ)Ústringz(\d{4}/\d{1,2}/\d{1,2})r   Ú
contentboxc                 ó6   — | r| xr d| j                  «       v S dS )NrE   F)Úsplit)Úcs    r   ú<lambda>zparse_detail.<locals>.<lambda>g   s"   € ÑabÀÒA]ÀyÐTU×T[ÑT[ÓT]ÐG]€ Ðhm€ r   )r   Úfindr2   r   ÚreplaceÚreÚcompileÚsearchÚgroupÚextract_clean_textÚstr)r5   Úresultr7   rG   rH   rI   Ú	meta_dateÚ	date_spanÚmÚcontent_divÚ	page_mains              r   Úparse_detailrd   E   sÍ  € à¨2¸"Ñ=€FÜ˜˜}Ó-€Dð �y‰y˜ zˆyÓ2€HÙØ�]‰]˜4Ó ˆÙØ Ÿk™k°˜kÓ5ˆF�7‰OØ�'Š?Ø�y‰y˜¨°Ð'8ˆyÓ9ÒO¸T¿Y¹YÀwÓ=OˆÙØ"Ÿh™h y°"Ó5ÒR¸¿¹ÈT¸Ó9RˆF�7‰Oð —	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø!*¨9Ñ!5×!=Ñ!=¸cÀ3Ó!GÈÈÐ!Lˆˆ~ÑØ�.Ò!Ø—I‘I˜f¬R¯Z©Z¸	Ó-B�IÓCˆ	ÙÜ—	‘	Ð4°i×6HÑ6HÓ6JÓKˆAÙØ)*¯©°«×);Ñ);¸CÀÓ)E��~Ñ&ð —)‘)˜E¨)�)Ó4€KÙÜ.¬s°;Ó/?Ó@ˆˆyÑð €Mð —I‘I˜e¨L�IÓ9ˆ	ÙØ#Ÿ.™.¨Ñ7m˜.ÓnˆKÙÜ$6´s¸;Ó7GÓ$H��yÑ!à€Mr   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 )Nr/   r'   r(   T)r.   r.   r,   u   é™„ä»¶r
   z](ú))r0   ÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorr-   z

)r   r1   r   r2   r   r   Úreplace_withÚunwraprJ   r4   r]   Úfind_parentÚjoinr-   )
Úcontent_htmlr7   r8   r.   r   Úfull_urlÚtagÚpartsÚelÚts
             r   r\   r\   n   s8  € ÙØÜ˜ }Ó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�«       g }t        dt        dz   «      D ]Í  }t        |«      }|s n¾t        |«      }|st	        d|› d�«        n |D ��cg c]  \  }}}|‘Œ
 }}}t        ˆfd	„|D «       «      }|rt	        d|› d
�«        nd|D ]!  \  }	}
}|‰k  rŒ|j                  |	|
|dœ«       Œ# t	        d|› dt        |«      › dt        |«      › d�«       t        j                  d«       ŒÏ t	        dt        |«      › d�«       g }t        |d«      D ]Á  \  }}t        |d   «      }|r.t!        |«      }|d   r|d   |d<   |d   r|d   |d<   |d   |d<   nd|d<   |j                  |d   |d   |d   |j#                  dd«      t$        › dt&        › �t&        dœ«       |dz  dk(  rt	        d|› dt        |«      › �«       t        j                  d«       ŒÃ d}d}dd l}|j+                  t,        «      }|j/                  d«       |j/                  d«       |j1                  «       }|D ]V  }	 |j/                  d|d    |d!   |d!   |d   |d   |d   |d   xs dd d" |d#   f«       |j2                  dkD  r|dz  }n|dz  }ŒX |j7                  «        |j9                  «        t	        d%|› d&|› d'�«       y c c}}w # t4        $ r}t	        d$|› �«       |dz  }Y d }~Œ³d }~ww xY w)(Nr   ©Údaysú%Y-%m-%dzFull crawl (cutoff: rf   r   z  Page z: empty, stoppingc              3   ó(   •K  — | ]	  }|‰k  –— Œ y ­w)N© )Ú.0ÚdÚcutoffs     €r   ú	<genexpr>zcrawl_all.<locals>.<genexpr>•   s   øè ø€ Ò3¨˜˜V�Ñ3ùs   ƒz: all before cutoff, stopping)r9   r"   r:   r>   z items (accumulated: ç      à?zAfter filter: ú itemsr"   r9   rD   r:   rE   r/   rN   ©r9   Úpage_urlrD   rE   Ú	site_nameÚcolumnrO   r   z
  Detail: rM   ú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 (?,?,?,?,?,?,?,?)r‰   rˆ   éô  rŠ   ú
DB error: úResult: ú new, ú skipped)r   Únowr   Ústrftimer   ÚrangeÚ	MAX_PAGESr%   r;   Úallr4   ÚlenÚtimeÚsleepÚ	enumeraterA   rd   r   r   ÚCOLUMNÚsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚrowcountr    ÚcommitÚclose)Úmonths_backÚ	all_itemsÚpgr5   r6   Ú_r‚   ÚdatesÚ
all_beforer9   r"   r:   ÚenrichedÚidxÚitemÚdetailÚstoredÚskippedr�   ÚconnrT   r$   rƒ   s                         @r   Ú	crawl_allr²   ‡   sp  ø€ Ü�l‰l‹nœy¨k¸BÑ.>Ô?Ñ?×IÑIÈ*ÓU€FÜÐ
˜v˜h aÐ(Ô)à€IÜ�A”y 1‘}Ó%ò ˆÜ˜rÓ"ˆÙÙÜ Ó%ˆÙÜ�'˜"˜Ð.Ð/Ô0ÙØ"'×(‘w�q˜!˜Q’Ð(ˆÑ(ÜÓ3¨UÔ3Ó3ˆ
ÙÜ�'˜"˜Ð:Ð;Ô<ÙØ %ò 	IÑˆE�3˜Ø�fŠ}ØØ×Ñ u°SÀ$ÑGÕHð	Iô 	ˆg�b�T˜œC ›J˜<Ð'<¼SÀ»^Ð<LÈAÐNÔOÜ�
‰
�3�ð%ô( ˆ.œ˜Y›Ð(¨Ð/Ô0à€HÜ˜y¨!Ó,ò ‰	ˆˆTÜ˜D ™KÓ(ˆÙÜ! $Ó'ˆFØ�gŠØ & w¡��W‘Ø�nÒ%Ø% nÑ5��V‘Ø$ YÑ/ˆD�ŠOà ˆD�‰Oà�‰Ø˜'‘]Ø˜U™Ø  ™LØ—x‘x 	¨2Ó.Ü ˜6 ¤6 (Ð+Üñ
ô 	ð �‰8�qŠ=Ü�*˜S˜E ¤3 y£>Ð"2Ð3Ô4Ü�
‰
�3�ð-ð0 €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ùóA )øôv ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   ÂK0É(AK6Ë6	LË?LÌLc                  óò  — t        j                  «       t        d¬«      z
  j                  d«      } t	        d| › d�«       t        d«      }|sy t        |«      }|D ���cg c]  \  }}}|| k\  sŒ|||f‘Œ }}}}g }|D ]l  \  }}	}
t        |	«      }|rt        |«      nddddœ}|j                  |d	   xs ||	|
|d
   t        › dt        › �t        dœ«       t        j                  d«       Œn 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 c c}}}w # t(        $ r}t	        d|› �«       |dz  }Y d }~Œ´d }~ww xY w)Né   r|   r~   zIncremental (since rf   r   r/   rC   r9   rE   rN   r‡   r…   r   r‹   rŒ   r�   r‰   rˆ   rD   rŽ   rŠ   r�   r�   r‘   r’   )r   r“   r   r”   r   r%   r;   rA   rd   r4   r   rœ   r™   rš   r�   rž   rŸ   r    r¡   r¢   r    r£   r¤   )rƒ   r5   r6   rz   rl   r‚   Úfilteredr«   r9   r"   r:   r®   r¯   r°   r�   r±   rT   r­   r$   s                      r   Úcrawl_incrementalr¶   ×   s)  € Ü�l‰l‹nœy¨aÔ0Ñ0×:Ñ:¸:ÓF€FÜÐ
˜f˜X QÐ'Ô(Ü˜1Ó€DÙØÜ˜DÓ!€EØ).×>Ð>™g˜a  A°!°v³+��A�q’	Ð>€HÒ>à€HØ$ò Ñˆˆs�DÜ˜CÓ ˆÙ'+”˜dÔ#¸2ÈrÐ^`Ñ1aˆØ�‰Ø˜G‘_Ò-¨ØØ Ø˜iÑ(Ü ˜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ùôS ?øôH ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús%   ÁG	Á.G	ÅAGÇ	G6ÇG1Ç1G6Ú__main__r   ÚincrementalÚfullÚlistzPage 1: r†   z  z | é<   )é$   )&Ú__doc__ÚsysÚosÚjsonrX   r™   r   r   r   Úbs4r   Úurllib.parser   ÚgetenvrŸ   r   rœ   r   r   r–   r   r%   r;   rA   rd   r\   r²   r¶   Ú__name__r˜   ÚargvÚmoder5   r6   rz   rl   r‚   r   r€   r   r   ú<module>rÇ      s:  ðñ÷ )× (× (ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø€Ø	€Ø$€àð  Dð€ð €	ò)òòò 	ò&òRAó2M4ò`04ðf ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ�Ø	�ŠÙ˜qÓ!ˆÙ)-‘ Ô%°2ˆÙˆh‘s˜5“z�l &Ð)Ô*Ø˜R˜a�yò 	'‰GˆAˆq�!Ù�B�q�c˜˜Q˜s ˜V˜HÐ%Õ&ñ	'ð	 
ð r   