Ë
    V_Šj€   ã                   ót  — 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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(  roddlZ ej,                  d¬«      Zej1                  dedd¬«       ej1                  ddd¬«       ej5                  «       Z eej8                  ej:                  ¬«       yy)!u„   åŒ—äº¬ä¸­çŽ¯é•¿é�’çŽ¯å¢ƒç§‘æŠ€æœ‰é™�å…¬å�¸ - å…¬å‘Šå…¬ç¤ºæ �çˆ¬è™«
ç«™ç‚¹: www.zhcqhj.com
æ �ç›®: /html/news/gsl/ (å…¬å‘Šå…¬ç¤ºæ �)
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zhcqhj.comz/html/news/gsl/z/root/search.dbzwww.zhcqhj.com-gslzoMozilla/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                  ó^   — t        j                  t        d¬«      } | j                  d«       | S )Né<   )ÚtimeoutzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú%/root/gov_crawler/crawl_zhcqhj_gsl.pyÚinit_dbr      s$   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø€Kó    c                 óì   — 	 t        j                  | t        |d¬«      }d|_        |j                  dk(  r|j
                  S y # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)NF)Úheadersr   Úverifyzutf-8éÈ   z  [ERROR] fetch failed: )Úfile)
ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚrespÚes       r   Ú
fetch_pager#      sf   € ðÜ�|‰|˜C¬¸'È%ÔPˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚>A Á	A3ÁA.Á.A3c                 óB  — g }t        | d«      }|j                  dd¬«      D ]ú  }|d   j                  «       }t        j                  d|«      }|sŒ/|j                  d«      xs |j                  d¬«      xs d	j                  «       }|j                  d
«      }|s)|j                  r|j                  j                  d
«      nd}|r|j                  d¬«      nd	}	t        j                  d|	«      }
|
r|
j                  d«      nd	}	|sŒæ|j                  |||	dœ«       Œü |S )u2   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž (url, title, date) åˆ—è¡¨úhtml.parserÚaT)Úhrefr'   z2http://www\.zhcqhj\.com/html/news/gsl/(\d+)\.html$Útitle©ÚstripÚ ÚspanNú(\d{4}-\d{2}-\d{2})é   )r    r(   Úpub_date)r   Úfind_allr*   ÚreÚmatchr   Úget_textÚfind_next_siblingÚparentÚfindÚsearchÚgroupÚappend)ÚhtmlÚpage_numÚitemsÚsoupÚa_tagr'   Úmr(   Ú	date_spanr/   Ú
date_matchs              r   Ú
parse_listrB   *   s  € à€EÜ˜˜}Ó-€Dà—‘˜s¨�Ó.ò NˆØ�V‰}×"Ñ"Ó$ˆä�H‰HÐJÈDÓQˆÙØà—‘˜7Ó#ÒG u§~¡~¸D ~Ó'AÒGÀR×NÑNÓPˆà×+Ñ+¨FÓ3ˆ	ÙØ5:·\²\˜Ÿ™×)Ñ)¨&Ô1ÀtˆIÙ5>�9×%Ñ%¨DÐ%Ô1ÀBˆÜ—Y‘YÐ5°xÓ@ˆ
Ù*4�:×#Ñ# AÔ&¸"ˆÚØ�L‰L °À8ÑLÕMð!Nð" €Lr   c                 óð  ‡— t        | d«      }|j                  d«      }|r|j                  d¬«      nd}|sL|j                  d«      }|r9|j                  d¬«      }t        j                  dd|«      }|j                  «       }d}|j                  dd	¬
«      }|r7t        j                  d|j                  «       «      }	|	r|	j                  d«      }|j                  dd¬«      }
g }d}|
�rI|
j                  d«      D �]  }|j                  dd«      Št        ˆfd„dD «       «      ry‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                   j#                  ‰«      }|j%                  ‰|dœ«       Œ£d‰v sŒ¨|j                  d¬«      xs d}‰j                  d«      s6‰j                  d«      rd‰z   nt        j                  j                  |‰«      Š|j%                  ‰|dœ«       �Œ |
j                  ddg«      D ]  }|j'                  «        Œ d}t)        «       }|
j                  d«      D ]e  }|j                  d«      }|rt        d„ |D «       «      nd}|sŒ-|j                  d¬«      }||v rŒD|j+                  |«       |t-        |«      dz   z  }Œg t        t-        |
«      d«      }|j                  d«      D ]  }|j'                  «        Œ |j                  dd¬ «      }t        j                  d!d|«      }|r|d"|z   z  }t/        |j                  «       «      d#k  r"d$|› d%|› d&�}|D ]  }|d'|d   › d(|d)   › d*�z  }Œ ||||fS )+u   è§£æž�è¯¦æƒ…é¡µr%   Úh1Tr)   r+   r(   u   \s*[-ï¼�â€”]\s*ä¸­çŽ¯é•¿é�’$ÚtdÚ	info_text)Úclass_r-   r.   r   )Úidr&   r'   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)Úendswith)Ú.0Úextr'   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>a   s   øè ø€ Ò}¨#�4—=‘= ×%Ñ}ùs   ƒ)	z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.pptz.pptxÚhttp)r    r(   zpan.baidu.comu   ç™¾åº¦ç½‘ç›˜z//zhttp:ÚscriptÚstyleÚtableÚtrc              3   óV   K  — | ]!  }t        |j                  d «      «      dk\  –— Œ# y­w)rE   é   N)Úlenr0   )rK   Úrows     r   rM   zparse_detail.<locals>.<genexpr>v   s#   è ø€ ÒH¸Cœ3˜sŸ|™|¨DÓ1Ó2°aÕ7ÑHùs   ‚')Fz

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

