Ë
    ¸¬uj~*  ã                   ó²   — 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mZ ddlm	Z	 dZ
dZddd	œZd
Zd„ Zd„ Zd„ Zdd„Zd„ Z	 	 dd„Zd„ Zedk(  r e«        yy)uá  
crawl_bachu_sthj.py - å·´æ¥šåŽ¿äººæ°‘æ”¿åºœ-ç”Ÿæ€�çŽ¯å¢ƒ
=============================================
ç«™ç‚¹: https://www.bachu.gov.cn/bcx/c115734/zwgk.shtml
CMS:  å·´æ¥šæ”¿åŠ¡CMS (jQuery)
åˆ—è¡¨: zwgk_N.shtml (å…±3é¡µï¼Œæ¯�é¡µ15æ�¡)
è¯¦æƒ…: <div id="zoomcon" class="xxgk-tt-content xxgk-tt-content-body">

ç”¨æ³•:
  python3 crawl_bachu_sthj.py              # é»˜è®¤5é¡µ
  python3 crawl_bachu_sthj.py --pages 3    # çˆ¬3é¡µ
  python3 crawl_bachu_sthj.py --dry-run    # ä»…é¢„è§ˆ
é    N)Údatetime)ÚBeautifulSoupzhttps://www.bachu.gov.cnz/bcx/c115734/zwgk.shtmlzoMozilla/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.8)z
User-AgentÚAccepté   c                 óp   — t        j                  «       j                  d«      }t        d|› d| › �d¬«       y )Nz%H:%M:%Sú[ú] T)Úflush)r   ÚnowÚstrftimeÚprint)ÚmsgÚtss     ú%/root/gov_crawler/crawl_bachu_sthj.pyÚlogr       s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                 óŽ   — | sy| j                  dd«      j                  dd«      j                  dd«      } | j                  d«      S )	u8   æ¸…æ´—æ ‡é¢˜ï¼šstrip &middot; &nbsp; ç­‰HTMLå®žä½“å‰�ç¼€Ú z&middot;õ   Â·z&nbsp;ú z&amp;ú&u   Â·. 	
)ÚreplaceÚstrip)Útitles    r   Úclean_titler   %   sB   € áØØ�M‰M˜* dÓ+×3Ñ3°H¸cÓB×JÑJÈ7ÐTWÓX€EØ�;‰;�|Ó$Ð$r   c                 ó¤  ‡	— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  d«       Œ |j                  dg«      D ]  }|j                  «        Œ t	        |j                  dd	g«      «      D ]g  }|j
                  D �cg c]*  }|j                  €t        |«      j                  «       sŒ)|‘Œ, }}|sŒEt        d
„ |D «       «      sŒX|j                  «        Œi dˆ	fd„	Š	 ‰	|«      }g d¢}|D ]  }t        j                  |d|«      }Œ |j                  «       S c c}w )u5   æ¸…æ´—æ­£æ–‡HTMLï¼šåŽ»å†—ä½™æ ‡ç­¾ï¼Œä¿�ç•™è¡¨æ ¼HTMLr   úhtml.parserÚstyleÚscriptÚbrú
zo:pÚpÚdivc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r"   N)Úname)Ú.0Úcs     r   ú	<genexpr>zclean_html.<locals>.<genexpr>=   s   è ø€ Ò4¨!˜Ÿ™ #�Ñ4ùs   ‚c                 ó   •— g }| j                   D �]  }|j                  €.t        |«      j                  «       }|sŒ,|j	                  |«       Œ>|j                  dk(  r|j	                  t        |«      «       Œh|j                  dv r- ‰|d¬«      }|j                  «       sŒ‘|j	                  |«       Œ£|j                  dv r- ‰|d¬«      }|j                  «       sŒÌ|j	                  |«       ŒÞ|j                  d¬«      }|sŒó|j	                  |«       �Œ |r?dj                  d„ |D «       «      }t        j                  d	d|«      }|j                  «       S d
j                  d„ |D «       «      }|j                  «       S )NÚtable)r"   r#   ÚtdÚthÚliÚsectionÚtrÚtbodyÚtheadÚh1Úh2Úh3Úh4Úh5Úh6T)Ú	is_inline)ÚspanÚfontÚbÚiÚstrongÚemÚaÚuÚsubÚsupÚsmallÚlabel©r   r   c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©NrE   ©r&   r"   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>X   s   è ø€ Ò< A°!·'±'µ)œaÑ<ùó   ‚˜z {2,}ú

