Ë
    V_Š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.zgwn.gov.cn
æ �ç›®: /ZWGK_2_0/JSXMHJYXPJ/list_1.shtml (å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·)
CMS: æ”¿åºœä¿¡æ�¯å…¬å¼€ç³»ç»Ÿï¼Œtableåˆ—è¡¨+jsonåˆ†é¡µ
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zgwn.gov.cnz/ZWGK_2_0/JSXMHJYXPJ/z/root/search.dbzwww.zgwn.gov.cn-hjxpzoMozilla/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_zgwn_hjxp.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|j                  dd¬«      }|st        dt        j                  ¬«       |S |j                  d	«      D �]�  }|j                  d
d„ ¬«      }|j                  d
d„ ¬«      }|r|sŒ1|j                  d«      }|r|j                  d«      sŒV|d   j                  «       }|j                  d«      r
t        |z   }n|j                  d«      rnt        dz   |z   }|j                  d«      xs |j                  d¬«      xs dj                  «       }	t        j                  dd|	«      }	t        j                  dd|	«      j                  «       }	|	s�Œ|j                  d«      }
|
r|
j                  d¬«      n|j                  d¬«      }t        j                  d|«      }|r|j                  d«      nd}|j                  ||	|dœ«       �Œ’ |S )u+   è§£æž�åˆ—è¡¨é¡µ - table.table3#doclist > trúhtml.parserÚtableÚtable3©Úclass_Údoclist©Úidz   [WARN] table#doclist not foundr   ÚtrÚtdc                 ó,   — | r| xr dt        | «      v S dS )Nz83%F©Ústr©Úvs    r   ú<lambda>zparse_list.<locals>.<lambda>:   ó   € É°Ò0E°e¼sÀ1»v°o€ ÐPU€ r   )Úwidthc                 ó,   — | r| xr dt        | «      v S dS )Nz18%Fr/   r1   s    r   r3   zparse_list.<locals>.<lambda>;   r4   r   ÚaÚhrefú/ÚhttpÚtitleT©ÚstripÚ z\s+ú z\.\.\.$Úspanú(\d{4}-\d{2}-\d{2})é   )r   r;   Úpub_date)r   Úfindr   r   r   Úfind_allr   r=   Ú
startswithÚBASE_URLÚget_textÚreÚsubÚsearchÚgroupÚappend)ÚhtmlÚitemsÚsoupr%   r,   Útd_linkÚtd_dater7   r8   r;   Ú	date_spanrC   Ú
date_matchs                r   Ú
parse_listrU   -   sÏ  € à€EÜ˜˜}Ó-€Dà�I‰I�g hˆIÓ/€EÙØ—	‘	˜' i�	Ó0ˆÙÜÐ0´s·z±zÕBØˆà�n‰n˜TÓ"ó JˆØ—'‘'˜$Ñ&U�'ÓVˆØ—'‘'˜$Ñ&U�'ÓVˆÙ™gØà�L‰L˜ÓˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ�?‰?˜3ÔÜ˜d‘?‰DØ�_‰_˜VÔ$Øä˜c‘> DÑ(ˆDð —‘�w“Ò? 1§:¡:°D :Ó#9Ò?¸R×FÑFÓHˆÜ—‘�v˜s EÓ*ˆÜ—‘�z 2 uÓ-×3Ñ3Ó5ˆÙÙð —L‘L Ó(ˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀG×DTÑDTÐ[_ÐDTÓD`ˆÜ—Y‘YÐ5°xÓ@ˆ
Ù*4�:×#Ñ# AÔ&¸"ˆà�‰˜T¨E¸xÑHÖIð?JðB €Lr   c                 óh	  ‡"— t        | d«      }d}|j                  dd¬«      }|r%|j                  d«      }|r|j                  d¬«      }|sR|j                  d	«      D ]>  }d
|j                  d¬«      v sŒ|j	                  d«      }|sŒ,|j                  d¬«      } n |s%|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«      }|j                  dd¬«      }|s|j                  dd¬«      }|s|j                  dd¬«      }|s|j                  dd¬«      }|s|j                  d«      }	|	r|	}g }|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'        |«      dk  rt         j"                  j%                  ‰"«      }t        ˆ"fd„|D «       «      rŒÞ|j)                  ‰"|d œ«       Œó d}d}|�rs|j                  d!d"g«      D ]  }|j+                  «        Œ t-        «       }|j                  d#«      D ]j  }|j                  d$«      }d%}|rt/        d&„ |D «       «      }|dk\  }|sŒ2|j                  d¬«      }||v rŒI|j1                  |«       |t3        |«      d'z   z  }Œl t        t3        |«      d«      }|j                  d#«      D ]  }|j+                  «        Œ |j                  d(«      }|rAg }|D ](  }|j                  d¬«      } | sŒ|j)                  | «       Œ* d'j5                  |«      }n|j                  d'd¬)«      }t        j                  d*d'|«      }|r|d+|z   z  }t'        |j                  «       «      d,k  r"d-|› d.|› d/�}|D ]  }!|d0|!d   › d1|!d2   › d3�z  }Œ ||||fS )4u/   è§£æž�è¯¦æƒ…é¡µï¼ˆå�Œzgwn.gov.cnä¸»ç«™ç»“æž„ï¼‰r$   r>   ÚdivÚbt_qur'   ÚbTr<   Úthu   æ ‡é¢˜r-   Úh1Ú	ucaptitler;   uU   [-_|]\s*(?:å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·|æ”¿åŠ¡å…¬å¼€ä¸“åŒºV2|æ”¿åºœä¿¡æ�¯å…¬å¼€).*$ÚPUBLISHTIMErA   rB   Únrzwzcon j-fontContentÚwzconÚwenzhangr*   ÚUCAPCONTENTr7   r8   c              3   ó\   •K  — | ]#  }‰j                  «       j                  |«      –— Œ% y ­w)N)ÚlowerÚendswith)Ú.0Úextr8   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>�   s(   øè ø€ ò \¨cˆt�z‰z‹|×$Ñ$ S×)ñ \ùs   ƒ),)	z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.pptz.pptxr:   é   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )re   r7   r8   s     €r   rg   zparse_detail.<locals>.<genexpr>¥   s   øè ø€ Ò=¨A�q˜‘x 4Õ'Ñ=ùs   ƒ)r   r;   ÚscriptÚstyler%   r,   Fc              3   óT   K  — | ]   }t        |j                  d dg«      «      –— Œ" y­w)r-   rZ   N)ÚlenrE   )re   Úrows     r   rg   zparse_detail.<locals>.<genexpr>´   s"   è ø€ ÒOÀ3œs 3§<¡<°°t°Ó#=×>ÑOùs   ‚&(z

