Ë
    ¡Š£j5  ã                   ó˜  — 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	Zd
ZdddddœZdZh d£Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  rxdej2                  v ZerdneZdej2                  v rKej2                  j9                  d«      Zedz    eej2                  «      k  r eej2                  edz      «      Z eee¬«       yy)un   
è¿�åŸŽå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - é€šçŸ¥å…¬å‘Š
https://sthjj.yuncheng.gov.cn/xwzx/tzgg/
æ”¿åºœç½‘ç«™ - è‡ªå®šä¹‰CMS
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu%   è¿�åŸŽå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘Šu   å±±è¥¿z(https://sthjj.yuncheng.gov.cn/xwzx/tzgg/é   é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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.8zhttps://sthjj.yuncheng.gov.cn/)z
User-AgentÚAcceptzAccept-LanguageÚRefererz�
INSERT OR IGNORE INTO gov_raw 
    (site_name, page_url, title, publish_date, summary, content, category, attachments)
    VALUES (?, ?, ?, ?, '', ?, ?, ?)
>)   Ú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Úchr4   ÚoutÚwalks     €€€ú#/root/gov_crawler/crawl_yuncheng.pyrB   zbody_text.<locals>.walk7   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]*r8   z\n{3,}z

)ÚreÚbs4r4   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr4   rA   rB   s      @@@rC   Ú	body_textrM   /   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrD   c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)rO   Úconns     rC   Úinit_dbrT   J   s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€KrD   c           	      ó  — | dk(  r
t         › d�}nt         › d| › d�}	 t        j                  |t        d¬«      }d|_        |j                  dk7  rt        d|j                  › d| › �d
¬«       g S t        |j                  d«      }g }|j                  d«      }|s|}|j                  d«      D �]  }|j                  d«      }|sŒ|j                  dd«      j                  «       }	|	r|	j                  d«      sd|	v rŒP|j                  dd«      j                  «       }
|
s|j                  d
¬«      }
t!        t         |	«      }|j                  d
¬«      }t#        j$                  d|«      }d}|r!|j'                  d«      j)                  dd«      }|j+                  |
|||	j-                  «       j/                  d«      dœ«       �Œ t        d| › d	t1        |«      › d �d
¬«       |S # t
        $ r}t        d| › d	|› �d
¬«       g cY d}~S d}~ww xY w)!z<Fetch a list page and extract article URLs + titles + dates.é   zindex.shtmlÚindex_z.shtmlé   ©ÚheadersÚtimeoutúutf-8z  [ERROR] Failed to fetch page ú: T©ÚflushNéÈ   ú  [ERROR] HTTP z
 for page úhtml.parserzdiv.tab_listr   ÚaÚhrefr3   Ú