c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wrG   rE   rH   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>[   s   è ø€ Ò ? q°Q·W±WµY¤Ñ ?ùrI   )	Úchildrenr%   Ústrr   ÚappendÚget_textÚjoinÚrerA   )Úelementr8   ÚpartsÚchildÚtextÚinnerÚresultÚextract_contents          €r   rX   z#clean_html.<locals>.extract_content@   sF  ø€ ØˆØ×%Ñ%ó 	'ˆEØ�z‰zÐ!Ü˜5“z×'Ñ'Ó)�ÚØ—L‘L Õ&Ø—‘˜wÒ&Ø—‘œS ›ZÕ(Ø—‘ð  Mñ Má'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'Ø—‘ð  Eñ Eá'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'à—~‘~¨D�~Ó1�ÚØ—L‘L Ö&ð)	'ñ* Ø—X‘XÑ<¨Ô<Ó<ˆFÜ—V‘V˜H c¨6Ó2ˆFð �|‰|‹~Ðð —[‘[Ñ ?¨EÔ ?Ó?ˆFØ�|‰|‹~Ðr   )u7   (?<!\n)\s+(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])u8   (?<!\n)\s+(?=[ï¼ˆ][ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��][ï¼‰])u2   (?<=[ã€‚ï¼�ï¼Ÿ])\s+(?=\d+[.ã€�]\s*[\u4e00-\u9fff])u:   (?<!\n)\s{2,}(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])rJ   )F)r   Úfind_allÚ	decomposeÚreplace_withÚlistrL   r%   rM   r   ÚallÚunwraprQ   rA   )
Úcontent_htmlÚsoupÚtagr    r'   ÚkidsrW   Úsection_patsÚpatrX   s
            @r   Ú
clean_htmlre   -   s9  ø€ áØÜ˜ }Ó5€Dà�}‰}˜g xÐ0Ó1ò ˆØ�‰�ðà�m‰m˜DÓ!ò ˆØ
�‰˜Õðà�}‰}˜e˜WÓ%ò ˆØ�‰�ðô �D—M‘M 3¨ ,Ó/Ó0ò ˆØŸ<™<ÖW�a°·±°ÄsÈ1ÃvÇ|Á|Å~’ÐWˆÐWÚ”CÑ4¨tÔ4Õ4Ø�J‰J�Lðõ
ñ< ˜TÓ"€Fò
€Lð ò -ˆÜ—‘˜˜V VÓ,‰ð-ð �<‰<‹>Ðùòa Xs   Â4*EÃEc           	      óÆ  — | dk(  rt         › t        › �}nt         › d| › d�}	 t        j                  |t        d¬«      }d|_        |j                  }t        |d«      }|j                  dd¬«      }g }|rÂ|j                  dd¬«      D ]¬  }|j                  d«      }	|j                  dd¬«      }
|	sŒ*|
sŒ-|	j                  dd«      }|r|j                  d«      s	t         |z   }t        |	j                  d|	j                  d¬«      «      «      }|
j                  d¬«      }|j                  |||dœ«       Œ® |S # t        $ r}t        d| › d|› �«       g d	fcY d
}~S d
}~ww xY w)u   èŽ·å�–åˆ—è¡¨é¡µé   z/bcx/c115734/zwgk_z.shtmlé   ©ÚheadersÚtimeoutúutf-8u   åˆ—è¡¨é¡µè¯·æ±‚å¤±è´¥ (page=z): r   Nr   ÚulÚ	innerList©Úclass_r-   F)Ú	recursiver?   r9   ÚfrÚhrefr   Úhttpr   TrE   )r   ÚdateÚurl)ÚBASE_URLÚ	LIST_PATHÚrequestsÚgetÚHEADERSÚencodingrU   Ú	Exceptionr   r   ÚfindrY   Ú
startswithr   rO   rN   )Úpagerv   ÚrespÚhtmlÚer`   rm   Úitemsr-   Úa_tagÚspan_tagrs   r   ru   s                 r   Ú
fetch_listr‡   o   s`  € àˆq‚yÜ�
œ9˜+Ð&‰ä�
Ð,¨T¨F°&Ð9ˆðÜ�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€DØ	�‰�4 ˆÓ	,€BØ€EÙ	Ø—+‘+˜d¨e�+Ó4ò 		JˆBØ—G‘G˜C“LˆEØ—w‘w˜v¨d�wÓ3ˆHÚšØ—y‘y ¨Ó,�Ù §¡°Ô 7Ü# d™?�DÜ# E§I¡I¨g°u·~±~ÈD°~Ó7QÓ$RÓS�Ø×(Ñ(¨tÐ(Ó4�Ø—‘ u°dÀ4ÑHÕIð		Jð €Løô' ò ÜÐ*¨4¨&°°A°3Ð7Ô8Ø�1ˆu�ûðús   ¢/D8 Ä8	E ÅEÅE ÅE c                 óœ  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d¬«      }|sE|j                  d«      }|r2|j                  d¬«      j                  d«      d   j                  «       }|rt        |«      nd}d}	|j                  d	d
di¬«      }
|
r'|
j                  d«      r|
d   j                  «       dd }	d}|j                  dd¬«      }|r |j                  «       j                  d«      }n4|j                  dd¬«      }|r|j                  «       j                  d«      }||	|fS # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)u   èŽ·å�–è¯¦æƒ…é¡µrh   ri   rl   u   è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥ z: N)NNNr   Úmetar%   ÚArticleTitle)ÚattrsÚcontentr2   TrE   r   Ú_r   r   ÚPubDateé
   r#   Úzoomcon)Úidzxxgk-tt-contentro   )ry   rz   r{   r|   rU   r}   r   r   r~   r   rO   Úsplitr   Úencode_contentsÚdecode)rv   r�   r‚   rƒ   r`   r   Ú
