Ë
    Í«£j·.  ã                   óH  — d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	 ej                  j                  dd«       ddlmZ dZdZd	Zd
ddddœZ ej$                  «       Zej(                  j+                  e«       h d£Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uú  
æ°¸ä¿®åŽ¿äººæ°‘æ”¿åºœ - éƒ¨é—¨ä¹¡é•‡æ �ç›®æ±‡æ€»
https://www.yongxiu.gov.cn/bmxzlmhz/
CMS: TRS (æ±Ÿè¥¿çœ�æ”¿åŠ¡ç»Ÿä¸€å¹³å�°)
åˆ—è¡¨: div.tzlx > ul.comlist2 > li > span(date) + a[title]
åˆ†é¡µ: index.html -> index_{N}.html, 50é¡µå…±çº¦500æ�¡
è¯¦æƒ…: meta[ArticleTitle]æ ‡é¢˜ + meta[PubDate]æ—¥æœŸ + div#content > p#wznr æ­£æ–‡
é€‚ç”¨: æœ�åŠ¡å™¨ç«¯è¿�è¡Œ (ä½¿ç”¨ push_to_searchdb)
è¿�è¡Œ: python3 crawl_yongxiu_bmxz.py --pages 5   (åˆ�å§‹5é¡µ)
      python3 crawl_yongxiu_bmxz.py --pages 1   (æ—¥è·‘å¢žé‡�)
é    N)Úurljoin)ÚBeautifulSoupÚTagz/root/gov_crawler)Úpush_to_searchdbzhttps://www.yongxiu.gov.cnz/bmxzlmhz/index.htmlu.   æ°¸ä¿®åŽ¿äººæ°‘æ”¿åºœ-éƒ¨é—¨ä¹¡é•‡æ �ç›®æ±‡æ€»zoMozilla/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.9z$https://www.yongxiu.gov.cn/bmxzlmhz/)z
User-AgentÚAcceptzAccept-LanguageÚ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Úchr4   ÚoutÚwalks     €€€úcrawl_yongxiu_bmxz.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,}ú

)ÚreÚbs4r4   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr4   rA   rB   s      @@@rC   Ú	body_textrN   /   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrD   c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefr3   )ÚhttpÚ
javascriptú#ÚimgÚsrc)rS   z//zdata:)Úurllib.parser   r<   Úfind_allÚgetÚ
startswithÚparser   )r    Úbase_urlÚurllibÚtblrQ   rR   rV   rW   s           rC   Úhtml_table_to_htmlr`   J   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€OrD   c                 ó’   — | dk  rt        t        t        «      S t        j                  dd«      }t        t        |› d| dz
  › d�«      S )z9Get page URL: index.html -> index_1.html -> index_49.htmlé   z.htmlr3   Ú_)r   ÚBASE_URLÚ	LIST_PATHÚreplace)ÚnÚbases     rC   Úget_page_urlri   W   sF   € àˆA‚vÜ”x¤Ó+Ð+Ü×Ñ˜W bÓ)€DÜ”8 ˜v Q q¨¡s e¨5Ð1Ó2Ð2rD   c                 óî  — t        | d«      }g }|j                  dd¬«      D ]Ð  }|j                  d«      D ]º  }|j                  d«      }|sŒ|j                  d«      xs dj	                  «       }|s|j                  d	¬
«      }|sŒQ|j                  dd«      j	                  «       }|sŒtt        ||«      }	|j                  d«      }
|
r|
j                  d	¬
«      nd}|j                  ||	|f«       Œ¼ ŒÒ |S )z6Parse list page, return list of (title, url, date_str)rP   r   Úcomlist2©Úclass_r   rQ   Útitler3   T©rJ   rR   Úspan)r   rY   ÚfindrZ   rJ   Úget_textr   r;   )Úhtmlr]   ÚsoupÚitemsr   r   Úa_tagrn   rR   Úurlrp   Údate_strs               rC   Ú
parse_listry   _   sù   € ä˜˜}Ó-€DØ€Eð �m‰m˜D¨ˆmÓ4ò 1ˆØ—+‘+˜dÓ#ò 	1ˆBØ—G‘G˜C“LˆEÙØà—Y‘Y˜wÓ'Ò-¨2×4Ñ4Ó6ˆEÙØŸ™¨T˜Ó2�ÙØà—9‘9˜V RÓ(×.Ñ.Ó0ˆDÙØä˜( DÓ)ˆCð —7‘7˜6“?ˆDÙ48�t—}‘}¨4�}Ô0¸bˆHà�L‰L˜%  hÐ/Õ0ñ+	1ð1ð. €LrD   c           
      ó
  — t        |t        «      r$|j                  «       }|r|j                  |«       yt        |t        «      sy|j
                  j                  «       }|dv �rËg }|j                  D �]p  }t        |t        «      r%|j                  «       }|sŒ'|j                  |«       Œ9t        |t        «      sŒJ|j
                  j                  «       }|dk(  r|j                  d«       Œ{|dk(  rJ|j                  dd«      }|j                  dd«      }	|sŒ§|j                  d	|	› d
t        | |«      › d�«       ŒÊ|dk(  rL|j                  d¬«      }
|j                  dd«      }|j                  |rd|
› d
t        | |«      › d�n|
«       �Œ|dk(  r#|j                  |j                  d¬«      «       �ŒC|dk(  r�ŒJ|j                  d¬«      }|s�Œ`|j                  |«       �Œs t        j                  dddj                  |«      «      j                  «       }|r|j                  |«       yy|j
                  dk(  r!t        || «      }|r|j                  |«       yy|dk(  r|j                  D ]  }t        | ||«       Œ y|dv rI|j!                  dd¬«      D ]2  }t#        |«      j                  «       }|sŒ|j                  d|z   «       Œ4 y|dk(  ryt#        |«      j                  «       }|r|j                  |«       yy)uÚ   
    Recursively extract content from a BeautifulSoup node into the `out` list.
    Handles: p, div (wrapper â†’ recurse into children), tableâ†’Markdown,
    imgâ†’![alt](src), aâ†’[text](url), ul/ol, text nodes.
    N)r	   r   r   r   r   r   r   r7   r8   rV   rW   r3   Úaltz![ú](ú)rQ   Tro   rR   ú[rp   zo:pz[ \t]+ú r    r   )r   r   r   F)Ú	recursivez- )r:   r<   rJ   r;   r   r6   Úlowerr9   rZ   r   rr   rF   rI   rH   r`   Ú_extract_content_from_noderY   rN   )rw   r?   rA   rM   r6   ÚpartsÚchildÚcnrW   r{   Últr   ÚtxtÚtbl_htmlr   s                  rC   r‚   r‚      s§  € ô �$œÔØ�J‰J‹LˆÙØ�J‰J�qŒMØÜ�dœCÔ ØØ�9‰9�?‰?Ó€DàÐ8Ò8àˆØ—]‘]ó 	(ˆEÜ˜%¤Ô%Ø—K‘K“M�ÚØ—L‘L •OÜ˜E¤3Õ'Ø—Z‘Z×%Ñ%Ó'�Ø˜’:Ø—L‘L Õ&Ø˜5’[ØŸ)™) E¨2Ó.�CØŸ)™) E¨2Ó.�CÚØŸ™ r¨#¨¨b´¸¸cÓ1BÐ0CÀ1Ð%EÕFØ˜3’YØŸ™¨d˜Ó3�BØŸ™ 6¨2Ó.�BØ—L‘LÁ" 1 R D¨¬7°3¸Ó+;Ð*<¸AÑ!>È"ÖMØ˜6’\Ø—L‘L §¡°d Ó!;Ö<Ø˜5’[Ùð Ÿ™¨T˜Ó2�AÛØŸ™ Qžð5	(ô6 �f‰f�Y  R§W¡W¨U£^Ó4×:Ñ:Ó<ˆÙØ�J‰J�s�Oð ð 
�‰�gÒ	Ü% d¨CÓ0ˆÙØ�J‰J�xÕ ð à	�Šà—]‘]ò 	8ˆEÜ& s¨E°3Õ7ñ	8ð 
�Ñ	Ø—-‘- °�-Ó6ò 	'ˆBÜ˜B“-×%Ñ%Ó'ˆCÚØ—
‘
˜4 #™:Õ&ñ	'ð
 
�Šàô �d‹O×!Ñ!Ó#ˆÙØ�J‰J�q�Mð rD   c                 ó  — t        |d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j	                  d«      }|r|j                  d	¬
«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|j	                  d«      }|s|j	                  d«      }|s|j	                  d«      }g }	|�r
|j                  dt        j                  d«      ¬«      }
|
s|}
t        |
j                  «      D ]  }t        | ||	«       Œ t        «       }|
j                  d«      D ]›  }|j                  dd«      j                  «       }|sŒ&t        j                  d|t        j                  «      sŒLt        | |«      }||vsŒ]|j!                  |«       |j                  d	¬
«      xs d}|	j#                  d|› d|› d�«       Œ� dj%                  |	«      }|||fS )zAParse detail page, return (title, date_str, content, attachments)rP   r3   Úmetar6   ÚArticleTitle)ÚattrsÚcontentzdiv.title h1Tro   ÚPubDatezdiv#contentzdiv.xl-textz#contentr   ztrs_editor|TRS_UEDITORrl   rQ   rR   z+\.(doc|docx|pdf|xls|xlsx|zip|rar|txt)(\?|$)u   é™„ä»¶r~   r|   r}   rE   )r   rq   rZ   rJ   Ú
select_onerr   rF   ÚcompileÚlistr9   r‚   ÚsetrY   ÚsearchÚIr   Úaddr;   rH   )rw   rs   rt   rn   Úmtr   rx   ÚmdÚcontent_containerÚcontent_partsÚtrs_divr„   Ú	seen_urlsrv   rR   Úfull_urlr6   r�   s                     rC   Úparse_detailr�   Ê   s  € ä˜˜}Ó-€Dð €EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ�_‰_˜^Ó,ˆÙØ—K‘K d�KÓ+ˆEð €HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔØ�i‘=×&Ñ&Ó(ˆð Ÿ™¨Ó6ÐÙØ ŸO™O¨MÓ:ÐÙØ ŸO™O¨JÓ7Ðà€Mâà#×(Ñ(¨´r·z±zÐB[Ó7\Ð(Ó]ˆÙØ'ˆGô ˜'×*Ñ*Ó+ò 	BˆEÜ& s¨E°=ÕAð	Bô “Eˆ	Ø×%Ñ% cÓ*ò 		BˆEØ—9‘9˜V RÓ(×.Ñ.Ó0ˆDÙØÜ�y‰yÐGÈÌrÏtÉtÕTÜ" 3¨Ó-�Ø 9Ò,Ø—M‘M (Ô+Ø Ÿ>™>°˜>Ó5ÒA¸�DØ!×(Ñ(¨1¨T¨F°"°X°J¸aÐ)@ÕAð		Bð �k‰k˜-Ó(€GØ�(˜GÐ#Ð#rD   c                  ó<  — d} t        t        j                  «      D ]J  \  }}|dk(  sŒ|dz   t        t        j                  «      k  sŒ,t	        t        j                  |dz      «      } ŒL t        dd› �«       t        t        › d| › �«       t        d› «       g }t        d| dz   «      D ]µ  }t        |«      }t        d|› d|› �«       	 t        j                  |d	¬
«      }d|_        |j                  dk7  rt        d|j                  › d�«       Œg	 t        |j                  |«      }t        dt        |«      › d�«       |j!                  |«       |rŒªt        d«        n |st        d«       y t        dd› �«       t        dt        |«      › d�«       t        d› «       g }	t        |d«      D ]Õ  \  }
\  }}}t        d|
› dt        |«      › d|d d › d�«       	 t        j                  |d	¬
«      }d|_        |j                  dk7  rt        d|j                  › d�«       Œs	 t#        ||j                  «      \  }}}|xs |}|xs |}t        d|d d › d|› dt        |«      › �«       |	j%                  |||||t        d œ«       Œ× |	r@t        d!t        |	«      › d"�«       t'        |	t        «       t        d#t        |	«      › �«       y t        d$«       y # t        $ r}t        d|› �«       Y d }~�ŒId }~ww xY w# t        $ r}t        d|› �«       Y d }~�Œhd }~ww xY w)%Né   z--pagesrb   r8   z2==================================================u    - çˆ¬è™«, pages=z	
  [Page z] é   )Útimeoutzutf-8éÈ   z  HTTP u   , è·³è¿‡u     è¯·æ±‚å¤±è´¥: z  Found z itemsu     [å�œæ­¢] æ— æ›´å¤šå†…å®¹u   
[EMPTY] æœªæ‰¾åˆ°ä»»ä½•å†…å®¹u
   å…±èŽ·å�– u%    æ�¡åˆ—è¡¨é¡¹ï¼Œå¼€å§‹çˆ¬å�–è¯¦æƒ…...z
  [ú/é2   z...z	    HTTP u       è¯·æ±‚å¤±è´¥: u       -> æ ‡é¢˜: é(   u   ... æ—¥æœŸ: u	    æ­£æ–‡: )rn   Ú
source_urlrw   r�   Úpublish_dateÚ	site_nameu   
[*] å…¥åº“ u    æ�¡...z  DONE: u   
[EMPTY] æ— è®°å½•å…¥åº“)Ú	enumerateÚsysÚargvÚlenÚintÚprintÚ	SITE_NAMEÚrangeri   ÚsessionrZ   ÚencodingÚstatus_codeÚ	Exceptionry   ÚtextÚextendr�   r;   r   )Ú	max_pagesÚiÚargÚ	all_itemsÚpagerw   ÚrespÚeru   ÚrecordsÚidxrn   rx   Údetail_titleÚdetail_dater�   Úfinal_titleÚ
final_dates                     rC   r   r     s4  € à€IÜœCŸH™HÓ%ò -‰ˆˆ3Ø�)Ó  A¡¬¬C¯H©H«Ó 5ÜœCŸH™H Q¨¡U™OÓ,‰Ið-ô 
ˆBˆxˆjˆ/ÔÜ	ŒYˆKÐ(¨¨Ð
4Ô5Ü	ˆXˆJÔà€Iä�a˜ Q™Ó'ò ˆÜ˜4Ó ˆÜ�
˜4˜&  3 %Ð(Ô)ð	Ü—;‘;˜s¨B�;Ó/ˆDØ#ˆDŒMØ×Ñ 3Ò&Ü˜ × 0Ñ 0Ð1°Ð:Ô;Øð 'ô ˜4Ÿ9™9 cÓ*ˆÜ�œ˜U›˜ FÐ+Ô,Ø×Ñ˜Ôò ÜÐ.Ô/Ùð)ñ, ÜÐ/Ô0Øä	ˆBˆxˆjˆ/ÔÜ	ˆJ”s˜9“~Ð&Ð&KÐ
LÔMÜ	ˆXˆJÔà€GÜ'0°¸AÓ'>ò Ñ#ˆÑ#ˆe�S˜(Ü��c�U˜!œC 	›NÐ+¨2¨e°C°R¨j¨\¸Ð=Ô>ð	Ü—;‘;˜s¨B�;Ó/ˆDØ#ˆDŒMØ×Ñ 3Ò&Ü˜	 $×"2Ñ"2Ð!3°8Ð<Ô=Øð 'ô .:¸#¸t¿y¹yÓ-IÑ*ˆ�k 7ð #Ò+ eˆØ Ò, Hˆ
ä� ¨C¨RÐ 0Ð1°¸j¸\ÈÔSVÐW^ÓS_ÐR`ÐaÔbà�‰Ø ØØØØ&Ü"ñ
õ 	ð)ñ: Ü�œc '›l˜^¨7Ð3Ô4Ü˜¤)Ô,Ü�œ˜W›˜Ð'Õ(äÐ)Õ*øôq ò 	ÜÐ$ Q CÐ(Ô)Ýûð	ûô< ò 	ÜÐ& q cÐ*Ô+Ýûð	ús2   ÃAKÇAK9Ë	K6ËK1Ë1K6Ë9	LÌLÌLÚ__main__)r3   )Ú__doc__rª   rF   ÚjsonrX   r   ÚrequestsrG   r   r   ÚpathÚinsertÚcrawler_libr   rd   re   r¯   ÚHEADERSÚSessionr±   ÚheadersÚupdater>   rN   r`   ri   ry   r‚   r�   r   Ú__name__© rD   rC   ú<module>rÑ      s¾   ðñ
÷ Ó Ý  Û ß "à ‡�‡��Ð&Ô 'Ý (à'€Ø"€	Ø<€	ðGàOØ'Ø5ñ€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ò*€òó6ò3òò@HòV5$òpN+ðb ˆzÒÙ…Fð rD   