javascriptzgov.cnÚtitle©rI   z(20\d{2}[-/.]\d{2}[-/.]\d{2})ú/ú-z.pdf)rf   ÚurlÚdateÚis_pdfú  Page z items)ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚstatus_coder   ÚtextÚ
select_oneÚfind_allÚfindrI   Ú
startswithÚget_textr   rE   ÚsearchÚgroupÚreplacer;   ÚlowerÚendswithÚlen)Úpage_numrj   ÚrÚeÚsoupÚitemsÚlist_divr   Úa_tagrd   rf   Úfull_urlÚli_textÚ
date_matchÚdate_strs                  rC   Úextract_list_pager�   R   s  € à�1‚}Ü�
˜+Ð&‰ä�
˜&  
¨&Ð1ˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨j¸¸
ÐCÈ4ÕPØˆ	ä˜Ÿ™ Ó/€DØ€Eð �‰˜~Ó.€HÙØˆà×Ñ Ó%ó ˆØ—‘˜“ˆÙØà�y‰y˜ Ó$×*Ñ*Ó,ˆÙ�t—‘ |Ô4¸ÀDÑ8HØð —	‘	˜' 2Ó&×,Ñ,Ó.ˆÙØ—N‘N¨�NÓ.ˆEäœ8 TÓ*ˆð —+‘+ D�+Ó)ˆÜ—Y‘YÐ?ÀÓIˆ
ØˆÙØ!×'Ñ'¨Ó*×2Ñ2°3¸Ó<ˆHà�‰ØØØØ—j‘j“l×+Ñ+¨FÓ3ñ	
ö 	ð/ô< 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2¸$Õ?Ø€Løô_ ò ÜÐ/°¨z¸¸A¸3Ð?ÀtÕLØ�	ûðús   �#G" Ç"	H
Ç+HÇ?H
ÈH
c                 óÄ  — 	 t        j                  | t        d¬«      }d|_        |j                  d	k7  rt        d
|j                  › d| › �d¬«       yt        |j                  d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|sN|j                  d«      }|r;|j                  d¬«      }t        j                  dd|«      j                  «       }|r|}|j                  «       }d}	t        j                  d|«      }
|
r|
j                  d«      }	|j!                  d«      }|s|j!                  d«      }|s|j!                  d«      }d}g }|�rit#        |«      }|j%                  d«      }t'        |«      D ]'  \  }}d|› d�}|j)                  t#        |«      |d«      }Œ) t        |d«      }t+        |«      }g }|j-                  d«      }d}|D �]J  }|j                  «       }|sŒ|j/                  d «      �r|j1                  d!«      �rÿ|}|dz  }|t3        |«      k  sŒQ||   }|j%                  d"«      }|sŒjd}|D ]*  }|j%                  d#d$g«      }t5        |t3        |«      «      }Œ, |d%k(  ród&}g }|D ]¾  }|j%                  d#d$g«      }t3        |«      d%k\  rg|d   j                  d'd¬«      }t+        |d   «      } |r&|j7                  |j9                  |«      › d(| › �«       Œp|j7                  d|› d�›d(| › �«       Œ‹t3        |«      dk(  sŒš|j7                  |d   j                  d'd¬«      «       ŒÀ |s�Œk|j7                  ddj;                  |«      z   dz   «       �Œ“dg|z  }!|D ]V  }|j%                  d#d$g«      }t'        |«      D ]3  \  }"}#|#j                  d'd¬«      }$t5        |!|"   t3        |$«      «      |!|"<   Œ5 ŒX |!D �%cg c]  }%t5        d)t=        |%d%z   d*«      «      ‘Œ }!}%g }t'        |«      D ]ä  \  }&}|j%                  d#d$g«      }g }'t?        |«      D ]K  }(|(t3        |«      k  r||(   j                  d'd¬«      nd})|'j7                  |)j9                  |!|(   «      «       ŒM d+}*|j7                  |*|*j;                  |'«      z   d,z   «       |&dk(  sŒ¢g }+|!D ]  }%|+j7                  d-|%z  «       Œ |j7                  d.d/j;                  |+«      z   d0z   «       Œæ |s�Œ|j7                  ddj;                  |«      z   dz   «       �Œ:|j7                  |«       �ŒM dj;                  |«      }|j%                  d1d¬2«      D ]u  },|,d3   }-t        j                  d4|-t        j@                  «      sŒ.|,j                  d¬«      xs |-j-                  d5«      d6   }.tC        | |-«      }/|j7                  |.|/d7œ«       Œw t3        |j                  «       «      d8k  rd9|xs | j-                  d5«      d6   › d:| › d;�}|||	|rtE        jF                  |d<¬=«      d>œS dd>œS # t        $ r}t        d| › d|› �d¬«       Y d}~yd}~ww xY wc c}%w )?z-Fetch a detail page and extract full content.rX   rY   r\   z  [ERROR] Failed to fetch r]   Tr^   Nr`   ra   z for rb   r3   Úmetar6   ÚArticleTitle)ÚattrsÚcontentrf   rg   u(   [-â€“â€”].*?(ç½‘ç«™|é¡µé�¢|è¿�åŸŽå¸‚).*$u0   å�‘è¡¨æ—¶é—´[ï¼š:]\s*(20\d{2}[-/]\d{2}[-/]\d{2})rV   zdiv.info_content_midzdiv.info_area_boxzdiv.mainBoxr    z	
__TABLE_z__
r8   r   Ú__TABLE_Ú__r   r   r   é   é   ú z | é   é(   z| z |ri   z|-z-|-z-|rc   )rd   rd   z"\.(pdf|doc|docx|xls|xlsx|rar|zip)$rh   éÿÿÿÿ©r6   rj   r   ú[z](u   )
ï¼ˆæœ¬æ–‡ä¸ºPDFé™„ä»¶ï¼‰F©Úensure_ascii)rf   r’   Úpub_dateÚattachments)$ro   rp   rq   rr   rs   rt   ru   r   rv   ry   rI   r{   rE   rH   r|   r}   rw   r<   rx   Ú	enumerater~   rM   Úsplitrz   r€   r�   Úmaxr;   ÚljustrG   ÚminÚrangeÚ
IGNORECASEr   ÚjsonÚdumps)0rj   rƒ   r„   r…   rf   Ú
meta_titleÚ	title_tagrL   Ú	page_textrŸ   r‹   Úcontent_divÚcontent_textÚattachments_listÚcontent_html_strÚ
all_tablesÚtir    ÚmarkerÚ
clean_soupÚ
clean_textÚpartsÚsegmentsÚ	table_idxÚsegÚrowsÚnum_colsÚrowÚcellsÚ	col_widthÚtable_linesÚlabelÚvalueÚ
col_widthsÚiÚcellÚ	cell_textÚwÚriÚ
cell_textsÚciÚtxtÚsepÚsep_linerˆ   rd   Ú	att_titler‰   s0                                                   rC   Úextract_detailrÎ   Ž   s°  € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨e°C°5Ð9ÀÕFØä˜Ÿ™ Ó/€Dð €Eà—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆñ Ø—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘ÐBÀBÈÓJ×PÑPÓRˆAÙØ�ð —‘“€IØ€HÜ—‘ÐNÐPYÓZ€JÙØ×#Ñ# AÓ&ˆð —/‘/Ð"8Ó9€KÙØ—o‘oÐ&9Ó:ˆÙØ—o‘o mÓ4ˆà€LØÐâä˜{Ó+Ðð !×)Ñ)¨'Ó2ˆ
Ü" :Ó.ò 	O‰IˆB�Ø! "  TÐ*ˆFØ/×7Ñ7¼¸E»
ÀFÈAÓNÑð	Oô
 #Ð#3°]ÓCˆ