meta_titler2   Ú	title_tagÚpub_dateÚ	meta_dater_   Úzoom_divÚfallbacks                 r   Úfetch_detailr›   �   sÌ  € ð Ü�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2×8Ñ8¸Ó=¸aÑ@×FÑFÓHˆEÙ"'ŒK˜Ô¨R€Eð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €LØ�y‰y˜ 9ˆyÓ-€HÙØ×/Ñ/Ó1×8Ñ8¸ÓA‰ð —9‘9˜UÐ+<�9Ó=ˆÙØ#×3Ñ3Ó5×<Ñ<¸WÓEˆLà�(˜LÐ(Ð(øôM ò  ÜÐ$ S E¨¨A¨3Ð/Ô0Üûð ús   ‚/F' Æ'	GÆ0GÇGc                 ór  — | st        d«       yd}ddl}d}| D �]"  }|j                  dd«      }|j                  dd«      }	|j                  dd«      }
|j                  d	d«      }|r|
sŒQ|j                  d
d«      }|
j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|	j                  d
d«      }|r|j                  d
d«      nd}d|› d|› d|› d|› d|› d|› d|› d|› d|› d�}d|d|› �g}	 |j	                  |ddd¬«      }|j
                  dk(  r|dz  }�Œ% t        d|› dt        | «      › d�«       t        d«       d› d�}	 |j	                  d||gddd¬«       y# t        $ r Y �Œxw xY w# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)u   å…¥åº“åˆ° search.dbu   æ— æ•°æ�®å�¯å…¥åº“Nz/mnt/data/search.dbr   r   r   ru   rv   rŒ   ú'z''z†INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, summary, content, group_name, industry) VALUES ('z', 'z');Úsqlite3zPRAGMA busy_timeout=15000; Trh   )Úcapture_outputrU   rk   rg   u   å…¥åº“å®Œæˆ�: ú/õ    æ�¡u   å�Œæ­¥FTS...z“INSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.site_name='zA' AND NOT EXISTS (SELECT 1 FROM gov_search s WHERE s.rowid=r.id);u   FTSå�Œæ­¥å¤±è´¥: )r   Ú
subprocessrz   r   ÚrunÚ
returncoder}   Úlen)r„   Úsource_nameÚ
group_nameÚindustryÚdb_pathr¢   ÚinsertedÚitemr   ru   rv   rŒ   Ú	esc_titleÚesc_urlÚ
esc_sourceÚ	esc_groupÚesc_industryÚesc_dateÚesc_contentÚuse_sqlÚcmdrW   Úfts_sqlrƒ   s                           r   Úpush_to_searchdbr¶   ¿   sR  € ñ ÜÐ Ô!Øà#€GÛà€HØó *ˆØ—‘˜ "Ó%ˆØ�x‰x˜ Ó#ˆØ�h‰h�u˜bÓ!ˆØ—(‘(˜9 bÓ)ˆá™CØà—M‘M # tÓ,ˆ	Ø—+‘+˜c 4Ó(ˆØ ×(Ñ(¨¨dÓ3ˆ
Ø×&Ñ& s¨DÓ1ˆ	Ø×'Ñ'¨¨TÓ2ˆØ—<‘<  TÓ*ˆá4;�g—o‘o c¨4Ô0Àˆðð ˆ|ð Øˆyð Øˆyð Øˆ{ð Øˆzð Øˆ{ð Øˆ}ð Øˆ{ð Øˆ~ð ðð 	ð  ˜'Ð%@ÀÀ	Ð#JÐKˆð	Ø—^‘^Ø D¨t¸Rð $ó ˆFð × Ñ  AÒ%Ø˜A‘�ùðQ*ôX ˆ.˜˜
 !¤C¨£J <¨tÐ4Ô5ô ˆÔð	ð )˜\ð *Jð	Jð ð%Ø�‰Ø˜ Ð)Ø d°Bð 	õ 	
