Ë
    ¸¬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	  ej                  dd«      ZdZdZdZd	Zg d
¢Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u*  
å��å °ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - ç”Ÿæ€�çŽ¯å¢ƒæ �ç›®çˆ¬è™«
Site: www.sygxq.gov.cn
CMS: TRS (createPageHTML)
List: li.list-group-item.border-0 > a[href], span for date
Detail: meta[ArticleTitle], meta[PubDate], div.view.TRS_UEDITOR
Pagination: index.shtml, index_N.shtml (6 pages total, 25 items/page)
é    N)ÚdatetimeÚtimezoneÚ	SEARCH_DBz/root/search.dbu(   å��å °ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº-ç”Ÿæ€�çŽ¯å¢ƒu   ç”Ÿæ€�çŽ¯å¢ƒz0http://www.sygxq.gov.cn/xxgk/fdzdgk/zdmsxx/hjbh/z
2023-06-18)Úcurlz-sLz
--max-timeÚ30z-AzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó¨   — t         | gz   }	 t        j                  |ddd¬«      }|j                  dk(  r|j                  r|j                  S y#  Y yxY w)zFetch URL with curlTé#   )Úcapture_outputÚtextÚtimeoutr   N)Ú	CURL_OPTSÚ
subprocessÚrunÚ
returncodeÚstdout)ÚurlÚcmdÚresults      ú /root/gov_crawler/crawl_sygxq.pyÚcurl_getr      sR   € ä
�s�eÑ
€CðÜ—‘ °D¸tÈRÔPˆØ×Ñ Ò! f§m¢mØ—=‘=Ð ØøðÙús   Œ?A ÁAc                 óô  — t        j                  d| t         j                  «      }g }|D ]Ë  \  }}}|j                  d«      r(t        j
                  j                  t        |dd «      }nj|j                  d«      r!t        j
                  j                  d|«      }n8|j                  d«      r|}n$t        j
                  j                  t        |«      }|j                  ||j                  «       |f«       ŒÍ |S )z7Parse list page HTML, return list of (url, title, date)zl<li class="list-group-item border-0">.*?<a href="([^"]+)".*?title="([^"]+)".*?<span[^>]*>(\d{4}-\d{2}-\d{2})ú./é   Nú/zhttp://www.sygxq.gov.cnÚhttp)
ÚreÚfindallÚDOTALLÚ
startswithÚurllibÚparseÚurljoinÚBASE_URLÚappendÚstrip)ÚhtmlÚitemsr   ÚhrefÚtitleÚdateÚfull_urls          r   Úparse_list_pager,   )   sË   € ä�J‰JØwØŒb�i‰ió€Eð €FØ"ò 
7Ñˆˆe�Tà�?‰?˜4Ô Ü—|‘|×+Ñ+¬H°d¸1¸2°hÓ?‰HØ�_‰_˜SÔ!Ü—|‘|×+Ñ+Ð,EÀtÓL‰HØ�_‰_˜VÔ$Ø‰Hä—|‘|×+Ñ+¬H°dÓ;ˆHØ�‰�x §¡£°Ð5Õ6ð
7ð €Mó    c                 ón  — t        | «      }|syt        j                  d|«      }|r|j                  d«      nd}t        j                  d|«      }|r|j                  d«      j	                  «       nd}d}t        j                  d|t        j
                  «      }|rX|j                  d«      j	                  «       }t        j                  ddt        j                  j                  | d	«      › �|«      }n½t        j                  d
|t        j
                  «      }|rP|j                  d«      }	|	j                  d«      s t        j                  j                  | |	«      }	d|	› d|xs d› d�}nFt        j                  d|t        j
                  «      }