Ü˜zÓ*ˆ
ð ˆØ×#Ñ# DÓ)ˆØˆ	Øó ;	"ˆCØ—)‘)“+ˆCÙØØ�~‰~˜jÕ)¨c¯l©l¸4Õ.@Ø�Ø˜Q‘�	Øœ˜J›Ó'Ø& r™N�EØ Ÿ>™>¨$Ó/�DÚØ#$˜Ø#'ò A˜CØ$'§L¡L°$¸°Ó$>˜EÜ'*¨8´S¸³ZÓ'@™HðAð $ qš=à(*˜IØ*,˜KØ'+ò 
[ Ø(+¯©°d¸D°\Ó(B Ü#& u£:°¢?Ø,1°!©H×,=Ñ,=¸cÈÐ,=Ó,N EÜ,5°e¸A±hÓ,? EÙ',Ø(3×(:Ñ(:¸e¿k¹kÈ)Ó>TÐ=UÐUXÐY^ÐX_Ð;`Õ(aà(3×(:Ñ(:¸bÀ)ÀÈ@ÀÐ=MÈSÐQVÐPWÐ;XÕ(YÜ%(¨£Z°1£_Ø$/×$6Ñ$6°u¸Q±x×7HÑ7HÈÐTXÐ7HÓ7YÕ$Zð
[ó  +Ø %§¡¨T°D·I±I¸kÓ4JÑ-JÈTÑ-QÖ Rð +,¨¨x©˜JØ'+ò W Ø(+¯©°d¸D°\Ó(B Ü/8¸Ó/?ò !W¡G A tØ04·±¸cÈ°Ó0N IÜ47¸
À1¹ÄsÈ9Ã~Ó4V J¨q¢Mñ!WðWð
 KUÖ)UÀQ¬#¨a´°Q¸±U¸B³Õ*@Ð)U˜JÐ)UØ*,˜KÜ+4°T«?ò [¡  CØ(+¯©°d¸D°\Ó(B Ø-/ 
Ü*/°«/ò !Q BØQSÔVYÐZ_ÓV`ÒQ`¨%°©)×*<Ñ*<¸SÈÐ*<Ô*MÐfh CØ$.×$5Ñ$5°c·i±iÀ
È2ÁÓ6OÕ$Pð!Qð '+ Ø +× 2Ñ 2°3¸¿¹À*Ó9MÑ3MÐPTÑ3TÔ UØ#%¨£7Ø/1 HØ-7ò %A¨Ø(0¯©¸¸a¹Õ(@ð%Aà$/×$6Ñ$6°t¸e¿j¹jÈÓ>RÑ7RÐUYÑ7YÕ$Zð[ó  +Ø %§¡¨T°D·I±I¸kÓ4JÑ-JÈTÑ-QÖ Rà—‘˜SÖ!ðw;	"ðz —y‘y Ó'ˆð !×)Ñ)¨#°DÐ)Ó9ò 	NˆEØ˜‘=ˆDÜ�y‰yÐ>ÀÄbÇmÁmÕTØ!ŸN™N°˜NÓ6ÒM¸$¿*¹*ÀS»/È"Ñ:M�	Ü" 3¨Ó-�Ø ×'Ñ'°À8Ñ(LÕMð	Nô ˆ<×ÑÓÓ  2Ò%Ø˜5Ò6 C§I¡I¨c£N°2Ñ$6Ð7°r¸#¸Ð>YÐZˆð ØØÙK[”t—z‘zÐ"2ÀÔGñ	ð ð bdñ	ð øôQ ò ÜÐ*¨3¨%¨r°!°Ð5¸TÕBÜûðüòL *Vs   ‚#X4 Ï% YØ4	YØ=YÙYFc                 ó–  — t        dt        › d|› �d¬«       t        «       }|j                  «       }d}d}d}t	        d|dz   «      D �]Q  }t        |«      }|st        d|› d�d¬«        �n0|dz  }|D ]ä  }	|	d	   }
|	d
   }|	d   }|j                  d|f«       |j                  «       r|dz  }Œ;|	d   r'd|› d|
