Ë
    ¡Š£j+'  ã                   óD  — 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	 ddl
m
Z
 dZdZdZdZd	Zd
Z ej"                  dd«      Zdedz   dœZ ej(                  «       Zej,                  j/                  e«       h d£Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u¹   å»¶é•¿åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š çˆ¬è™«
URL: https://www.yanchangxian.gov.cn/xwzx/gsgg/{page}.html
ç³»ç»Ÿ: å»¶é•¿è‡ªæœ‰CMS (è‡ªå®šä¹‰)
è¯¦æƒ…å®¹å™¨: div.m-txt-article â†’ <p>æ®µè�½
é    N)ÚBeautifulSoup)Údatetimezhttps://www.yanchangxian.gov.cnzwww.yanchangxian.gov.cnu"   å»¶é•¿åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šu   å…¬ç¤ºå…¬å‘Šu   é™•è¥¿é   Ú	SEARCH_DBz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z/xwzx/gsgg/1.html)z
User-AgentÚReferer>)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchr3   ÚoutÚwalks     €€€ú#/root/gov_crawler/crawl_yanchang.pyrA   zbody_text.<locals>.walk5   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*r7   z\n{3,}ú

)ÚreÚbs4r3   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr3   r@   rA   s      @@@rB   Ú	body_textrM   -   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrC   c                 ó<   — t        | t        j                  d¬«       y )NT)ÚfileÚflush)ÚprintÚsysÚstderr)Úmsgs    rB   ÚlogrU   H   s   € Ü	ˆ#”C—J‘J dÖ+rC   c                 ó”  — t         › d| › d�}	 t        j                  |d¬«      }d|_        t	        |j
                  d«      }g }|j                  d«      }|st        d| › �«       |S |j                  d	d
¬«      D ]¢  }|j                  d«      }|j                  d«      }|sŒ(|j                  dd«      }	|j                  d«      xs |j                  d¬«      }
|r|j                  d¬«      nd}|	j                  d«      r	t         |	z   }	|j                  |
|	|f«       Œ¤ |S # t        $ r}t        d| › d|› �«       g cY d}~S d}~ww xY w)z2Fetch list page, return list of (title, url, date)z/xwzx/gsgg/z.htmlé   ©Útimeoutúutf-8úhtml.parserzdiv.m-lst36 ulz%  [WARN] No m-lst36 ul found on page r   F©Ú	recursiveÚaÚspanÚhrefr2   ÚtitleT©rI   ú/z  [ERR] List page z	 failed: N)ÚBASE_URLÚsessionÚgetÚencodingr   ÚtextÚ
select_onerU   Úfind_allÚfindÚget_textÚ
startswithr:   Ú	Exception)ÚpageÚurlÚrÚsoupÚitemsr   r   r^   r_   r`   ra   ÚdateÚes                rB   Ú
fetch_listrv   L   sB  € äˆJ�k $  uÐ
-€CðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆàˆØ�_‰_Ð-Ó.ˆÙÜÐ7¸°vÐ>Ô?ØˆLà—+‘+˜d¨e�+Ó4ò 		2ˆBØ—‘˜“ˆAØ—7‘7˜6“?ˆDÚØ—u‘u˜V RÓ(�ØŸ™˜g›Ò@¨!¯*©*¸4¨*Ó*@�Ù48�t—}‘}¨4�}Ô0¸b�Ø—?‘? 3Ô'Ü# d™?�DØ—‘˜e T¨4Ð0Õ1ð		2ð ˆøÜò ÜÐ    i°¨sÐ3Ô4Ø�	ûðús+   ŽAD! Á':D! Â"A>D! Ä!	EÄ*EÄ<EÅEc                 ól  ‡— 	 t         j                  | d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r|j                  d
¬«      }|s]|j                  ddt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|sC|j                  d«      }|r0|j                  d
¬«      j                  dd«      j                  «       }d}|j                  ddt        j                  dt        j                  «      i¬«      }	|	r'|	j                  d«      r|	d   j                  «       dd }|sGt        j                  d|j                  «       «      }
|
r!|
j                  d«      j                  dd«      }|j!                  d«      }|s|j!                  d«      }g }g }|�rM|j#                  dd¬«      D �]   }|j#                  d«      D ]Ê  }|j                  dd«      }t        j                  d |j%                  «       «      sŒ:|j                  d
¬«      xs t&        j(                  j+                  |«      }|j-                  d!«      r|n!|j-                  d«      r	t.        |z   n| dz   |z   Št1        ˆfd"„|D «       «      rŒ·|j3                  ‰|d#œ«       ŒÌ t5        |«      }|sŒð|j3                  |«       �Œ |j#                  d$«      D ]"  }t7        |«      }|j3                  d%|› d&�«       Œ$ d'j9                  |«      }|j#                  dd
¬(«      D ]½  }|d   }t        j                  d |j%                  «       «      sŒ-|j                  d
¬«      xs t&        j(                  j+                  |«      }|j-                  d!«      r|n!|j-                  d«      r	t.        |z   n| dz   |z   Št1        ˆfd)„|D «       «      rŒª|j3                  ‰|d#œ«       Œ¿ ||||fS # t        $ r}t	        d| › d|› �«       Y d}~yd}~ww xY w)*zBFetch detail page, return (title, date, content_text, attachments)rW   rX   rZ   z  [ERR] Detail fetch failed: ú - Nr[   r2   r   Trb   Úmetar5   zArticleTitle|ContentTitle)ÚattrsÚcontentra   u   --å»¶é•¿åŽ¿äººæ°‘æ”¿åºœzpubdate|publicdate|publishdateé
   z(\d{4}[-/]\d{1,2}[-/]\d{1,2})é   rc   ú-zdiv.m-txt-articlezdiv.m-lst36-articler   Fr\   r^   r`   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|wps)$Úhttpc              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w©rp   N© ©Ú.0ÚattÚfull_urls     €rB   ú	<genexpr>zfetch_detail.<locals>.<genexpr>Ÿ   s   øè ø€ ÒM¸#˜s 5™z¨XÕ5ÑMùó   ƒ)rp   r5   r   u	   [è¡¨æ ¼]
