Ë
    V_Šjå  ã                   óˆ   — d Z ddlZddlmZ ddlZddlZddlZdZdZdZ	dZ
dd	d
œZdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u{   
çˆ¬è™«: æ¹›æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - çŽ¯ä¿�å®¡æ‰¹å…¬ç¤º
http://www.zetdz.gov.cn/qfj/hbj/hpgs/
CMS: æ¹›æ±Ÿå¼€å�‘åŒºé—¨æˆ·
é    N)ÚBeautifulSoupz/root/search.dbzhttp://www.zetdz.gov.cnz%http://www.zetdz.gov.cn/qfj/hbj/hpgs/u   æ¹›æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒºzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zzh-CN,zh;q=0.9)z
User-AgentzAccept-Languagec                 óz  — g }t        d| dz   «      D �]â  }|dk(  rt        }ndj                  |«      }	 t        j                  |dt
        ¬«      }d|_        |j                  dk7  r8t        dj                  ||j                  «      t        j                  ¬«        |S t        |j                  d	«      }|j                  d
«      }|s-t        dj                  |«      t        j                  ¬«        |S d}|D ]¾  }|j                  d«      }	|	sŒ|	j	                  d«      sŒ)|	d   }
|	j                  d«      }|r|j                  d¬«      n|	j                  d¬«      }|j                  d«      }|r|j                  d¬«      nd}|
j!                  d«      s	t"        |
z   }
|j%                  |
||f«       |dz  }ŒÀ t        dj                  ||«      t        j                  ¬«       t'        |«      dk  r |S �Œå |S # t(        $ r7}t        dj                  ||«      t        j                  ¬«       Y d}~ |S d}~ww xY w)z$Get all article URLs from list pagesé   z2http://www.zetdz.gov.cn/qfj/hbj/hpgs/index_{}.htmlé   ©ÚtimeoutÚheadersúutf-8éÈ   z  Page {}: HTTP {}©Úfileúhtml.parserzul.listTit liz  Page {}: no itemsr   ÚaÚhrefÚbT©ÚstripÚspanÚ Úhttpz  Page {}: {} itemsé   z  Page {} error: {}N)ÚrangeÚLIST_URLÚformatÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚprintÚsysÚstderrr   ÚtextÚselectÚfindÚget_textÚ
startswithÚBASE_URLÚappendÚlenÚ	Exception)Ú	max_pagesÚurl_dataÚpageÚurlÚrÚsoupÚitemsÚcountÚlir   r   r   Útitler   Úpub_dateÚes                   ú /root/gov_crawler/crawl_zetdz.pyÚget_list_urlsr9      s  € à€HÜ�a˜ Q™Ó'ó (ˆØ�1Š9Ü‰CàF×MÑMÈdÓSˆCð"	Ü—‘˜S¨"´gÔ>ˆAØ ˆAŒJØ�}‰} Ò#ÜÐ*×1Ñ1°$¸¿¹ÓFÌSÏZÉZÕXØð> €Oô; ! §¡¨Ó7ˆDØ—K‘K Ó0ˆEÙÜÐ+×2Ñ2°4Ó8¼s¿z¹zÕJØð2 €Oð/ ˆEØò �Ø—G‘G˜C“L�Ú˜Ÿ™˜v�Ø˜V™9�DØŸ™˜s›�AÙ67˜AŸJ™J¨T˜JÔ2¸Q¿Z¹ZÈd¸ZÓ=S�EØŸ7™7 6›?�DÙ<@˜tŸ}™}°4˜}Ô8Àb�HàŸ?™?¨6Ô2Ü'¨$™˜à—O‘O T¨5°(Ð$;Ô<Ø˜Q‘J‘Eðô Ð'×.Ñ.¨t°UÓ;Ä#Ç*Á*ÕMÜ�5‹z˜AŠ~Øð
 €Oñ ðI(ðT €Oøô	 ò 	ÜÐ'×.Ñ.¨t°QÓ7¼c¿j¹jÕIÜà€Oûð		ús2   ´A'G:ÂAG:Ã4G:ÄG:Ä!CG:Ç:	H:È+H5È5H:c           
      óÊ  ‡— 	 t        j                  | dt        ¬«      }d|_        |j                  dk7  ryt        |j                  d«      }d}|j                  rO|j                  j                  j                  «       }dD ]$  }|j                  |«      sŒ|dt        |«        } n |}d}|j                  «       }t        j                  d	|«      }|r|j                  d
