Ë
    9JŠj()  ã                   óp  — 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	 dZ
dZdZdZd	d
ddœZd„ Zd"d„Zd„ Zd„ Zd„ Zd#d„Zedk(  réddlZ ej.                  d¬«      Zej3                  dedd¬«       ej3                  ddd¬«       ddlZ eej:                  «      dkD  r2ej:                  d   j=                  «       r eej:                  d   «      ndZe�+ e d  e!e«      z   «       ej:                  jE                  «        ejG                  «       Z$ ee$jJ                  e$jL                  ¬!«       yy)$u³   çŽ‰å±±åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Šçˆ¬è™«
ç«™ç‚¹: www.zgys.gov.cn (çŽ‰å±±åŽ¿, æ±Ÿè¥¿ä¸Šé¥¶)
æ �ç›®: /zgys/c120467/new_list.shtml (å…¬ç¤ºå…¬å‘Š)
CMS: è‡ªå®šä¹‰ï¼Œé�™æ€�HTMLåˆ†é¡µ
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zgys.gov.cnz/zgys/c120467/z/root/search.dbzwww.zgys.gov.cn-gsggzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  óZ   — t        j                  t        «      } | j                  d«       | S )NzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú$/root/gov_crawler/crawl_zgys_gsgg.pyÚinit_dbr      s"   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø€Kó    c                 ó@  — 	 t        j                  | t        |¬«      }d|_        |j                  dk(  r|j
                  S t        d|j                  › d| › �t        j                  ¬«       y # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)N)ÚheadersÚtimeoutzutf-8éÈ   z  [WARN] HTTP z for ©Úfilez  [ERROR] fetch failed: )
ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚprintÚsysÚstderrÚ	Exception)Úurlr   ÚrespÚes       r   Ú
fetch_pager"   !   s†   € ð	Ü�|‰|˜C¬¸'ÔBˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐÜ�˜t×/Ñ/Ð0°°c°UÐ;Ä#Ç*Á*ÕMØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚=A, Á +A, Á,	BÁ5BÂBc                 ó  — g }t        | d«      }|j                  dd„ ¬«      }|st        dt        j                  ¬«       |S |j                  dd¬	«      D �]2  }|j                  d
«      }|r|j                  d«      sŒ)|d   j                  «       }|j                  d«      r
t        |z   }n|j                  d«      rnt        dz   |z   }|j                  d¬«      xs d}t        j                  dd|«      }t        j                  dd|«      j                  «       }|sŒÊ|j                  dd¬«      }|r|j                  d¬«      nd}	t        j                  d|	«      }
|
r|
j                  d«      nd}	|j                  |||	dœ«       �Œ5 |S )u2   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž (url, title, date) åˆ—è¡¨úhtml.parserÚulc                 ó,   — | r| xr dt        | «      v S dS )NÚlistYs01F)Ústr)Úcs    r   ú<lambda>zparse_list.<locals>.<lambda>3   s   € É¨!Ò*D°
¼cÀ!»fÐ0D€ Èu€ r   ©Úclass_z  [WARN] ul.listYs01 not foundr   ÚliF)Ú	recursiveÚaÚhrefú/ÚhttpT©ÚstripÚ z\s+ú z\.\.\.$ÚspanÚriqiú(\d{4}-\d{2}-\d{2})é   )r   ÚtitleÚpub_date)r   Úfindr   r   r   Úfind_allr   r4   Ú
startswithÚBASE_URLÚget_textÚreÚsubÚsearchÚgroupÚappend)ÚhtmlÚitemsÚsoupr%   r-   r/   r0   r;   Ú	date_spanr<   Ú
date_matchs              r   Ú
parse_listrL   -   sp  € à€EÜ˜˜}Ó-€Dð 
�‰�4Ñ TˆÓ	U€BÙÜÐ.´S·Z±ZÕ@Øˆà�k‰k˜$¨%ˆkÓ0ó JˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ�?‰?˜3ÔÜ˜d‘?‰DØ�_‰_˜VÔ$Øä˜c‘> DÑ(ˆDð —
‘
 �
Ó&Ò,¨"ˆÜ—‘�v˜s EÓ*ˆÜ—‘�z 2 uÓ-×3Ñ3Ó5ˆÙØð —G‘G˜F¨6�GÓ2ˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆÜ—Y‘YÐ5°xÓ@ˆ
Ù*4�:×#Ñ# AÔ&¸"ˆà�‰˜T¨E¸xÑHÖIð5Jð8 €Lr   c                 ó  ‡— t        | d«      }d}|j                  d«      }|r|j                  d¬«      }|s%|j                  d«      }|r|j                  d¬«      }|sL|j                  d«      }|r9|j                  d¬«      }t        j                  dd|«      }|j                  «       }d}|j                  d	«      }	|	r7t        j                  d
|	j                  «       «      }
|
r|
j                  d«      }|sL|j                  dd¬«      }|r7t        j                  d
|j                  «       «      }
|
r|
j                  d«      }|j                  dd¬«      }|s|j                  dd¬«      }g }|rØ|j                  d«      D ]Ä  }|j                  dd«      j                  «       Št        ˆfd„dD «       «      sŒ8‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                   j#                  ‰«      }t        ˆfd„|D «       «      rŒ±|j%                  ‰|dœ«       ŒÆ d}d}|�rp|j                  ddg«      D ]  }|j'                  «        Œ t)        «       }|j                  d«      D ]g  }|j                  d«      }|rt        d„ |D «       «      nd}|s|sŒ/|j                  d¬«      }||v rŒF|j+                  |«       |t-        |«      d z   z  }Œi t        t-        |«      d«      }|j                  d«      D ]  }|j'                  «        Œ |j                  d«      }|rAg }|D ](  }|j                  d¬«      }|sŒ|j%                  |«       Œ* d j/                  |«      }n|j                  d d¬!«      }t        j                  d"d |«      }|r|d#|z   z  }t1        |j                  «       «      d$k  r"d%|› d&|› d'�}|D ]  }|d(|d   › d)|d*   › d+�z  }Œ ||||fS ),u3   è§£æž�è¯¦æƒ…é¡µ - æ ‡é¢˜ã€�æ­£æ–‡ã€�æ—¥æœŸã€�é™„ä»¶r$   r5   Ú	ucaptitleTr3   Úh1r;   u#   \s*[-_|]\s*çŽ‰å±±åŽ¿äººæ°‘æ”¿åºœ.*$ÚPUBLISHTIMEr9   r:   ÚpÚexplainr+   ÚdivÚZoom)ÚidÚmainContr/   r0   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)Úendswith)Ú.0Úextr0   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>‚   s    øè ø€ ò `¨#�4—=‘= ×%ñ `ùs   ƒ)	z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.pptz.pptxr2   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )rY   r/   r0   s     €r   r[   zparse_detail.<locals>.<genexpr>‡   s   øè ø€ ÒA°˜1˜U™8 tÕ+ÑAùs   ƒ)r   r;   ÚscriptÚstyleÚtableÚtrc              3   óV   K  — | ]!  }t        |j                  d «      «      dk\  –— Œ# y­w)Útdé   N)Úlenr>   )rY   Úrows     r   r[   zparse_detail.<locals>.<genexpr>•   s#   è ø€ ÒH¸Cœ3˜sŸ|™|¨DÓ1Ó2°aÕ7ÑHùs   ‚')Fz

)Ú	separatorr4   z\n{4,}u   