u
   
[/è¡¨æ ¼]rD   )r`   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­wr�   r‚   rƒ   s     €rB   r‡   zfetch_detail.<locals>.<genexpr>´   s   øè ø€ ÒE°#�s˜5‘z XÕ-ÑEùrˆ   )re   rf   rg   rn   rU   r   rh   rk   rl   rE   ÚcompileÚIrI   ÚreplaceÚsearchÚgroupri   rj   ÚlowerÚosÚpathÚbasenamerm   rd   Úanyr:   rM   r;   rG   )rp   rq   ru   rr   ra   r   ÚmtÚ	title_tagÚpubdateÚmeta_pubÚ
date_matchÚcontent_divÚcontent_partsÚattachmentsÚchildr^   r`   Úattach_textrh   r   Ú
table_htmlÚcontent_textr†   s                         @rB   Úfetch_detailr    k   sè  ø€ ðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰�4‹€BÙ	Ø—‘ $�Ó'ˆÙØ�Y‰Y�v f¬b¯j©jÐ9UÔWY×W[ÑW[Ó.\Ð%]ˆYÓ^ˆÙ�"—&‘&˜Ô#Ø�y‘M×'Ñ'Ó)ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2×:Ñ:Ð;TÐVXÓY×_Ñ_ÓaˆEð €GØ�y‰y˜¨´·
±
Ð;\Ô^`×^bÑ^bÓ0cÐ'dˆyÓe€HÙ�H—L‘L Ô+Ø˜9Ñ%×+Ñ+Ó-¨c¨rÐ2ˆÙÜ—Y‘YÐ?ÀÇÁÃÓQˆ
ÙØ ×&Ñ& qÓ)×1Ñ1°#°sÓ;ˆGð —/‘/Ð"5Ó6€KÙØ—o‘oÐ&;Ó<ˆà€MØ€Kâà ×)Ñ)¨#¸Ð)Ó?ó 	+ˆEà—^‘^ CÓ(ò S�Ø—u‘u˜V RÓ(�Ü—9‘9ÐFÈÏ
É
ËÕUØ"#§*¡*°4 *Ó"8Ò"R¼B¿G¹G×<LÑ<LÈTÓ<R�KØ'+§¡°vÔ'>™tÐX\×XgÑXgÐhkÔXlÄXÐPTÂ_ÐruÐx{Ñr{ð  Cñ  sC�HÜÓMÀÔMÕMØ#×*Ñ*°8À[Ñ+QÕRðSô ˜UÓ#ˆDÚØ×$Ñ$ TÖ*ð	+ð  !×)Ñ)¨'Ó2ò 	GˆEÜ˜U›ˆJØ× Ñ  :¨j¨\¸Ð!EÕFð	Gð —;‘;˜}Ó-€Lð �]‰]˜3 Tˆ]Ó*ò KˆØ�‰yˆÜ�9‰9Ð>ÀÇ
Á
ÃÕMØŸ*™*¨4˜*Ó0ÒJ´B·G±G×4DÑ4DÀTÓ4JˆKØ#Ÿ™¨vÔ6‘tÐPT×P_ÑP_Ð`cÔPd¼XÈº_ÐjmÐpsÑjsÐvzÑjzˆHÜÓE¸ÔEÕEØ×"Ñ"¨8¸[Ñ#IÕJðKð �'˜<¨Ð4Ð4øôO ò ÜÐ+¨C¨5°°A°3Ð7Ô8Üûðús   ƒP Ð	P3ÐP.Ð.P3c           
      óœ  — 	 t        j                  t        d¬«      }| j                  d«      xs dd d }| j                  d«      xs dd d }| j                  d«      xs d}| j                  d	«      xs dd d
 }| j                  d«      xs dd d }t	        j
                  | j                  d«      xs g d¬«      }|j                  d|f«      j                  «       }|r)|j                  d|d   f«       |j                  d|f«       |j                  d|||||||f«       |j                  d«      j                  «       d   }	|r|d d n|d d }
