Ë
    H«£j&  ã                   ój  — 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Zddlm	Z	m
Z
 ddlmZ ej                  j                  dd«       ddlmZ ddlZddlZdZd„ Zd	Zd
dddœZdZdZ ej2                  «       Zej6                  j9                  e«       d„ Zd„ Zdd„Zd„ Z d„ Z!d„ Z"e#dk(  r e"«        yy)uÉ  è–›åŸŽåŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šçˆ¬è™«

TRS UEditor CMS (å±±ä¸œTRSå�˜ä½“)
åˆ—è¡¨: /zwgk/tzgg/ (ç¬¬1é¡µ, 8æ�¡/é¡µ)
      ç¬¬Né¡µ(>=2): index_{N-1}.html
è¯¦æƒ…: /zwgk/tzgg/YYYYMM/tYYYYMMDD_XXXXX.html
æ ‡é¢˜: <h2> æˆ– meta ArticleTitle
æ—¥æœŸ: <span>æ—¶é—´ï¼šYYYY-MM-DD</span> æˆ– meta PubDate
æ­£æ–‡: div.zwnr > div.TRS_UEDITOR > p

Usage:
  python3 crawl_xuecheng_tzgg.py --pages 5    # å‰�5é¡µ
  python3 crawl_xuecheng_tzgg.py --pages 1    # æ—¥è·‘å¢žé‡�
é    N)ÚBeautifulSoupÚNavigableString)Úurljoinz/root/gov_crawler)Úpush_to_searchdbz/root/search.dbc                  óÊ   — 	 t        j                  t        d¬«      } | j                  d«       | j                  d«       | S # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Né   ©ÚtimeoutzPRAGMA busy_timeout=30000zPRAGMA journal_mode=WALz  WARN DB connect: )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚ	ExceptionÚprint)ÚconnÚes     úcrawl_xuecheng_tzgg.pyÚget_db_connectionr   #   sY   € ðÜ�‰œw°Ô3ˆØ�‰Ð0Ô1Ø�‰Ð.Ô/ØˆøÜò ÜÐ# A 3Ð'Ô(Üûðús   ‚>A Á	A"Á
AÁA"zhttp://www.xuecheng.gov.cnzoMozilla/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,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageõ   è–›åŸŽåŒº-é€šçŸ¥å…¬å‘Šz	zwgk/tzggc                 óV   — t         j                  | d¬«      }d|_        |j                  S )Né   r	   zutf-8)ÚsessÚgetÚencodingÚtext)ÚurlÚresps     r   Ú
fetch_pager   =   s%   € Ü�8‰8�C ˆ8Ó$€DØ€D„MØ�9‰9Ðó    c                 óÐ  — g }t        j                  dt         j                  «      }|j                  | «      D ]«  }|j	                  d«      j                  «       }|j	                  d«      j                  «       }t        j                  dd|«      }|j	                  d«      j                  «       }|r|sŒ|t        dz   |j                  d«      z   }|j                  |||d	œ«       Œ­ |S )
u   è§£æž�åˆ—è¡¨é¡µzw<span class="newstxt"><a href="([^"]+)"[^>]*>&middot;\s*([^<]+)</a></span><span class="date">(\d{4}-\d{2}-\d{2})</span>é   é   z^&nbsp;?\s*Ú é   z/zwgk/tzgg/z./)Útitler   Úpub_date)
ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚsubÚBASE_URLÚlstripÚappend)ÚhtmlÚitemsÚpatternÚmÚhrefr&   r'   r   s           r   Ú
parse_listr7   C   sÎ   € à€Eä�j‰jð 	CÜ
�	‰	ó€Gð ×Ñ˜dÓ#ò 
IˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆä—‘�~ r¨5Ó1ˆØ—7‘7˜1“:×#Ñ#Ó%ˆÙ™DØä˜Ñ&¨¯©°TÓ):Ñ:ˆØ�‰˜u¨S¸hÑGÕHð
Ið €Lr    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   )r   úhtml.parserÚar6   r$   )ÚhttpÚ
javascriptú#ÚimgÚsrc)r;   z//zdata:)	Úbs4r   ÚstrÚfind_allr   Ú
startswithÚurllibÚparser   )ÚtableÚbase_urlr   Útblr:   r6   r>   r?   s           r   Úhtml_table_to_htmlrI   Y   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or    c                 ó^  — | d   }	 t        |«      }t	        |d«      }d}|j                  d	«      }|r|j                  d
¬«      }|s;|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|s| d   }| j                  dd«      }|j                  «       }	t        j                  d|	«      }
|
r|
j                  d«      }nb|j                  dddi¬«      }|rK|j                  d«      r:t        j                  d|d   j                  «       «      }
|
r|
j                  d«      }|j                  dd¬«      }d}g }|�rg }t        «       }|j                  g d¢d
¬«      D �]=  }|j                  dd«      }d|j                  dd«      v rŒ+|j                  dk(  r|j!                  d«      rŒL|j                  dk(  rDt#        |«      dd }||v rŒn|j%                  |«       t'        |«      }|sŒ�|j)                  |«       ŒŸ|j                  dk(  r!t+        ||«      }	|	sŒ½|j)                  |	«       ŒÏ|j                  d k(  sŒß|j                  d!d«      }|j                  d"d«      }|s�Œ|j-                  d#«      r|nt/        ||«      }|j)                  d$|› d%|› d&�«       �Œ@ d'j1                  |«      }|j                  d(d
¬)«      D ]�  }|j                  d*d«      }|j                  d
¬«      }|sŒ*|sŒ-t        j                  d+|t        j2                  «      sŒS|j-                  d#«      st/        ||«      }|j)                  ||d,œ«       |d-|› d.|› d/�z  }Œ‘ ||||fS # t        $ r4}t        d|› d|› �«       | d   | j                  dd«      dg fcY d}~S d}~ww xY w)0u   æŠ“å�–è¯¦æƒ…é¡µr   z  WARN skip: z - r&   r'   r$   Nr9   Úh2T©r-   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentu"   æ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r"   ÚPubDatez(\d{4}-\d{2}-\d{2})ÚdivÚzwnr)Úclass_)ÚprF   r>   )Ú	recursiveÚstylezdisplay:noneú rV   rF   éd   r>   r?   Úaltr;   ú![ú](ú)z