[è¡¨æ ¼]

é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [z](r   ú))r   r=   rA   rB   rC   r4   rD   rE   r>   r   Úanyr?   r   ÚcompatÚurljoinÚosÚpathÚbasenamerF   Ú	decomposeÚsetÚaddr(   Újoinre   )rG   r   rI   r;   ÚucaprO   Ú	title_tagÚtr<   ÚptrK   Ú	explain_pÚcontent_divÚattachmentsÚa_tagÚ	att_titleÚcontentÚtables_htmlÚtagÚ
seen_textsr`   ÚrowsÚhas_dataÚtxtÚcontent_div_cleanÚ
paragraphsÚ
para_textsrQ   Úp_textÚattr0   s                                 @r   Úparse_detailr‰   V   s  ø€ ä˜˜}Ó-€Dð €EØ�9‰9�[Ó!€DÙØ—‘ D�Ó)ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘Ð=¸rÀ1ÓEˆAØ—G‘G“IˆEð €HØ	�‰�=Ó	!€BÙ	Ü—Y‘YÐ5°r·{±{³}ÓEˆ
ÙØ!×'Ñ'¨Ó*ˆHÙØ—I‘I˜c¨)�IÓ4ˆ	ÙÜŸ™Ð#9¸9×;MÑ;MÓ;OÓPˆJÙØ%×+Ñ+¨AÓ.�ð —)‘)˜E f�)Ó-€KÙØ—i‘i ¨j�iÓ9ˆð €KÙØ ×)Ñ)¨#Ó.ò 	JˆEØ—9‘9˜V RÓ(×.Ñ.Ó0ˆDÜó `Ø^ô`õ `à—‘ vÔ.Ü#Ÿ?™?×2Ñ2°3¸Ó=�DØ!ŸN™N°˜NÓ6ÒP¼"¿'¹'×:JÑ:JÈ4Ó:P�	ÜÓA°[ÔAÕAØ×&Ñ&¨t¸iÑ'HÕIð	Jð €GØ€KÚà×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ô “Uˆ
Ø ×)Ñ)¨'Ó2ò 		/ˆEØ—>‘> $Ó'ˆDÙLP”sÑHÀ4ÔHÔHÐV[ˆHÙ¡DØØ—.‘. t�.Ó,ˆCØ�jÑ ØØ�N‰N˜3ÔØœ3˜u›:¨Ñ.Ñ.‰Kð		/ô *¬#¨kÓ*:¸MÓJÐØ$×-Ñ-¨gÓ6ò 	ˆCØ�M‰M�Oð	ð '×/Ñ/°Ó4ˆ
ÙØˆJØò .�ØŸ™¨$˜Ó/�ÚØ×%Ñ% fÕ-ð.ð —k‘k *Ó-‰Gà'×0Ñ0¸6ÈÐ0ÓNˆGä—&‘&˜ F¨GÓ4ˆÙØÐ)¨KÑ7Ñ7ˆGô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨jÐ9ˆØò 	CˆCØ˜ S¨¡\ N°"°S¸±Z°LÀÐBÑB‰Gð	Cð �'˜8 [Ð0Ð0r   c                 óÄ   — |rt        j                  |d¬«      nd}t        t        |«      «      dz  dz   }| j	                  d|||||||||f	«       | j                  «        y )NF)Úensure_asciiz[]é
   r:   uû   
        INSERT OR REPLACE INTO gov_raw 
        (page_url, site_name, source_url, title, publish_date, summary, content, attachments, date_rank, status, category, visits)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'published', 'å…¬ç¤ºå…¬å‘Š', 0)
    )ÚjsonÚdumpsÚabsÚhashr
   Úcommit)	r   Úpage_urlr;   Úsummary_textÚpublish_daterz   Ú	site_nameÚattachments_jsonÚlevels	            r   Úsave_articler˜   º   sg   € ÙFQ”t—z‘z +¸EÕBÐW[ÐÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   é   c                 óX  — t        «       }d}d}t        «       }t        | «      D �]Å  }|dk(  rt        t        z   dz   }nt        t        z   d|dz   › d�z   }t        d|dz   › d|› �«       t        |«      }|st        d|dz   › d	�«        �nbt        |«      }	|	st        d