|j                  d|	|||
f«       |j                  «        |j                  «        t        d|d d › �«       y# t        $ r+}t        d| j                  dd«      › d|› �«       Y d }~yd }~ww xY w)Nr|   rX   ra   r2   iô  Úpage_urliè  r{   Úpublish_dater   Ú	site_nameÚunknownéd   r›   F)Úensure_asciiz,SELECT rowid FROM gov_raw WHERE page_url = ?z&DELETE FROM gov_search WHERE rowid = ?r   z&DELETE FROM gov_raw WHERE page_url = ?z�INSERT INTO gov_raw (title, page_url, content, publish_date, site_name, source_url, status, attachments) VALUES (?, ?, ?, ?, ?, ?, 'synced', ?)zSELECT last_insert_rowid()zWINSERT OR REPLACE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)u     âœ… rW   Tz  [ERR] DB import failed for z: )Úsqlite3ÚconnectÚDB_PATHrf   ÚjsonÚdumpsÚexecuteÚfetchoneÚcommitÚcloserU   rn   )ÚrecordÚdbra   r¢   r{   r£   r¤   Úattachments_strÚoldÚ	new_rowidÚsummaryru   s               rB   Úimport_to_dbr·   º   sÈ  € ðÜ�_‰_œW¨bÔ1ˆØ—‘˜GÓ$Ò*¨¨D¨SÐ1ˆØ—J‘J˜zÓ*Ò0¨b°%°4Ð8ˆØ—*‘*˜YÓ'Ò-¨2ˆØŸ
™
 >Ó2Ò8°b¸#¸2Ð>ˆØ—Z‘Z Ó,Ò9°	¸4¸CÐ@ˆ	ÜŸ*™* V§Z¡Z°Ó%>Ò%DÀ"ÐSXÔYˆà�j‰jÐGÈ(ÈÓU×^Ñ^Ó`ˆÙØ�J‰JÐ?À#ÀaÁ&ÀÔKØ�J‰JÐ?À(ÀÔMà