|
r|
j                  d«      j	                  «       }|st        j                  d|«      }|r |j                  d«      j	                  «       }nGt        j                  d|«      }|r/|j                  d«      j                  dd«      j	                  «       }|||fS )z2Fetch detail page and extract title, date, content)NNNz+<meta name="ArticleTitle" content="([^"]*)"é   Nz&<meta name="PubDate" content="([^"]*)"z<<div class="view TRS_UEDITOR[^"]*"[^>]*>(.*?)</div>\s*</div>zsrc="\./zsrc="r   z$<iframe[^>]*src="([^"]+\.pdf)"[^>]*>r   u4   <p>è¯¦ç»†å†…å®¹è¯·æŸ¥çœ‹PDFæ–‡ä»¶ï¼š</p><p><a href="z" target="_blank">u	   æŸ¥çœ‹PDFz</a></p>zM<div class="text-justify fz-18 lh-225">(.*?)</div>\s*<div class="social-sharez<h1[^>]*>([^<]+)</h1>z<title>([^<]+)</title>u    - ç”Ÿæ€�çŽ¯å¢ƒÚ )r   r   ÚsearchÚgroupr%   r   Úsubr    r!   r"   r   Úreplace)r   r&   Útitle_mr)   Údate_mr*   ÚcontentÚue_matchÚ	pdf_matchÚpdf_urlÚdc_matchÚh1_mÚtitle_m2s                r   Úfetch_detailr>   =   sï  € ä�C‹=€DÙØô �i‰iÐFÈÓM€GÙ 'ˆG�M‰M˜!Ô¨T€Eô �Y‰YÐ@À$ÓG€FÙ&,ˆ6�<‰<˜‹?× Ñ Ô"°$€Dð €GÜ�y‰yØGØŒb�i‰ió€Hñ Ø—.‘. Ó#×)Ñ)Ó+ˆä—&‘&˜¨¬f¯l©l×.BÑ.BÀ3ÈÓ.MÐ-NÐ&OÐQXÓY‰ô —I‘IØ3Ø”"—)‘)ó
ˆ	ñ Ø—o‘o aÓ(ˆGØ×%Ñ% fÔ-Ü Ÿ,™,×.Ñ.¨s°GÓ<�ØLÈWÈIÐUgÐhmÒh|Ðq|Ðg}ð  ~Fð  G‰Gô —y‘yØ`Ø”b—i‘ióˆHñ Ø"Ÿ.™.¨Ó+×1Ñ1Ó3�áÜ�y‰yÐ1°4Ó8ˆÙØ—J‘J˜q“M×'Ñ'Ó)‰Eä—y‘yÐ!:¸DÓAˆHÙØ Ÿ™ qÓ)×1Ñ1Ð2CÀRÓH×NÑNÓP�à�$˜ÐÐr-   c           
      ó�  — ddl }|j                  t        «      }|j                  «       }d„ }d}| D ]>  \  }}}}		 |j	                  d|| ||«      |	t
        |f«       |j                  dkD  r|dz  }Œ@ |j                  «        |j                  «        |S # t        $ r(}
t        d|
› �t        j                  ¬«       Y d}
~
Œ�d}
~
ww xY w)zSave items to search.dbr   Nc                 ó   — | sy | d d S )Né
   © )Úds    r   Útruncate_datez!save_to_db.<locals>.truncate_date|   s   € ÙØØ��"ˆvˆr-   z¢
                INSERT OR IGNORE INTO gov_raw (page_url, title, publish_date, content, site_name, summary)
                VALUES (?, ?, ?, ?, ?, ?)
            r/   z  DB error: ©Úfile)Úsqlite3Úconnectr   ÚcursorÚexecuteÚ	SITE_NAMEÚrowcountÚ	ExceptionÚprintÚsysÚstderrÚcommitÚclose)r'   rG   ÚconnÚcrD   Ú	new_countÚpage_urlr)   Úpublish_dater7   Úes              r   Ú
save_to_dbrY   t   sÌ   € ãà�?‰?œ9Ó%€DØ�‰‹€Aòð
 €IØ27ò 	7Ñ.ˆ�%˜ wð	7Ø�I‰Ið ð ˜E¡=°Ó#>ÀÌÐTYÐZô\ð �z‰z˜AŠ~Ø˜Q‘�	øð	7ð 	‡K�K„MØ‡J�J„LØÐøô ò 	7Ü�L  Ð$¬3¯:©:×6Ò6ûð	7ús   º6BÂ	CÂC Ã Cc                  ó8  — ddl } 	 | j                  t        «      }|j                  «       }|j	                  d«       |j                  «        |j                  «        t        d«       y# t        $ r(}t        d|› �t        j                  ¬«       Y d}~yd}~ww xY w)zRebuild FTS indexr   Nz4INSERT INTO gov_search(gov_search) VALUES('rebuild')z  FTS index rebuiltz  FTS rebuild error: rE   )rG   rH   r   rI   rJ   rQ   rR   rN   rM   rO   rP   )rG   rS   rT   rX   s       r   Úrebuild_ftsr[   ‘   st   € ãð<Ø�‰œyÓ)ˆØ�K‰K‹MˆØ	�	‰	ÐHÔIØ�‰ŒØ�
‰
ŒÜÐ#Õ$øÜò <ÜÐ% a SÐ)´·
±
×;Ò;ûð<ús   †A!A( Á(	BÁ1BÂBc            	      ó  — t        dt        › dt        › �«       g } d}d}||k  �rf|dk(  rt        }nt        › d|› d�}t        d|› d|d	z
  › d
|› �«       t	        |«      }|s$t        d|› �t
        j                  ¬«       |d	z  }Œft        |«      }t        dt        |«      › d�«       |D ���cg c]  \  }}}|t        k\  sŒ|||f‘Œ }	}}}|D ���cg c]  \  }}}|t        k  sŒ|||f‘Œ }
}}}|
rt        dt        |
«      › dt        › �«       |	rJt        dt        |	«      › �«       |	D ].  \  }}}t        d|› d|d d › �«       | j                  |||f«       Œ0 t        |
«      t        |«      k(  rt        d«       n|d	z  }||k  r�Œft        dt        | «      › �«       | st        d«       y g }| D ]z  \  }}}t        d|d d › d�«       t        |«      \  }}}|r|j                  ||xs ||xs ||f«       ŒHt        d|› �t
        j                  ¬«       |j                  |||df«       Œ| t        dt        |«      › d�«       t        |«      }t        d|› d �«       |dkD  r
t        «        t        d!«       y c c}}}w c c}}}w )"NzStarting crawl: z - r   é   Úindex_z.shtmlz  Fetching page r   r/   z: z  Failed to fetch page rE   z
    Found z itemsz    Filtered: z older than z    Recent items: z      z | é2   z4    All items older than cutoff, stopping paginationz
Total recent items: zNo new items to process.z  Fetching detail: é(   z...z    No content found for r0   z
Saving z items to DB...z  Inserted z new recordszDone!)rN   rK   ÚCOLUMN_NAMEr#   r   rO   rP   r,   ÚlenÚCUTOFF_DATEr$   r>   rY   r[   )Útotal_itemsÚpageÚ	max_pagesr   r&   r'   ÚuÚtrC   ÚrecentÚolderÚdetail_itemsr)   r*   Údetail_titleÚdetail_dater7   rU   s                     r   Úmainrn   ž   sÉ  € Ü	ÐœY˜K s¬;¨-Ð
8Ô9à€KØ€DØ€Ià
�Ó
Ø�1Š9Ü‰Cä�J˜f T F¨&Ð1ˆCäÐ    a¨	°!© }°B°s°eÐ<Ô=Ü˜‹}ˆÙÜÐ+¨D¨6Ð2¼¿¹ÕDØ�A‰IˆDØä Ó%ˆÜ�
œ3˜u›:˜, fÐ-Ô.ð ,1×EÐE¡  1 a°A¼Ó4D�1�a˜’)ÐEˆÒEØ*/×CÐC™w˜q ! Q°1´{³?�!�Q˜’ÐCˆÒCáÜ�N¤3 u£: ,¨l¼;¸-ÐHÔIáÜÐ&¤s¨6£{ mÐ4Ô5Ø!ò .‘��1�aÜ˜˜q˜c  Q s¨ V HÐ-Ô.Ø×"Ñ" A q¨! 9Õ-ð.ô
 ˆu‹:œ˜U›Ò#ÜÐHÔJØà�‰	ˆðE �Ô
ôH 
Ð"¤3 {Ó#3Ð"4Ð
5Ô6áÜÐ(Ô)Øð €LØ'ò 8ÑˆˆU�DÜÐ# E¨#¨2 J <¨sÐ3Ô4Ü-9¸#Ó->Ñ*ˆ�k 7ÙØ×Ñ  lÒ&;°e¸[Ò=PÈDÐRYÐ ZÕ[äÐ-¨c¨UÐ3¼#¿*¹*ÕEØ×Ñ  e¨T°2Ð 6Õ7ð8ô 
ˆI”c˜,Ó'Ð(¨Ð
8Ô9Ü˜<Ó(€IÜ	ˆK˜	�{ ,Ð
/Ô0ð �1‚}ÜŒä	ˆ'…Nùô[ FùÜCs   Â/I?ÃI?ÃJÃ&JÚ__main__)Ú__doc__ÚosrO   r   Újsonr   Úurllib.parser    r   r   Úgetenvr   rK   ra   r#   rc   r   r   r,   r>   rY   r[   rn   Ú__name__rB   r-   r   ú<module>rv      s„   ðñó 
Û 
Û 	Û Û Û ß 'àˆB�I‰I�kÐ#4Ó5€	Ø6€	Ø€Ø=€Ø€ò€	ò
	òò(5 ònò:<òEðN ˆzÒÙ…Fð r-   