«      }d}	|j!                  d«      }
|
rŠg }|
j"                  D ]h  }|j$                  dk(  r(|j                  dd¬«      }|sŒ(|j'                  |«       Œ:|j$                  dk(  sŒJt)        |«      }|sŒX|j'                  |«       Œj dj+                  |«      }	g }|j-                  dd¬«      D ]„  }|d   Š|j                  d¬«      }t/        ˆfd„dD «       «      sŒ/‰j1                  d«      st2        dz   ‰j5                  d«      z   Š|j'                  |xs ‰j7                  d«      d   ‰dœ«       Œ† t        |	j                  «       «      dk  rVdj9                  | |«      }	|r=dj+                  |D �cg c]  }dj9                  |d    |d!   «      ‘Œ c}«      }|	d"|z   z  }	|	d#z  }	|| ||	t:        d|d$œS c c}w # t<        $ r5}t?        d%j9                  | |«      t@        jB                  ¬&«       Y d}~yd}~ww xY w)'zParse a detail pager   r   r
   r   Nr   r   )u*    - æ¹›æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒºé—¨æˆ·ç½‘ç«™u    - æ¹›æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒºu(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r   z	.showConsÚpú T)Ú	separatorr   Útablez

r   )r   r   r   c              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­w)N)Úlower)Ú.0Úxr   s     €r8   ú	<genexpr>zparse_detail.<locals>.<genexpr>z   s   øè ø€ Òa¨�1˜Ÿ
™
›Ô$Ñaùs   ƒ)z.pdfz.docz.xlsz.zipz.docxz.xlsxr   ú/éÿÿÿÿ)Únamer/   é   z<p><a href="{}">{}</a></p>ú
z - [{}]({})rF   r/   u   

é™„ä»¶ï¼š
u   