Úp)Ú	separatorr=   z\n{4,}u   

[è¡¨æ ¼]

é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [z](r   ú))r   rD   rH   rE   Úfind_next_siblingrI   rJ   r=   rK   rL   r   ÚanyrF   r   ÚcompatÚurljoinÚosÚpathÚbasenamern   rM   Ú	decomposeÚsetÚmaxÚaddr0   Újoin)#rN   r   rP   r;   rX   Úb_tagrZ   r-   r[   ÚucapÚ	title_tagÚtrC   ÚptrT   Úcontent_divÚattachmentsÚa_tagÚ	att_titleÚcontentÚtables_htmlÚtagÚ
seen_textsr%   ÚrowsÚhas_dataÚmax_colsÚtxtÚcontent_div_cleanÚ
paragraphsÚ
para_textsrp   Úp_textÚattr8   s#                                     @r   Úparse_detailr–   \   sµ  ø€ ä˜˜}Ó-€Dð €EØ�I‰I�e GˆIÓ,€EÙØ—
‘
˜3“ˆÙØ—N‘N¨�NÓ.ˆEáØ—-‘- Ó%ò 	ˆBØ˜2Ÿ;™;¨T˜;Ó2Ò2Ø×)Ñ)¨$Ó/�ÚØŸK™K¨d˜KÓ3�EÙð	ñ Ø�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEáØ�y‰y˜Ó%ˆÙØ—M‘M¨�MÓ-ˆEáØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘ÐoÐqsÐuvÓwˆAØ—G‘G“IˆEð €HØ	�‰�=Ó	!€BÙ	Ü—Y‘YÐ5°r·{±{³}ÓEˆ
ÙØ!×'Ñ'¨Ó*ˆHð —)‘)˜E¨$�)Ó/€KÙØ—i‘i Ð.C�iÓDˆÙØ—i‘i ¨g�iÓ6ˆÙØ—i‘i ¨*�iÓ5ˆáØ�y‰y˜Ó'ˆÙØˆKð €Kà—‘˜sÓ#ò FˆØ�y‰y˜ Ó$×*Ñ*Ó,ˆÜó \ØZô\õ \à—?‘? 6Ô*Ü—‘×.Ñ.¨s°DÓ9�ØŸ™¨T˜Ó2ÒL´b·g±g×6FÑ6FÀtÓ6LˆIä�9‹~ Ò!ÜŸG™G×,Ñ,¨TÓ2�	ÜÓ=°Ô=Õ=Ø×"Ñ"¨4¸)Ñ#DÕEðFð €GØ€KÚØ×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ô “Uˆ
Ø ×)Ñ)¨'Ó2ò 	/ˆEØ—>‘> $Ó'ˆDàˆHÙÜÑOÈ$ÔOÓO�Ø# q™=�ÙØØ—.‘. 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[]é
   rB   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_dater†   Ú	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                 ó(  — 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                  «        t        d|› d|› �«       y c c}