[è¡¨æ ¼]
é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [z](r    ú))r   r6   r3   r1   Úsubr*   r7   r8   r0   r   ÚanyÚ
startswithr   ÚcompatÚurljoinÚosÚpathÚbasenamer9   Ú	decomposeÚsetÚaddÚstrrU   )r:   r    r=   Útitle_elr(   Ú	title_tagÚtr/   Úinfo_tdrA   Ú
content_tdÚattachmentsÚcontentr>   Ú	att_titleÚtagÚtables_htmlÚ
seen_textsrQ   ÚrowsÚhas_dataÚtxtÚcontent_td_cleanÚattr'   s                           @r   Úparse_detailrv   B   sp  ø€ ä˜˜}Ó-€Dð �y‰y˜‹€HÙ-5ˆH×Ñ DÐÔ)¸2€EÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘Ð6¸¸AÓ>ˆAØ—G‘G“IˆEð €HØ�i‰i˜ [ˆiÓ1€GÙÜ—Y‘YÐ5°w×7GÑ7GÓ7IÓJˆ
ÙØ!×'Ñ'¨Ó*ˆHð —‘˜4 F�Ó+€JØ€KØ€Gâà×(Ñ(¨Ó-ó 	FˆEØ—9‘9˜V RÓ(ˆDÜÓ}Ð1|Ô}Ô}Ø—‘ vÔ.Ü#Ÿ?™?×2Ñ2°3¸Ó=�DØ!ŸN™N°˜NÓ6ÒP¼"¿'¹'×:JÑ:JÈ4Ó:P�	Ø×"Ñ"¨4¸)Ñ#DÕEà  DÒ(Ø!ŸN™N°˜NÓ6ÒH¸.�	Ø—‘ vÔ.Ø-1¯_©_¸TÔ-B˜7 Tš>ÌÏÉ×H_ÑH_Ð`cÐeiÓHj�DØ×"Ñ"¨4¸)Ñ#DÖEð	Fð ×&Ñ&¨°'Ð':Ó;ò 	ˆCØ�M‰M�Oð	ð ˆÜ“Uˆ
Ø×(Ñ(¨Ó1ò 		/ˆEØ—>‘> $Ó'ˆDÙLP”sÑHÀ4ÔHÔHÐV[ˆHÙØØ—.‘. t�.Ó,ˆCØ�jÑ ØØ�N‰N˜3ÔØœ3˜u›:¨Ñ.Ñ.‰Kð		/ô )¬¨Z«¸-ÓHÐØ#×,Ñ,¨WÓ5ò 	ˆCØ�M‰M�Oð	ð #×+Ñ+°fÀDÐ+ÓIˆÜ—&‘&˜ F¨GÓ4ˆÙØÐ'¨+Ñ5Ñ5ˆGô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨jÐ9ˆØò 	CˆCØ˜ S¨¡\ N°"°S¸±Z°LÀÐBÑB‰Gð	Cð �'˜8 [Ð0Ð0r   c                 ó
  — dd l }|r|j                  |d¬«      nd}t        j                  «       j	                  d«      }	t        t        |«      «      dz  dz   }
