Ë
    ¸¬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ddddddddddœZddddœZdZd„ Zd„ Zd„ Zd „ Zd!„ Zd"„ Zd4d#„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(  r~ ed&«      Z"e"re"jG                  d)d«      ndZ$ ed*e$› �«       e"jG                  d+«      xs g dd, D ]9  Z% e&d-e%jG                  d.«      xs d/dd0 › d1e%jG                  d2d/«      dd3 › �«       Œ; yyy)5ux   
Crawler: å�—é™µåŽ¿äººæ°‘æ”¿åºœ - å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶ï¼ˆæŠ¥å‘Šä¹¦ã€�æŠ¥å‘Šè¡¨ï¼‰å®¡æ‰¹ (Epoint åŸºå±‚æ”¿åŠ¡å…¬å¼€)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   å�—é™µåŽ¿ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€u9   å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶ï¼ˆæŠ¥å‘Šä¹¦ã€�æŠ¥å‘Šè¡¨ï¼‰å®¡æ‰¹zhttps://www.nlx.gov.cnz/wuhu/site/label/8888ÚgrassrootsContentPageListÚ6787891Ú6603411Ú15Ú1Útruez
yyyy-MM-ddÚ50Ú4ÚlistÚ1003011)Ú	labelNameÚsiteIdÚorganIdÚpageSizeÚ	pageIndexÚisDateÚ
dateFormatÚlengthÚtypeÚactionÚisJsonÚcatIdzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z!application/json, text/plain, */*z0application/x-www-form-urlencoded; charset=UTF-8)z
User-AgentÚAcceptzContent-Type)
z.docz.docxz.pdfz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚSITE)Úmsgs    ú/root/gov_crawler/crawl_nlx.pyÚlogr&   %   s   € Ü	ˆAŒdˆV�2�c�UÐ
 4Ö(ó    c                 óÚ   — i t         ¥dt        | «      i¥}	 t        j                  t        |t
        dd¬«      }|j                  «       S # t        $ r}t        d|› �«       Y d}~yd}~ww xY w)z%Fetch one page of list data from API.r   é   F)ÚdataÚheadersÚtimeoutÚverifyzAPI error: N)	ÚAPI_DATAÚstrÚrequestsÚpostÚAPI_URLÚHEADERSÚjsonÚ	Exceptionr&   )Ú
page_indexr*   ÚrÚes       r%   Úfetch_list_pager9   )   s`   € à5ŒhÐ5˜¤S¨£_Ñ5€DðÜ�M‰Mœ'¨´gÀrÐRWÔXˆØ�v‰v‹xˆøÜò Üˆk˜!˜ÐÔÜûðús   —1A	 Á		A*ÁA%Á%A*c                 ó  — | j                  d«      }|dk  r| j                  d«      }|dk  ry| j                  dd|«      }d}| j                  d|«      }|dkD  r¯|t        | «      k  r¡|dz  }| ||dz    d	k(  r| j                  d
|«      }|dk\  r|dz   }Œ@| ||dz    dk(  rU| j                  d|«      }||kD  r>| |dz   | j                  «       d   }|r|dk7  r|}Œ…|dz  }|dk(  rt	        | ||dz    «      S |dkD  r|t        | «      k  rŒ¡y)zAExtract content from nlx.gov.cn - j-fontContent gkwz_contnet div.z"class="j-fontContent gkwz_contnet"r   Úgkwz_contnetÚ ú<é   ú>é   z<!--z-->é   é   z</Údiv)ÚfindÚrfindÚlenÚsplitÚ_clean_content)ÚhtmlÚidxÚstartÚdepthÚjÚkÚtag_endÚtag_names           r%   Úget_content_localrQ   4   s=  € à
�)‰)Ð8Ó
9€CØ
ˆQ‚wØ�i‰i˜Ó'ˆØ
ˆQ‚wØØ�J‰J�s˜A˜sÓ#€EØ€EØ�	‰	�#�sÓ€AØ
�!Š)˜œC ›IšØ	ˆQ‰ˆØ��!�A‘#ˆ;˜&Ò Ø—	‘	˜% Ó#ˆAØ�AŠvØ˜‘E�ØØ��!�A‘#ˆ;˜$ÒØ—i‘i  QÓ'ˆGØ˜Š{Ø  !¡ GÐ,×2Ñ2Ó4°QÑ7�Ù ¨EÒ 1Ø�AØØ˜‘
�Ø˜A’:Ü)¨$¨u°W¸Q±YÐ*?Ó@Ð@ð! �!Š)˜œC ›I›ð" r'   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 )zgConvert content HTML to clean text with markdown links, preserving tables as HTML in original position.r<   zhtml.parserÚaT)ÚhrefrT   )Ústripu   é™„ä»¶r    z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorrU   z

)r   Úfind_allÚgetÚget_textr   ÚBASE_URLÚreplace_withÚunwrapÚnameÚappendr/   Úfind_parentÚjoinrU   )
Úcontent_htmlÚsoupÚa_tagrT   ÚtextÚfull_urlÚtagÚpartsÚelÚts
             r%   rH   rH   R   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         › d| › �}	 t        j                  |t        dd¬«      }d|_        |j
                  |fS # t        $ r}t        d| › d|› �«       d|fcY d}~S d}~ww xY w)	z&Fetch detail page and extract content.z/grassroots/content/r)   F)r+   r,   r-   zutf-8zFetch error for ú: N)re   r0   rc   r3   Úencodingro   r5   r&   )Ú
content_idÚurlr7   r8   s       r%   Úfetch_detailrz   i   sq   € äˆJÐ*¨:¨,Ð
7€CðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ø�v‰v�sˆ{ÐøÜò ÜÐ˜z˜l¨"¨Q¨CÐ0Ô1Ø�SˆyÕûðús   �1? ¿	A'ÁA"ÁA'Á"A'c                 ón  — ddddœ}t        j                  d| «      }|rI|j                  d«      j                  «       }t        j                  dd|«      j                  «       }||d<   t        j                  d| «      }|r%|j                  d«      j                  «       dd	 |d
<   t        | «      }||d<   |S )z.Extract title, date, content from detail page.r<   ©ÚtitleÚpublish_dateÚcontentz<title>(.*?)</title>r>   u*   [_\-â€”]\s*èŠœæ¹–å¸‚æ”¿åŠ¡å…¬å¼€å¹³å�°\s*$r}   zPubDate.*?content="([^"]+)"Né
   r~   r   )ÚreÚsearchÚgrouprU   ÚsubrQ   )rI   ÚresultÚmr}   r   s        r%   Úparse_detailr‡   u   s²   € à¨2¸"Ñ=€Fô 	�	‰	Ð)¨4Ó0€AÙØ—‘˜“
× Ñ Ó"ˆÜ—‘ÐDÀbÈ%ÓP×VÑVÓXˆØˆˆw‰ô 	�	‰	Ð0°$Ó7€AÙØ!"§¡¨£×!1Ñ!1Ó!3°C°RÐ!8ˆˆ~Ñô   Ó%€GØ€Fˆ9Ñà€Mr'   c                 óô  — t        j                  «       t        | dz  ¬«      z
  j                  d«      }t	        d|› d�«       t        d«      }|st	        d«       y |j                  dd	«      }t        t        d
   «      }||z   dz
  |z  }t	        d|› d|› �«       g }t        dt        |dz   d«      «      D ]Â  }t        |«      }|s n³|j                  dg «      }|D ]j  }	|	j                  d«      xs dd d }
|
|k  rŒ!|j                  |	d   |	j                  dd«      |
|	j                  dd«      |	j                  dd«      dœ«       Œl t	        d|› dt        |«      › d�«       t        j                  d«       ŒÄ t	        dt        |«      › d�«       g }t        |d«      D ]Ï  \  }}	|	d   rGt!        |	d   «      \  }}|r.t#        |«      }|d   r|d   |	d<   |d   r|d   |	d<   |d    |	d <   n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 # t4        $ r}t	        d,|› �«       |dz  }Y d }~Œ­d }~ww xY w)0Nr)   ©Údaysú%Y-%m-%dzFull crawl (cutoff: rV   r>   zFailed to fetch page 1Útotalr   r   úTotal: z	, pages: iõ  r*   ÚpublishDater<   r€   Ú	contentIdr}   Ú	urlDomainÚpublishDepartment)rx   r}   Údatery   Ú
departmentz  Page rv   z itemsç      à?zAfter filter: ry   rx   r~   r’   r   ú-©r}   Úpage_urlr~   r   Ú	site_nameÚcolumnz
  Detail: ú/ú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&   r9   rc   Úintr.   ÚrangeÚminri   rF   ÚtimeÚsleepÚ	enumeraterz   r‡   r#   ÚCOLUMNÚsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚrowcountr5   ÚcommitÚclose)Úmonths_backÚcutoffr*   rŒ   Ú	page_sizeÚtotal_pagesÚ	all_itemsÚpgÚitemsÚitemÚpub_dateÚenrichedrJ   rI   Ú_ÚdetailÚstoredÚskippedr¬   ÚconnÚcr8   s                         r%   Ú	crawl_allrÄ   Œ   sÌ  € Ü�l‰l‹nœy¨k¸BÑ.>Ô?Ñ?×IÑIÈ*ÓU€FÜÐ
˜v˜h aÐ(Ô)ô ˜1Ó€DÙÜÐ$Ô%ØØ�H‰H�W˜aÓ €EÜ”H˜ZÑ(Ó)€IØ˜9Ñ$ qÑ(¨YÑ6€KÜˆ'�%�˜	 + Ð/Ô0à€IÜ�A”s˜;¨™?¨CÓ0Ó1ò ˆÜ˜rÓ"ˆÙÙØ—‘˜ Ó$ˆØò 
	ˆDØŸ™ Ó/Ò5°2°s¸Ð;ˆHØ˜&Ò ØØ×ÑØ" ;Ñ/ØŸ™ '¨2Ó.Ø Ø—x‘x ¨RÓ0Ø"Ÿh™hÐ':¸BÓ?ñõ ð	
	ô 	ˆg�b�T˜œC ›J˜< vÐ.Ô/Ü�
‰
�3�ð#ô& ˆ.œ˜Y›Ð(¨Ð/Ô0à€HÜ˜y¨!Ó,ò ‰	ˆˆTØ�Š;Ü" 4¨Ñ#5Ó6‰GˆD�!ÙÜ% dÓ+�Ø˜'’?Ø$*¨7¡O�D˜‘MØ˜.Ò)Ø#)¨.Ñ#9�D˜‘LØ"(¨Ñ"3��Y’à"$��Y’à ˆD�‰Oà�‰Ø˜'‘]Ø˜U™Ø  ™LØ—x‘x 	¨2Ó.Ü ˜6 ¤6 (Ð+Üñ
ô 	ð �‰8�qŠ=Ü�*˜S˜E ¤3 y£>Ð"2Ð3Ô4Ü�
‰
�3�ð3ð8 €FØ€GÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØò ˆð	Ø�I‰Ið,ð ˜Ñ% t¨JÑ'7¸¸jÑ9IØ˜‘M 4¨Ñ#7¸¸i¹Ø˜)‘_Ò*¨¨D¨SÐ1°4¸±>ðô		ð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð& 	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øô ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   Ë	AMÍ	M7ÍM2Í2M7c                  óz  — t        j                  «       t        d¬«      z
  j                  d«      } t	        d| › d�«       t        d«      }|sy |j                  dg «      }g }|D ]Ð  }|j                  d«      xs d	d d
 }|| k  rŒ!|j                  dd	«      }t        |d   «      \  }}|rt        |«      nd	d	d	dœ}	|s t	        d|j                  dd	«      › d�«       Œy|j                  |	d   xs |j                  dd	«      |||	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é   r‰   r‹   zIncremental (since rV   r>   r*   rŽ   r<   r€   r�   r�   r|   z  Skip external: r}   z (no urlDomain)r   r•   r–   r”   r   r›   rœ   r�   r˜   r—   r~   rž   r™   rŸ   r    r¡   r¢   )r   r£   r   r¤   r&   r9   rc   rz   r‡   ri   r#   r«   r¨   r©   r¬   r­   r®   r¯   r°   r±   r5   r²   r³   )rµ   r*   rº   r½   r»   r¼   ry   rI   r¾   r¿   rÀ   rÁ   r¬   rÂ   rÃ   r8   s                   r%   Úcrawl_incrementalrÇ   ì   sh  € Ü�l‰l‹nœy¨aÔ0Ñ0×:Ñ:¸:ÓF€FÜÐ
˜f˜X QÐ'Ô(ä˜1Ó€DÙØØ�H‰H�V˜RÓ €Eà€HØò ˆØ—H‘H˜]Ó+Ò1¨r°3°BÐ7ˆØ�fÒØØ�h‰h�{ BÓ'ˆÜ˜t KÑ0Ó1‰ˆˆaÙ'+”˜dÔ#¸2ÈrÐ^`Ñ1aˆñ ÜÐ# D§H¡H¨W°RÓ$8Ð#9¸ÐIÔJØà�‰Ø˜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øô ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   ÆAHÈ	H:ÈH5È5H:Ú__main__r>   ÚincrementalÚfullrŒ   r�   r*   é   z  rŽ   r<   r€   z | r}   é<   )é$   )'Ú__doc__ÚsysÚosr4   r�   r¨   r0   r   r   Úbs4r   Úurllib.parser   Úgetenvr®   r#   r«   re   r2   r.   r3   ÚATTACH_EXTSr&   r9   rQ   rH   rz   r‡   rÄ   rÇ   Ú__name__rF   ÚargvÚmoder*   rc   rŒ   Úitr"   © r'   r%   ú<module>rÚ      s¥  ðñ÷ )× (× (ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø$€Ø	D€Ø#€ØˆJÐ+Ð
,€à,ØØØØØØØØØØØñ€ð DØ1ØFñ€ð
 a€ò)òòò<Aò.	òó.]4ò@:4ðz ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ�Ø	�ŠÙ˜qÓ!ˆÙ(,�—‘˜ !Ô$°!ˆÙˆg�e�WÐÔØ—8‘8˜FÓ#Ò) r¨2¨AÐ.ò 	YˆBÙ�B˜Ÿ™˜}Ó-Ò3°°S°bÐ9Ð:¸#¸b¿f¹fÀWÈRÓ>PÐQTÐRTÐ>UÐ=VÐWÕXñ	Yð	 
ð r'   