› d�}t        j                  |
|dœgd¬«      }|}nJt        |«      }|€|dz  }Œz|d	   rt        |d	   «      t        |
«      kD  r|d	   }
|d   }|xs |d   }|d   }|j                  t        t        ||
||t        |f«       |dz  }| sŒÞ|dk\  sŒä n |j                  «        | r|dk\  rt        d|› d�d¬«        nt        j                   d«       �ŒT |j#                  «        t        dt        › d|› d|› d|› �d¬«       |S )zMain crawl function.rœ   z] Starting crawl, max_pages=Tr^   r   rV   rm   z empty, stoppingrf   rj   rk   z)SELECT id FROM gov_raw WHERE page_url = ?rl   z<p><a href="z">u   </a></p>
ï¼ˆPDFé™„ä»¶ï¼‰r›   Fr�   r’   rŸ   r    é
   z  Test mode: stopping after z insertsg      à?z] Done. Inserted=z
, Skipped=z, Pages=)rt   Ú	SITE_NAMErT   Úcursorr¦   r�   rR   Úfetchoner¨   r©   rÎ   r�   Ú
INSERT_SQLÚCATEGORYÚcommitÚtimeÚsleepÚclose)Ú	test_modeÚ	max_pagesrS   ÚcurÚtotal_insertedÚtotal_skippedÚpages_crawledr‚   r†   Úitemrf   rj   rk   r’   r    rŸ   Údetails                    rC   Úcrawlrâ   #  s*  € ä	ˆAŒiˆ[Ð4°Y°KÐ
@ÈÕMÜ‹9€DØ
�+‰+‹-€Cà€NØ€MØ€Mä˜!˜Y¨™]Ó+ó 4ˆÜ! (Ó+ˆÙÜ�G˜H˜:Ð%5Ð6¸dÕCÚà˜ÑˆØò %	ˆDØ˜‘MˆEØ�u‘+ˆCØ˜‘<ˆDð �K‰KÐCÀcÀVÔLØ�|‰|Œ~Ø Ñ"�Øð �HŠ~Ø(¨¨¨R°¨wÐ6OÐP�Ü"Ÿj™j°5ÀÑ*EÐ)FÐUZÔ[�Ø‘ä'¨Ó,�Ø�>Ø! QÑ&�MØð ˜'’?¤s¨6°'©?Ó';¼cÀ%»jÒ'HØ" 7™O�Eà  Ñ+�ØÒ5 6¨*Ñ#5�Ø$ ]Ñ3�à�K‰Kœ
Ü˜3  xØœ ;ð%ô ð ˜aÑˆNâ˜^¨rÓ1ÙðK%	ðN 	�‰Œá˜¨2Ò-ÜÐ0°Ð0@ÀÐIÐQUÕVÙä�
‰
�3Žði4ðl 	‡J�J„LÜ	ˆAŒiˆ[Ð)¨.Ð)9¸ÀMÀ?ÐRZÐ[hÐZiÐ
jÐrvÕwØÐrD   Ú__main__z--testé   z--max-pagesrV   )rÚ   rÛ   ) Ú__doc__rE   Úsysr×   r¨   ro   rF   r   Úurllib.parser   rQ   rÑ   rÕ   rn   Ú	MAX_PAGESÚ	PAGE_SIZErq   rÔ   r>   rM   rT   r�   rÎ   râ   Ú__name__ÚargvrÚ   ÚmpÚindexÚidxr�   Úint© rD   rC   ú<module>rñ      s  ðñó
 
Û 
Û Û Û Ý Ý  à
€Ø3€	Ø€Ø5€Ø€	Ø€	ð DØOØ0Ø/ñ	€ð€
ò*€òò6ò9òxRðj  Yó BðJ ˆzÒØ˜CŸH™HÐ$€IÙ‰˜Y€BØ˜Ÿ™Ñ Ø�h‰h�n‰n˜]Ó+ˆØ�‰7‘S˜Ÿ™“]Ò"Ù�S—X‘X˜c A™gÑ&Ó'ˆBÙ	�I¨Ö,ð rD   