«        �nG|	D �
cg c]  }
|
d   |vsŒ|
‘Œ }}
|	D ]  }
|j                  |
d   «       Œ t        dt        |	«      › dt        |«      › d�«       |s|dkD  rt        d«        nÝ|D ]Õ  }|d   }|d   }|d   }|r$|j                  d|f«      j                  «       }|rŒ8t        d|d d › d�«       t        |«      }|s|dz  }t        d|› �«       Œkt        ||«      \  }}}}|s|r|}|rGt        ||||||t        «       |dz  }t        |«      }|rd|› d�nd}t        d|› d|d d › d|› �«       ŒËt        d«       Œ× �ŒÈ |j                  «        	 dd l}t        j#                  dd«      }d|z   dz   |z   d z   }|j%                  d!t&        |gd"d"d#¬$«      }|j(                  dk(  rt        d%«       nt        d&|j*                  «       t        d(|› d)|› �«       y c c}
w # t,        $ r}t        d'|«       Y d }~Œ1d }~ww xY w)*Nr   znew_list.shtmlÚ	new_list_r:   z.shtmlz[PAGE z] z  [WARN] Page z unreachable, stoppingz  No articles found, stoppingr   z  Found z articles (z new)z  No new items, stoppingr;   r<   z/SELECT page_url FROM gov_raw WHERE page_url = ?z
  [FETCH] é2   z...z#  [ERROR] detail page unreachable: z +u   é™„ä»¶r5   u       âœ“ saved [u       âœ— empty title, skippedú'z''zšINSERT INTO gov_search (rowid, title, site_name, summary) SELECT r.rowid, r.title, r.site_name, substr(r.content,1,300) FROM gov_raw r WHERE r.site_name='zD' AND r.rowid NOT IN (SELECT rowid FROM gov_search WHERE site_name='z');r   Té   )Úcapture_outputr   r   z  [FTS] syncedz  [FTS] error:z  [FTS] failed:z