øô ò 	Úð	ûô& ò %ÜÐ ˜sÐ#×$Ñ$ûð%ús*   Ä)FÅ,F Æ	FÆFÆ	F6ÆF1Æ1F6c            
      óf  — dd l } | j                  d¬«      }|j                  dt        t        dt        › d�¬«       |j                  dd	d
¬«       |j                  «       }t        d|j                  › d|j                  › �«       g }t        d|j                  dz   «      D ]â  }t        d|› d�«       t        |«      }|st        d|› d�«        nµt        dt        |«      › d�«       |D ]–  }|j                  r|j                  |«       Œ!t        d|d   d d › d�«       t        |d   «      \  }}}	|xs |d   }
|xs |d   }|	rt        |	«      nd}|j                  |
||d   |dœ«       t        j                   d«       Œ˜ Œä t        dt        |«      › d�«       |d d  D ]k  }t#        d!|d   › d"|d   d d# › �«       t#        d$|d   › �«       |j                  s(t#        d%t        |j%                  d&d«      «      › d'�«       t#        «        Œm |j                  st'        |«       t        d(«       y ))Nr   u   å·´æ¥šåŽ¿-ç”Ÿæ€�çŽ¯å¢ƒçˆ¬è™«)Údescriptionz--pagesu   çˆ¬å�–é¡µæ•° (é»˜è®¤: ú))ÚtypeÚdefaultÚhelpz	--dry-runÚ
store_trueu   ä»…é¢„è§ˆä¸�å®žé™…çˆ¬å�–è¯¦æƒ…)Úactionr¼   u%   ðŸš€ çˆ¬è™«å�¯åŠ¨: bachu_sthj, pages=z
, dry_run=rg   u
   çˆ¬å�–ç¬¬ u    é¡µ...u   ç¬¬ u    é¡µæ— æ•°æ�®ï¼Œå�œæ­¢u     èŽ·å�–åˆ° r¡   u
     è¯¦æƒ…: r   é(   z...rv   ru   r   )r   ru   rv   rŒ   g      à?u   
=== çˆ¬å�–å®Œæˆ�: u    æ�¡ ===é   z  [r	   é2   z  URL: u
     æ­£æ–‡: rŒ   z charsu   âœ… å…¨éƒ¨å®Œæˆ�)ÚargparseÚArgumentParserÚadd_argumentÚintÚDEFAULT_PAGESÚ
parse_argsr   ÚpagesÚdry_runÚranger‡   r¥   rN   r›   re   ÚtimeÚsleepr   rz   r¶   )rÂ   ÚparserÚargsÚ	all_itemsr€   r„   r«   Údetail_titleÚdetail_dater_   Úfinal_titleÚ
final_dateÚcleaned_contents                r   ÚmainrÕ   
  sQ  € ÛØ×$Ñ$Ð1OÐ$ÓP€FØ
×Ñ˜	¬´]Ø5´m°_ÀAÐFð ô Hà
×Ñ˜¨LØ=ð ô ?à×ÑÓ€DäÐ
/°·
±
¨|¸:ÀdÇlÁlÀ^ÐTÔUà€IÜ�a˜Ÿ™ a™Ó(ò ˆÜˆj˜˜˜gÐ&Ô'Ü˜4Ó ˆÙÜ�$�t�fÐ2Ð3Ô4ÙÜˆlœ3˜u›:˜, dÐ+Ô,àò 	ˆDØ�|Š|Ø× Ñ  Ô&Øä�*˜T '™]¨3¨BÐ/Ð0°Ð4Ô5Ü6BÀ4ÈÁ;Ó6OÑ3ˆL˜+ |Ø&Ò7¨$¨w©-ˆKØ$Ò4¨¨V©ˆJÙ:Fœj¨Ô6ÈBˆOà×ÑØ$Ø"Ø˜E‘{Ø*ñ	ô ô �J‰J�s�Oñ#	ðô6 Ð
œs 9›~Ð.¨hÐ7Ô8Ø˜"˜1�ò ˆÜ��D˜‘L�>  D¨¡M°#°2Ð$6Ð#7Ð8Ô9Ü�˜˜U™�}Ð%Ô&Ø�|Š|Ü�Jœs 4§8¡8¨I°rÓ#:Ó;Ð<¸FÐCÔDÜ�ðð �<Š<Ü˜Ô#äÐÕr   Ú__main__)rg   )Ú
bachu_sthju   æ–°ç–†u   æ”¿åºœå…¬å‘Š)Ú__doc__ÚsysÚosrQ   Újsonry   rË   r   Úbs4r   rw   rx   r{   rÆ   r   r   re   r‡   r›   r¶   rÕ   Ú__name__© r   r   ú<module>rß      sƒ   ðñ÷ )× (× (Ý Ý à%€Ø%€	ðGàOñ€ð €ò'ò
%ò?óDòB,)ð^ BJØ,óH%òV2ðj ˆzÒÙ…Fð r   