w )Nr   zlist_1.shtmlÚlist_rB   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;   rC   z/SELECT page_url FROM gov_raw WHERE page_url = ?z
  [FETCH] é2   z...z#  [ERROR] detail page unreachable: z +u   é™„ä»¶r>   z    o saved [z    x empty title, skippedz
[DONE] Total: z articles, Errors: )r   r|   ÚrangerG   Ú	LIST_PATHr   r"   rU   r~   rn   r
   Úfetchoner–   r¥   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚ	seen_urlsÚpageÚlist_urlrN   rO   ÚitÚunique_itemsÚitemr   r;   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titler‰   rC   r†   Ú	att_countÚatt_strs                           r   Úcrawlr¿   â   ss  € Ü‹9€DØ€EØ€FÜ“€Iä�iÓ ó 95ˆØ�1Š9Ü¤)Ñ+¨nÑ<‰Hä¤)Ñ+°°d¸1±f°X¸VÐ.DÑDˆ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Ùà ò 	5ˆ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�Ü˜ h Z¨r°,¸sÀÐ2CÐ1DÀCÈÀyÐQÕRäÐ2Õ4ò=	5ð795ðv 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@ùòW Js   Â*HÂ7HÚ__main__u-   ä¸‡å¹´åŽ¿å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·çˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)ÚactionrÄ   rB   éÿÿÿÿz[AutoPg] max_pages=)r¯   r°   )é   )r¦   F)'Ú__doc__r   r   rI   r   rx   rš   r   Úbs4r   rG   r«   r	   r­   r   r   r"   rU   r–   r¥   r¿   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ_SYS2rn   ÚargvÚisdigitÚ_MAX_PGr   r0   ÚpopÚ
parse_argsÚargsr¯   r°   rj   r   r   ú<module>rØ      sC  ðñó Û Û 	Û 
Û 	Û Ý Ý à#€Ø#€	Ø
€Ø"€	ð DØpØ0ñ€òó

ò-ò^z1òxóBAðH ˆzÒÛØ$ˆX×$Ñ$Ð1`Ôa€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   