| j                  d|||||||||
f	«       | j                  «        y )	Nr   F)Úensure_asciiz[]z%Y-%m-%d %H:%M:%Sé
   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Údumpsr   ÚnowÚstrftimeÚabsÚhashr   Úcommit)r   Úpage_urlr(   Úsummary_textÚpublish_daterk   Ú	site_namerz   Úattachments_jsonr|   Úlevels              r   Úsave_articler‡   ‘   sƒ   € ÛÙFQ�t—z‘z +¸E�zÔBÐW[ÐÜ
�,‰,‹.×
!Ñ
!Ð"5Ó
6€CÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   é   c                 óV  — t        «       }d}d}t        | «      D �]k  }|dk(  rt        t        z   }nt        t        z   d|dz   › d�z   }t	        d|dz   › d|› �«       t        |«      }|st	        d|dz   › d�«        �nt        ||«      }t	        d	t        |«      › d
�«       |st	        d«        nØ|D ]Ð  }	|	d   }
|	d   }|	d   }|r6|j                  d|
f«      j                  «       }|rt	        d|d d › d�«       ŒJt	        d|d d › d�«       t        |
«      }|s|dz  }t	        d|
› �«       Œ}t        ||
«      \  }}}}|s|r|}|r0t        ||
||||t        «       |dz  }t	        d|› d|d d › d�«       ŒÆt	        d«       ŒÒ �Œn |j                  «        t	        d|› d|› �«       y )Nr   Úindex_r.   z.htmlz[PAGE z] z  [WARN] Page z unreachable, stoppingz  Found z	 articlesz  No items found, stoppingr    r(   r/   z/SELECT page_url FROM gov_raw WHERE page_url = ?z  [SKIP] already exists: é(   z...z
  [FETCH] é2   z#  [ERROR] detail page unreachable: u       âœ“ saved [u       âœ— empty title, skippedz
[DONE] Total: z articles, Errors: )r   ÚrangeÚBASE_URLÚ	LIST_PATHr   r#   rB   rU   r   Úfetchonerv   r‡   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚpageÚlist_urlr:   r<   Úitemr    r(   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titlerl   r/   rk   s                      r   Úcrawlrž   ž   sû  € Ü‹9€DØ€EØ€Fä�iÓ ó 07ˆØ�1Š9Ü¤)Ñ+‰Hä¤)Ñ+°°t¸A±v°h¸eÐ.DÑDˆHä��t˜A‘v�h˜b  
Ð+Ô,Ü˜(Ó#ˆÙÜ�N 4¨¡6 (Ð*@ÐAÔBÚä˜4 Ó&ˆÜ�œ˜U›˜ IÐ.Ô/áÜÐ.Ô0Ùàò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIáØŸ<™<ØEÈÀvóç‘(“*ð ñ ÜÐ5°e¸C¸R°j°\ÀÐEÔFØä�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ÜÐ;¸C¸5ÐAÔBØä;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�áÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÐJÕKäÐ4Õ6ò;	7ð'07ðd 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@r   Ú__main__u*   åŒ—äº¬ä¸­çŽ¯é•¿é�’ - å…¬å‘Šå…¬ç¤ºæ �çˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)Úactionr£   )r“   r”   )é   )rˆ   F)Ú__doc__r   r	   r1   r   r_   r   Úbs4r   rŽ   r�   r   r‘   r   r   r#   rB   rv   r‡   rž   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsr“   r”   © r   r   ú<module>r²      sÞ   ðñó
 Û Û 	Û 
Û 	Ý Ý à"€Ø€	Ø
€Ø €	ð DØpØ0ñ€òó
	òò0L1ò^
ó8Aðv ˆzÒÛØ$ˆX×$Ñ$Ð1]Ô^€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜°À>ÐÔRØ×ÑÓ€DÙ	�D—N‘N°×0@Ñ0@ÖAð r   