Ë
    ¸¬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
e
› d�Zdde
› d	�d
œZdZdZd„ Zd„ Zd„ Zdd„Zd„ Zedfd„Z	 	 dd„Zd„ Zedk(  r e«        yy)uü  
crawl_ptxy_hjsp.py - èŽ†ç”°å¸‚ç§€å±¿åŒºäººæ°‘æ”¿åºœ-é¡¹ç›®çŽ¯å¢ƒå½±å“�å®¡æ‰¹
===========================================================
ç«™ç‚¹: https://www.ptxy.gov.cn/zwgk/hjbh/xmhjyxsp/
CMS:  èŽ†ç”°21pt (TRS+avalon.js), APIé©±åŠ¨
åˆ—è¡¨: /fjdzapp/search?channelid=201988&classsql=chnlid=26312&page=N&perpage=15
è¯¦æƒ…: TRS_Editor div

ç”¨æ³•:
  python3 crawl_ptxy_hjsp.py              # é»˜è®¤5é¡µ
  python3 crawl_ptxy_hjsp.py --pages 3    # çˆ¬3é¡µ
  python3 crawl_ptxy_hjsp.py --dry-run    # ä»…é¢„è§ˆ
é    N)Údatetime)ÚBeautifulSoupzhttps://www.ptxy.gov.cnz/fjdzapp/searchzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z.application/json, text/javascript, */*; q=0.01z/zwgk/hjbh/xmhjyxsp/)z
User-AgentÚAcceptÚRefereré   é   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_ptxy_hjsp.pyÚlogr   "   s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                 ó°   — | s| S | j                  dd«      j                  dd«      j                  dd«      } | j                  d«      } | j                  «       S )u8   æ¸…æ´—æ ‡é¢˜ï¼šstrip &middot; &nbsp; ç­‰HTMLå®žä½“å‰�ç¼€z&middot;õ   Â·z&nbsp;ú z&amp;ú&u   Â·. 	
)ÚreplaceÚstrip)Útitles    r   Úclean_titler   '   sO   € áØˆà�M‰M˜* dÓ+×3Ñ3°H¸cÓB×JÑJÈ7ÐTWÓX€Eà�K‰K˜Ó%€EØ�;‰;‹=Ðr   c                 óü   ‡— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  d«       Œ dˆfd„	Š ‰|«      }|j	                  «       S )	u5   æ¸…æ´—æ­£æ–‡HTMLï¼šåŽ»å†—ä½™æ ‡ç­¾ï¼Œä¿�ç•™è¡¨æ ¼HTMLÚ úhtml.parserÚstyleÚscriptÚbrú
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 )uX   is_inline=Trueæ—¶ç”¨ç©ºæ ¼æ‹¼æŽ¥å†…è�”å­�å…ƒç´ ï¼ŒFalseæ—¶ç”¨æ�¢è¡Œæ‹¼æŽ¥å�—çº§å­�å…ƒç´ Útable)ÚpÚdivÚ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©NrB   ©Ú.0r&   s     r   ú	<genexpr>z6clean_html.<locals>.extract_content.<locals>.<genexpr>`   s   è ø€ Ò< A°!·'±'µ)œaÑ<ùó   ‚˜z {2,}z

c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wrD   rB   rE   s     r   rG   z6clean_html.<locals>.extract_content.<locals>.<genexpr>e   s   è ø€ Ò ? q°Q·W±WµY¤Ñ ?ùrH   )	ÚchildrenÚnameÚstrr   ÚappendÚget_textÚjoinÚrer>   )Úelementr5   ÚpartsÚchildÚtextÚinnerÚresultÚextract_contents          €r   rW   z#clean_html.<locals>.extract_contentA   sL  ø€ àˆØ×%Ñ%ó 	'ˆEØ�z‰zÐ!ä˜5“z×'Ñ'Ó)�ÚØ—L‘L Õ&Ø—‘˜wÒ&à—‘œS ›ZÕ(Ø—‘ð  Mñ Mñ (¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'Ø—‘ð  Eñ Eñ (¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'ð —~‘~¨D�~Ó1�ÚØ—L‘L Ö&ð3	'ñ4 à—X‘XÑ<¨Ô<Ó<ˆFä—V‘V˜H c¨6Ó2ˆFð �|‰|‹~Ðð —[‘[Ñ ?¨EÔ ?Ó?ˆFØ�|‰|‹~Ðr   )F)r   Úfind_allÚ	decomposeÚreplace_withr   )Úcontent_htmlÚsoupÚtagr"   rV   rW   s        @r   Ú
clean_htmlr^   2   s�   ø€ áØÜ˜ }Ó5€Dð �}‰}˜g xÐ0Ó1ò ˆØ�‰�ðð �m‰m˜DÓ!ò ˆØ
�‰˜Õðõ%ñN ˜TÓ"€FØ�<‰<‹>Ðr   c                 óh  — ddd| t        t        «      dœ}	 t        j                  t        |t
        d¬«      }|j                  «        |j                  «       }|j                  d«      rt        d|› �«       g S |j                  d	g «      S # t        $ r}t        d
| › d|› �«       g cY d}~S d}~ww xY w)u   èŽ·å�–åˆ—è¡¨é¡µAPIæ•°æ�®Ú201988zchnlid=26312z-docorderpri,-docreltime)Ú	channelidÚclasssqlÚ	sortfieldÚpageÚperpageé   )ÚparamsÚheadersÚtimeoutÚerroru   APIè¿”å›žé”™è¯¯: Údatau   åˆ—è¡¨é¡µè¯·æ±‚å¤±è´¥ (page=z): N)
rL   ÚPER_PAGEÚrequestsÚgetÚLIST_APIÚHEADERSÚraise_for_statusÚjsonr   Ú	Exception)rd   rg   Úresprk   Úes        r   Ú
fetch_listrv   l   s«   € ð Ø"Ø/ØÜ”x“=ñ€Fð
Ü�|‰|œH¨V¼WÈbÔQˆØ×ÑÔØ�y‰y‹{ˆØ�8‰8�GÔÜÐ# D 6Ð*Ô+ØˆIØ�x‰x˜ Ó#Ð#øÜò ÜÐ*¨4¨&°°A°3Ð7Ô8Ø�	ûðús$   —A!B Á9B Â	B1ÂB,Â&B1Â,B1c                 ó>  — | j                  d«      s	t        | z   } 	 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 }	|j                  dd¬«      }d}|rt        |«      }||	|fS # t        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)u"   èŽ·å�–è¯¦æƒ…é¡µHTMLå¹¶æ��å�–æ­£æ–‡Úhttprf   )rh   ri   zutf-8u   è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥ ú: N)NNNr   ÚmetarK   ÚArticleTitle)ÚattrsÚcontentr/   TrB   r   Ú_r   r   ÚPubDateé
   r'   Ú
TRS_Editor)Úclass_)Ú
startswithÚBASE_URLrm   rn   rp   ÚencodingrT   rs   r   r   Úfindr   rN   Úsplitr   rL   )Úurlrt   Úhtmlru   r\   r   Ú
meta_titler/   Ú	title_tagÚpub_dateÚ	meta_dateÚcontent_divr[   s                r   Úfetch_detailr�   ‚   s¡  € à�>‰>˜&Ô!Ü˜‰nˆð Ü�|‰|˜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ˆð —)‘)˜E¨,�)Ó7€KØ€LÙÜ˜;Ó'ˆà�(˜LÐ(Ð(øôG ò  ÜÐ$ S E¨¨A¨3Ð/Ô0Üûð ús   œ/E8 Å8	FÆFÆFFc           	      óä  — g }d}t        d| dz   «      D �]V  }t        d|› d�«       t        |«      }|st        d|› d�«        ||fS t        dt        |«      › d�«       |D �]  }t	        |j                  d	d
«      «      }|j                  d|j                  dd
«      «      j                  «       }|j                  d«      r	t        |z   }|j                  dd
«      xs d
dd }	|r|j                  ||	|dœ«       Œšt        d|dd › d�«       t        |«      \  }
}}|
xs |}|xs |	}|rt        |«      nd
}|j                  ||||dœ«       |dz  }t        j                  d«       �Œ �ŒY ||fS )u   ä¸»çˆ¬å�–é€»è¾‘r   é   u
   çˆ¬å�–ç¬¬ u    é¡µ...u   ç¬¬ u    é¡µæ— æ•°æ�®ï¼Œå�œæ­¢u     èŽ·å�–åˆ° õ    æ�¡Údoctitler   Ú
chnldocurlÚ	docpuburlú/Ú
docreltimeNr€   )r   Údaterˆ   u
     è¯¦æƒ…: é(   z...)r   r˜   rˆ   r}   g      à?)Úranger   rv   Úlenr   rn   r   rƒ   r„   rM   r�   r^   ÚtimeÚsleep)ÚpagesÚdry_runÚ	all_itemsÚ	total_newrd   ÚitemsÚitemr   rˆ   r˜   Údetail_titleÚdetail_dater[   Úfinal_titleÚ
final_dateÚcleaned_contents                   r   Úcrawlr©   °   s±  € à€IØ€Iä�a˜ ™Ó#ó ,ˆÜˆj˜˜˜gÐ&Ô'Ü˜4Ó ˆÙÜ�$�t�fÐ2Ð3Ô4ØðR �iÐÐôO 	ˆlœ3˜u›:˜, dÐ+Ô,àó #	ˆDÜ §¡¨°RÓ 8Ó9ˆEØ—(‘(˜<¨¯©°+¸rÓ)BÓC×IÑIÓKˆCà�~‰~˜cÔ"Ü ‘n�Ø—H‘H˜\¨2Ó.Ò4°"°c°rÐ:ˆDáØ× Ñ Ø"Ø Øñ"ô ð
 ô �*˜U 3 B˜Z˜L¨Ð,Ô-Ü6BÀ3Ó6GÑ3ˆL˜+ |ð 'Ò/¨%ˆKØ$Ò,¨ˆJñ ;Gœj¨Ô6ÈBˆOà×ÑØ$Ø"ØØ*ñ	ô ð ˜‰NˆIä�J‰J�sŽOòG#	ð,ð\ �iÐÐr   c                 ó   — | 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«      }|	j                  d
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}t        d|dd › d|› �«       Y d}~�Œ‹d}~ww 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   r˜   rˆ   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; Trf   )Úcapture_outputrT   ri   r‘   u   å…¥åº“å¤±è´¥ é   ry   u   å…¥åº“å®Œæˆ�: r–   r’   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   Ú
subprocessrn   r   ÚrunÚ
returncoders   r›   )r¢   Úsource_nameÚ
group_nameÚindustryÚdb_pathr¯   Úinsertedr£   r   r˜   rˆ   r}   Ú	esc_titleÚesc_urlÚesc_contentÚ
esc_sourceÚ	esc_groupÚesc_industryÚesc_dateÚsqlÚcmdrV   ru   Úfts_sqls                           r   Úpush_to_searchdbrÁ   æ   sl  € ñ ÜÐ Ô!Øà#€GÛà€HØó )3ˆØ—‘˜ "Ó%ˆØ�x‰x˜ Ó#ˆØ�h‰h�u˜bÓ!ˆØ—(‘(˜9 bÓ)ˆá™CØð —M‘M # tÓ,ˆ	Ø—+‘+˜c 4Ó(ˆØ—o‘o c¨4Ó0ˆØ ×(Ñ(¨¨dÓ3ˆ
Ø×&Ñ& s¨DÓ1ˆ	Ø×'Ñ'¨¨TÓ2ˆØ—<‘<  TÓ*ˆðð ˆ|ð Øˆyð Øˆyð Øˆ{ð Øˆzð Øˆ{ð Øˆ}ð Øˆ{ð Øˆ~ð ðð 	ð ˜'Ð%@ÀÀÐ#FÐGˆð	3Ø—^‘^Ø D¨t¸Rð $ó ˆFð × Ñ  AÒ%Ø˜A‘�ùðO)3ôV ˆ.˜˜
 !¤C¨£J <¨tÐ4Ô5ô ˆÔð	ð )˜\ð *Jð	Jð ð%Ø�‰Ø˜ Ð)Ø d°Bð 	õ 	
øô ò 	3Ü�-  c r 
˜|¨2¨a¨SÐ1×2Ò2ûð	3ûô& ò %ÜÐ ˜sÐ#×$Ñ$ûð%ús0   Ä)FÅ(F, Æ	F)Æ
F$Æ$F)Æ,	GÆ5GÇGc            
      ó4  — dd l } | j                  d¬«      }|j                  dt        t        dt        › d�¬«       |j                  dd	d
¬«       |j                  «       }t        d|j                  › d|j                  › �«       t        |j                  |j                  ¬«      \  }}|j                  rXt        dt        |«      › d�«       |d d D ]7  }t        d|d   › d|d   d d › �«       t        d|d   › �«       t        «        Œ9 y t        d|› d�«       |d d D ]_  }t        d|d   › d|d   d d › �«       t        d|d   › �«       t        dt        |j                  dd«      «      › d�«       t        «        Œa t        |«       t        d «       y )!Nr   u+   èŽ†ç”°ç§€å±¿-é¡¹ç›®çŽ¯å¢ƒå½±å“�å®¡æ‰¹çˆ¬è™«)Údescriptionz--pagesu   çˆ¬å�–é¡µæ•° (é»˜è®¤: ú))ÚtypeÚdefaultÚhelpz	--dry-runÚ
store_trueu   ä»…é¢„è§ˆä¸�å®žé™…çˆ¬å�–è¯¦æƒ…)ÚactionrÇ   u$   ðŸš€ çˆ¬è™«å�¯åŠ¨: ptxy_hjsp, pages=z
, dry_run=)rž   rŸ   u   
=== é¢„è§ˆ: å…± u    æ�¡ ===r   z  [r˜   r   r   é2   z  rˆ   u   
=== çˆ¬å�–å®Œæˆ�: é   z  URL: u
     æ­£æ–‡: r}   r   z charsu   âœ… å…¨éƒ¨å®Œæˆ�)ÚargparseÚArgumentParserÚadd_argumentÚintÚDEFAULT_PAGESÚ
parse_argsr   rž   rŸ   r©   r›   r   rn   rÁ   )rÌ   ÚparserÚargsr¢   Útotalr£   s         r   ÚmainrÕ   0  sª  € ÛØ×$Ñ$Ð1^Ð$Ó_€FØ
×Ñ˜	¬´]Ø5´m°_ÀAÐFð ô Hà
×Ñ˜¨LØ=ð ô ?à×ÑÓ€DäÐ
.¨t¯z©z¨l¸*ÀTÇ\Á\ÀNÐSÔTä˜tŸz™z°4·<±<Ô@�L€Eˆ5à‡|‚|ÜÐ ¤ U£ ¨HÐ5Ô6Ø˜"˜1�Iò 	ˆDÜ�C˜˜V™�~ R¨¨W©°c°rÐ(:Ð';Ð<Ô=Ü�B�t˜E‘{�mÐ$Ô%Ü�Gð	ð 	äÐ
˜u˜g XÐ.Ô/Ø�b�q�	ò ˆÜ��D˜‘L�>  D¨¡M°#°2Ð$6Ð#7Ð8Ô9Ü�˜˜U™�}Ð%Ô&Ü�
œ3˜tŸx™x¨	°"Ó5Ó6Ð7°vÐ>Ô?Ü�ð	ô �UÔÜÐÕr   Ú__main__)r‘   )Ú	ptxy_hjspu	   ç¦�å»ºçœ�u   æ”¿åºœå…¬å‘Š)Ú__doc__ÚsysÚosrP   rr   rm   rœ   r   Úbs4r   r„   ro   rp   rÐ   rl   r   r   r^   rv   r�   r©   rÁ   rÕ   Ú__name__© r   r   ú<module>rÞ      s¦   ðñ÷ )× (× (Ý Ý à$€ØˆZ�Ð'€ðGà>Ø�Ð/Ð0ñ	€ð €Ø€ò'ò
ò7ótò,+)ð\  uó 3 ðl ALØ,óG%òTðB ˆzÒÙ…Fð r   