r:   )r6   r6   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$)rN   r   u   

é™„ä»¶ï¼š<p><a href="z">z</a></p>)r   r   r   r   r   ÚfindÚget_textr-   r(   Úsearchr,   ÚmatchÚsetrB   ÚreplacerN   Úfind_parentrA   ÚaddrI   r1   Ú_extract_p_textrC   r   ÚjoinÚI)Úitemr   r2   r   Úsoupr&   rK   Úmtr'   Útxtr5   ÚmdÚcontent_viewrQ   ÚattachmentsÚpartsÚseen_tablesÚelemrX   Ú	table_strÚmd_tabler?   r[   Úfull_srcr:   r6   r   s                              r   Úfetch_detailrw   h   s•  € à
ˆu‰+€Cð?Ü˜#‹ˆô
 ˜˜}Ó-€Dð €EØ	�‰�4‹€BÙ	Ø—‘ $�Ó'ˆÙØ�Y‰Y�v f¨nÐ%=ˆYÓ>ˆÙ�"—&‘&˜Ô#Ø�y‘M×'Ñ'Ó)ˆEÙØ�W‘ˆð �x‰x˜
 BÓ'€Hà
�-‰-‹/€CÜ
�	‰	Ð7¸Ó=€AÙØ—7‘7˜1“:‰à�Y‰Y�v f¨iÐ%8ˆYÓ9ˆÙ�"—&‘&˜Ô#Ü—‘Ð/°°I±×1DÑ1DÓ1FÓGˆAÙØŸ7™7 1›:�ð —9‘9˜U¨6�9Ó2€LØ€GØ€KâØˆÜ“eˆà ×)Ñ)Ò*?È4Ð)ÓPó 	:ˆDØ—H‘H˜W bÓ)ˆEØ §¡¨s°BÓ!7Ñ7ØØ�y‰y˜CÒ D×$4Ñ$4°WÔ$=ØØ�y‰y˜GÒ#Ü ›I d s˜O�	Ø Ñ+ØØ—‘ 	Ô*Ü-¨dÓ3�ÚØ—L‘L Õ*Ø—‘˜cÒ!Ü% d¨CÓ0�ÚØ—L‘L Õ%Ø—‘˜eÓ#Ø—h‘h˜u bÓ)�Ø—h‘h˜u bÓ)�ÛØ&)§n¡n°VÔ&<™sÄ'È#ÈsÓBS�HØ—L‘L 2 c U¨"¨X¨J°aÐ!8Ö9ð/	:ð2 —+‘+˜eÓ$ˆð ×&Ñ& s°Ð&Ó6ò 	NˆAØ—5‘5˜ Ó$ˆDØ—:‘: D�:Ó)ˆDÚš¤§¡Ð+PÐRVÔXZ×X\ÑX\Õ!]Ø—‘ vÔ.Ü" 3¨Ó-�DØ×"Ñ"¨D¸Ñ#>Ô?ØÐ6°t°f¸B¸t¸fÀHÐMÑM‘ð	Nð �(˜G [Ð0Ð0øô] ò ?Ü�˜c˜U # a SÐ)Ô*Ø�G‰}˜dŸh™h z°2Ó6¸¸BÐ>Õ>ûð?ús   ‡M/ Í/	N,Í8)N'Î!N,Î'N,c                 ó„  — | j                  dg«      ryd}| j                  D �]>  }t        |t        «      r%t	        |«      j                  «       }|sŒ0||dz   z  }Œ9|j                  dk(  r|dz  }ŒN|j                  dk(  rS|j                  dd«      }|j                  dd«      }|sŒ„|j                  d	«      r|nt        ||«      }|d
|› d|› d�z  }Œ°|j                  dk(  rW|j                  dd«      }|j                  d¬«      }	|sŒæ|	sŒé|j                  d	«      r|nt        ||«      }
|d|	› d|
› d�z  }�Œ|j                  dv s�Œ&||j                  dd¬«      dz   z  }�ŒA t        j                  dd|«      j                  «       }|j                  dd«      }t        j                  dd|«      j                  «       }|S )u    ä»Ž <p> æ ‡ç­¾ä¸­æ��å�–çº¯æ–‡æœ¬rF   r$   rY   Úbrú
r>   r?   r[   r;   r\   r]   z) r:   r6   TrL   ú[)ÚspanÚstrongÚbÚemÚuÚfontz[ \t]+õ   Â )r_   ÚchildrenÚ
isinstancer   rA   r-   rN   r   rC   r   r`   r(   r.   rd   )Úp_tagrG   rm   ÚchildÚtr?   r[   rv   Úa_hrefÚa_textÚ	full_hrefs              r   rg   rg   ¾   sª  € à‡z�z�7�)ÔØØ
€CØ—‘ó 9ˆÜ�eœ_Ô-Ü�E“
× Ñ Ó"ˆAÚØ�q˜3‘w‘‘Ø�Z‰Z˜4ÒØ�4‰K‰CØ�Z‰Z˜5Ò Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÚØ"%§.¡.°Ô"8™3¼gÀhÐPSÓ>T�Ø˜˜C˜5  8 *¨BÐ/Ñ/‘Ø�Z‰Z˜3ÒØ—Y‘Y˜v rÓ*ˆFØ—^‘^¨$�^Ó/ˆFÚš&Ø&,×&7Ñ&7¸Ô&?™FÄWÈXÐW]ÓE^�	Ø˜˜6˜( " Y K¨rÐ2Ñ2’Ø�Z‰ZÐEÓEØ�5—>‘> #¨T�>Ó2°SÑ8Ñ8ŠCð)9ô* �&‰&�˜C Ó
%×
+Ñ
+Ó
-€CØ
�+‰+�f˜cÓ
"€CÜ
�&‰&�˜C Ó
%×
+Ñ
+Ó
-€CØ€Jr    c                  óP  — t        j                  d¬«      } | j                  dt        dd¬«       | j	                  «       }|j
                  dkD  r|j
                  nd}g }t        d|dz   «      D ]¤  }|dk(  rt        › d	t        › d	�}nt        › d	t        › d
|dz
  › d�}t        d|› d	|› d�«       	 t        |«      }t        |«      }|st        d«        n@t        dt        |«      › d�«       |j                  |«       t        j                   d«       Œ¦ t        dt        |«      › d�«       |st        d«       y g }	t#        |«      D ]Å  \  }
}t        d|
dz   › d	t        |«      › d|d   d d › d�«       t%        |«      \  }}}}|s|d   }t'        j(                  dd|«      j+                  «       }|r|d d nd}|d   |d   ||||t,        |rt/        j0                  |d¬«      ndd œ}|	j3                  |«       t        j                   d!«       ŒÇ t        d"t        |	«      › d#�«       |	rt5        |	t,        «       t7        «       }|rw	 |j9                  d$t,        f«      }|j;                  «       d   }|j9                  d%t,        f«      }|j;                  «       d   }t        d&|› d'|› d(�«       |j=                  «        t        d*«       y # t        $ r}t        d|› �«       Y d }~ �ŒÒd }~ww xY w# t        $ r}t        d)|› �«       Y d }~Œ^d }~ww xY w# |j=                  «        w xY w)+Nr   )Údescriptionz--pagesr   u   é¡µæ•°ï¼Œ0=å…¨é‡�)ÚtypeÚdefaultÚhelpé   r"   ú/z/index_z.htmlzPage z...z  empty, stopz  found z itemsz  WARN: g333333Ó?z
Total list: zNo items found, abortz  [z] r&   é(   z\s+rY   iô  r$   r   F)Úensure_ascii)r   Ú
source_urlr&   rQ   Úsummaryr'   Ú	site_namerp   gš™™™™™É?z
Inserting z records...z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z1SELECT COUNT(*) FROM gov_search WHERE site_name=?zDB: z rows (FTS: z rows)z  WARN DB query: ÚDONE)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚpagesÚranger/   Ú	LIST_PATHr   r   r7   ÚlenÚextendr   ÚtimeÚsleepÚ	enumeraterw   r(   r.   r-   Ú	SITE_NAMEÚjsonÚdumpsr1   r   r   r   ÚfetchoneÚclose)ÚparserÚargsÚ	max_pagesÚ	all_itemsÚpager   r2   r3   r   ÚrecordsÚirj   r&   r'   rQ   rp   r•   Úrecordr   ÚcursorÚ	raw_countÚ	fts_counts                         r   Úmainrµ   Þ   s  € Ü×$Ñ$Ð1IÔJ€FØ
×Ñ˜	¬°QÐ=PÐÔQØ×ÑÓ€Dà"Ÿj™j¨1šn�—
’
°!€IØ€Iä�a˜ Q™Ó'ò ˆØ�1Š9Ü�J˜a¤	˜{¨!Ð,‰Cä�J˜a¤	˜{¨'°$°q±&°¸Ð?ˆCä��d�V˜1˜Y˜K sÐ+Ô,ð
	Ü˜c“?ˆDÜ˜tÓ$ˆEÙÜ˜Ô'ÙÜ�HœS ›Z˜L¨Ð/Ô0Ø×Ñ˜UÔ#ô 	�
‰
�3�ð%ô( 
ˆNœ3˜y›>Ð*¨&Ð
1Ô2áÜÐ%Ô&Øà€GÜ˜YÓ'ò ‰ˆˆ4Ü��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÔDÜ0<¸TÓ0BÑ-ˆˆx˜ +ÙØ˜‘MˆEÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙ#*�'˜$˜3‘-°ˆð ˜‘;Ø˜u™+ØØØØ Ü"ÙJUœ4Ÿ:™: kÀÕFÐ[]ñ	
ˆð 	�‰�vÔÜ�
‰
�3�ð'ô* 
ˆLœ˜W›˜ kÐ
2Ô3ÙÜ˜¤)Ô,äÓ€DÙð		Ø—\‘\Ð"RÔU^ÐT`ÓaˆFØŸ™Ó)¨!Ñ,ˆIØ—\‘\Ð"UÔXaÐWcÓdˆFØŸ™Ó)¨!Ñ,ˆIÜ�D˜˜ <°	¨{¸&ÐAÔBð �J‰JŒLä	ˆ&…Møôe ò 	Ü�H˜Q˜C�.Ô!Þûð	ûôZ ò 	+ÜÐ% a SÐ)×*Ñ*ûð	+ûð �J‰J�LúsI   Â0#K	Ã)K	ÉA&K/ Ë		K,ËK'Ë'K,Ë/	LË8LÌL ÌLÌL ÌL%Ú__main__)r$   )$Ú__doc__Úrequestsr(   Úsysr¦   r¢   Úosr˜   r@   r   r   Úurllib.parser   ÚpathÚinsertÚcrawler_libr   r   rD   r   r   r/   ÚHEADERSr¥   rŸ   ÚSessionr   ÚheadersÚupdater   r7   rI   rw   rg   rµ   Ú__name__© r    r   ú<module>rÅ      sÌ   ðñó Û 	Û 
Û Û Û 	Û ß .Ý  à ‡�‡��Ð&Ô 'Ý (Û Û à
€òð (€ð DØOØ0ñ€ð %€	Ø€	à€x×ÑÓ€Ø ‡�× Ñ �GÔ òòó,òS1òlò@IðX ˆzÒÙ…Fð r    