�
‰
ð ^Ø�H˜g |°YÀÈ/ÐZô	
ð —J‘JÐ;Ó<×EÑEÓGÈÑJˆ	Ù#*�'˜$˜3‘-°°d°s°ˆØ
�
‰
ÐlØ˜u i°Ð9ô	;à
�	‰	ŒØ
�‰Œ
Üˆf�U˜3˜B�Z�LÐ!Ô"ØøÜò ÜÐ+¨F¯J©J°w¸rÓ,BÐ+CÀ2ÀaÀSÐIÔJÜûðús   ‚FF Æ	GÆ !GÇGc                  ó>  — dd l } | j                  d¬«      }|j                  dt        dd¬«       |j	                  «       }d}t        d|j                  dz   «      D �]  }t        d	|› d
�«       t        |«      }|st        d«        nÙt        dt        |«      › d�«       t        |d«      D ]Š  \  }\  }}}	t        d|› dt        |«      › d|d d › d�«       	 t        |«      }
|
sŒ:|
\  }}}}|xs |}|xs |	}|||||t        t        t        dœ}t        |«      }|r|dz  }t#        j$                  d«       ŒŒ ||j                  k  sŒît#        j$                  d«       �Œ t        dt        › d|› d�«       y # t         $ r}t        d|› d|› �«       Y d }~Œud }~ww xY w)Nr   u(   å»¶é•¿åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šçˆ¬è™«)Údescriptionz--pagesé   u2   çˆ¬å�–å‰�Né¡µï¼ˆæ¯�é¡µ20æ�¡ï¼Œé»˜è®¤5é¡µ=100æ�¡ï¼‰)ÚtypeÚdefaultÚhelpr}   u   ðŸ“„ ç¬¬u   é¡µ...u     â†’ æ— æ›´å¤šæ•°æ�®ï¼Œç»“æ�Ÿu     â†’ u    æ�¡z  (rc   z) é(   z...)ra   r¢   r£   r{   r›   r¤   ÚcolumnÚprovinceu     [ERR] è¯¦æƒ…é¡µå¤„ç�†å¤±è´¥: rx   g333333Ó?g      ø?u   
âœ… u    çˆ¬å�–å®Œæˆ�ï¼Œå…±å…¥åº“ )ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚrangeÚpagesrU   rv   ÚlenÚ	enumerater    ÚSITEÚCOLUMNÚPROVINCEr·   rn   ÚtimeÚsleep)rÁ   ÚparserÚargsÚcountro   rs   Úidxra   rp   rt   ÚresultÚdetail_titler–   r{   r›   Úfinal_titleÚ
final_dater±   Úokru   s                       rB   r   r   Ú   sÉ  € ÛØ×$Ñ$Ð1[Ð$Ó\€FØ
×Ñ˜	¬°QÐ=qÐÔrØ×ÑÓ€Dà€EÜ�a˜Ÿ™ a™Ó(ó )ˆÜˆh�t�f˜FÐ#Ô$Ü˜4Ó ˆÙÜÐ0Ô2Ùäˆf”S˜“Z�L Ð%Ô&ä'0°¸Ó':ò 	Ñ#ˆCÑ#�%˜˜dÜ�#�c�U˜!œC ›J˜< r¨%°°¨*¨°SÐ9Ô:ðCÜ% cÓ*�ÙØà>DÑ;�˜g w°Ø*Ò3¨e�Ø$š_¨�
ð )Ø #Ø$.Ø&Ø#.Ü!%Ü$Ü (ñ	�ô " &Ó)�ÙØ˜Q‘J�Eô �J‰J�s�Oð;	ð> �$—*‘*ÓÜ�J‰J�sŽOðS)ôV ˆ&”�Ð0°°°tÐ<Õ=øô ò CÜÐ5°c°U¸#¸a¸SÐA×BÑBûðCús   ÃE8Ã&<E8Å8	FÆFÆFÚ__main__) Ú__doc__Úrequestsr«   rR   r�   rE   rÍ   r¨   rF   r   r   rd   ÚDOMAINrÊ   rË   rÌ   ÚPER_PAGEÚgetenvrª   ÚHEADERSÚSessionre   ÚheadersÚupdater=   rM   rU   rv   r    r·   r   Ú__name__r‚   rC   rB   ú<module>rã      sÏ   ðñó Û Û 
Û 	Û 	Û Û Ý Ý à,€Ø	"€Ø+€Ø	€Ø€Ø€Ø
ˆ"�)‰)�KÐ!2Ó
3€ð DØÐ-Ñ-ñ€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ò*€òò6,òò>L5ò^ò@2>ðj ˆzÒÙ…Fð rC   