[DONE] Total: z articles, Errors: )r   rq   Úranger@   Ú	LIST_PATHr   r"   rL   rr   re   r
   Úfetchoner‰   r˜   Ú	SITE_NAMEÚcloseÚ
subprocessÚreplaceÚrunr	   Ú
returncoder   r   )Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚ	seen_urlsÚpageÚlist_urlrG   rH   ÚitÚunique_itemsÚitemr   r;   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titler}   r<   rz   Ú	att_countÚatt_strr¥   Úfts_siteÚsync_sqlÚresultr!   s                                r   Úcrawlr¼   Ä   s2  € Ü‹9€DØ€EØ€FÜ“€Iä�iÓ ó 97ˆØ�1Š9Ü¤)Ñ+Ð.>Ñ>‰Hä¤)Ñ+°	¸$¸q¹&¸ÀÐ.HÑHˆHä��t˜A‘v�h˜b  
Ð+Ô,Ü˜(Ó#ˆÙÜ�N 4¨¡6 (Ð*@ÐAÔBÚä˜4Ó ˆÙÜÐ1Ô3Úà%*ÖI˜r¨b°©i¸yÒ.HšÐIˆÐIØò 	%ˆBØ�M‰M˜"˜U™)Õ$ð	%ä�œ˜U›˜ K´°LÓ0AÐ/BÀ%ÐHÔIáØ�aŠxÜÐ0Ô2Ùà ò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIáØŸ<™<ØEÈÀvóç‘(“*ð ñ Øä�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ÜÐ;¸C¸5ÐAÔBØä;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�áÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü Ó,�	Ù4=˜B˜y˜k¨Ñ0À2�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÈ'ÈÐSÕTäÐ4Õ6ò=	7ð797ðv 	‡J�J„Lð
$ÛÜ×$Ñ$ S¨$Ó/ˆð pð  s{ñ  {ð  ~Dñ  Dð  GOñ  Oð  RWñ  WˆØ—‘ ¬G°XÐ >ÈtÐZ^Ðhj�ÓkˆØ×Ñ Ò!ÜÐ"Õ#äÐ" F§M¡MÔ2ô 
Ð˜U˜GÐ#6°v°hÐ
?Õ@ùòs Jøôl ò $ÜÐ ×#Ñ#ûð$ús%   Â*JÂ7JÇ>A5J
 Ê
	J)ÊJ$Ê$J)Ú__main__u'   çŽ‰å±±åŽ¿äººæ°‘æ”¿åºœå…¬ç¤ºå…¬å‘Šçˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)ÚactionrÁ   r:   éÿÿÿÿz[AutoPg] max_pages=)r©   rª   )rž   )r™   F)'Ú__doc__r   r   rB   r   rm   r�   r   Úbs4r   r@   r¡   r	   r£   r   r   r"   rL   r‰   r˜   r¼   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ_SYS2re   ÚargvÚisdigitÚ_MAX_PGr   r(   ÚpopÚ
parse_argsÚargsr©   rª   r]   r   r   ú<module>rÔ      sC  ðñó Û Û 	Û 
Û 	Û Ý Ý à#€Ø€	Ø
€Ø"€	ð DØpØ0ñ€òó

ò'òRb1òHóPAðd ˆzÒÛØ$ˆX×$Ñ$Ð1ZÔ[€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜°À>ÐÔRãÙ%(¨¯©£_°qÒ%8¸U¿Z¹ZÈ¹^×=SÑ=SÔ=U‰c�%—*‘*˜R‘.Ô!Ð[_€GØÐÙÐ#¡c¨'£lÑ2Ô3Ø�
‰
�‰ÔØ×ÑÓ€DÙ	�D—N‘N°×0@Ñ0@ÖAð r   