ï¼ˆåŽŸæ–‡é“¾æŽ¥æŸ¥çœ‹ï¼‰)r5   r/   ÚdateÚcontentÚ	site_nameÚsourceÚattachmentsz  Error parsing {}: {}r   )"r   r   r   r   r   r   r#   r5   Ústringr   Úendswithr*   r&   ÚreÚsearchÚgroupÚ
select_oneÚchildrenrF   r)   Útable_to_markdownÚjoinÚfind_allÚanyr'   r(   ÚlstripÚsplitr   Ú	SITE_NAMEr+   r    r!   r"   )r/   r0   r1   r5   ÚrawÚsuffixrI   Ú	full_textÚmrJ   ÚscÚpartsÚchildÚtxtÚmd_tablerM   r   Úalr7   r   s                      @r8   Úparse_detailrf   J   sÈ  ø€ ðIÜ�L‰L˜ b´'Ô:ˆØˆŒ
Ø�=‰=˜CÒØÜ˜QŸV™V ]Ó3ˆð ˆØ�:Š:Ø—*‘*×#Ñ#×)Ñ)Ó+ˆCàjò �Ø—<‘< Õ'Ø˜m¤ F£˜|Ð,�CÙðð ˆEð ˆØ—M‘M“Oˆ	Ü�I‰IÐAÀ9ÓMˆÙØ—7‘7˜1“:ˆDð ˆØ�_‰_˜[Ó)ˆÙØˆEØŸ™ò /�Ø—:‘: Ò$ØŸ.™.°3¸d˜.ÓC�CÚØŸ™ SÕ)Ø—Z‘Z 7Ó*Ü0°Ó7�HÚØŸ™ XÕ.ð/ð —k‘k %Ó(ˆGð ˆØ—‘˜s¨�Ó.ò 		ˆAØ�V‘9ˆDØ—*‘* 4�*Ó(ˆCÜÓaÐ.`ÔaÕaØ—‘ vÔ.Ü# c™>¨D¯K©K¸Ó,<Ñ<�DØ×"Ñ"ØÒ6 4§:¡:¨c£?°2Ñ#6Øñ$õ ð		ô ˆw�}‰}‹Ó "Ò$Ø2×9Ñ9¸#¸uÓEˆGÙØ—Y‘YÐS^Ö_Èa × 4Ñ 4°Q°v±YÀÀ%ÁÕ IÒ_Ó`�ØÐ,¨rÑ1Ñ1�ØÐ5Ñ5ˆGð ØØØÜ"ØØ&ñ
ð 	
ùò	  `øô ò ÜÐ&×-Ñ-¨c°1Ó5¼C¿J¹JÕGÜûðúsP   ƒ2J$ ¶AJ$ ÂBJ$ Ä/!J$ ÅJ$ ÅA'J$ ÇBJ$ ÉJÉ=!J$ ÊJ$ Ê$	K"Ê-+KËK"c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)r>   ÚargsÚkwargss      r8   rU   rU   ˜   s   € äˆu‹:Ðó    c                 óÒ  — t        j                  t        «      }|j                  «       }d}| D ]–  }|r|d   sŒ|j	                  d|d   t
        f«       |j                  «       rŒ7|d   rt        |d   «      nd}|j	                  d|d   |d   |d   |d   r|d   d	d
 nd|d   |d   |j                  dd«      |f«       |dz  }Œ˜ |j                  «        |j                  «        |S )zSave articles to search.dbr   r5   z6SELECT 1 FROM gov_raw WHERE page_url=? AND site_name=?r/   rM   r   z²INSERT OR REPLACE INTO gov_raw
               (page_url, title, content, summary, site_name, publish_date, source_url, attachments)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?)rJ   Nr   rK   rI   rL   r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter[   Úfetchonerh   r   ÚcommitÚclose)ÚarticlesÚconnÚcÚinsertedÚartÚattachments_jsons         r8   Ú
save_to_dbr{   œ   s  € ä�?‰?œ7Ó#€DØ�‰‹€AØ€HØò ˆÙ˜#˜gš,ØØ	�	‰	ØDØ�‰ZœÐ#ô	
ð �:‰:Œ<ØØ69¸-Ò6Hœ3˜s =Ñ1Ô2ÈbÐØ	�	‰	ð2ð �E‘
Ø�G‘Ø�I‘Ø(+¨Iª��I‘˜t Ñ$¸BØ�KÑ Ø�F‘Ø—‘˜ "Ó%Ø ð	ô		
ð 	�A‰‰ð3ð4 	‡K�K„MØ‡J�J„LØ€Ork   c            	      óZ  — d} t        t        j                  «      dkD  r	 t        t        j                  d   «      } t        dj                  t        t        | «      t        j                  ¬«       t        dt        j                  ¬«       t        | «      }t        dj                  t        |«      «      t        j                  ¬«       t        dt        j                  ¬«       g }t        |«      D ]x  \  }\  }}}t        dj                  |dz   t        |«      |«      t        j                  ¬«       t        |«      }|sŒP|d	   s|r||d	<   |d
   s|r||d
<   |j                  |«       Œz t        dj                  t        |«      t        |«      «      t        j                  ¬«       t        |«      }t        dj                  |«      t        j                  ¬«       t        dt        j                  ¬«       t        dj                  t        |«      «      «       y # t        $ r Y �Œíw xY w)Nr   r   z"Starting crawl: {} - {} ({} pages)r   zFetching list pages...zTotal URLs: {}zFetching detail pages...z  [{}/{}] {}r5   rI   zParsed: {}/{} articleszInserted: {} new articleszDone.z
Article count for config: {})r*   r!   ÚargvÚintÚ
ValueErrorr    r   r[   r   r"   r9   Ú	enumeraterf   r)   r{   )	r,   r-   ru   Úir/   r5   rI   ry   rx   s	            r8   Úmainr‚   À   s¨  € Ø€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
Ð
.×
5Ñ
5´iÄÈ9Ó
UÔ\_×\fÑ\fÕgô 
Ð
"¬¯©Õ4Ü˜YÓ'€HÜ	Ð
×
!Ñ
!¤# h£-Ó
0´s·z±zÕBô 
Ð
$¬3¯:©:Õ6Ø€HÜ!*¨8Ó!4ò !ÑˆÑˆC�˜Üˆn×#Ñ# A¨¡E¬3¨x«=¸#Ó>ÄSÇZÁZÕPÜ˜3ÓˆÚØ�w’<¡EØ$��G‘Ø�v’;¡4Ø"��F‘Ø�O‰O˜CÕ ð!ô 
Ð
"×
)Ñ
)¬#¨h«-¼¸X»Ó
GÌcÏjÉjÕYô ˜(Ó#€HÜ	Ð
%×
,Ñ
,¨XÓ
6¼S¿Z¹ZÕHÜ	ˆ'œŸ
™
Õ#ä	Ð
*×
1Ñ
1´#°h³-Ó
@ÕAøô= ò 	Úð	ús    H È	H*È)H*Ú__main__)r   )Ú__doc__r   Úbs4r   rm   rP   r!   ro   r(   r   r[   r   r9   rf   rU   r{   r‚   Ú__name__© rk   r8   ú<module>rˆ      sr   ðñó Ý Û Û 	Û 
à
€Ø$€Ø2€Ø)€	ð DØ'ñ€ó-ò`Kò\ò!òH#BðL ˆzÒÙ…Fð rk   