Ë
    À�ejš  ã                   ó¨   — 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iZdad„ Zefd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u�  
crawl_xiangfuqu_tzgg.py - å¼€å°�ç¥¥ç¬¦åŒº-é€šçŸ¥å…¬å‘Š
CMS: UCAP (JSæ¸²æŸ“), éœ€Playwrightæ¸²æŸ“åˆ—è¡¨
åˆ—è¡¨: /kfsxfqwz/tzggx/pc/list.html (JSæ¸²æŸ“, 15æ�¡/é¡µ, 32é¡µå…±~475æ�¡)
      ç¿»é¡µ: a.num[2][3] + a[data-page]æœ«é¡µ
è¯¦æƒ…: /kfsxfqwz/tzggx/pc/content/content_{id}.html (å�¯ç›´æŽ¥HTTPè®¿é—®)
æ ‡é¢˜: <meta ArticleTitle>
æ—¥æœŸ: <meta PubDate>
æ­£æ–‡: div.article-content > p
é    N)ÚBeautifulSoup)Úsync_playwrightz/root/search.dbzhttps://www.xiangfuqu.gov.cnu   ç¥¥ç¬¦åŒº-é€šçŸ¥å…¬å‘Šu   æ²³å�—u   çŽ¯å¢ƒå…¬ç¤ºé    z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 ó  — t         €7t        j                  «       a t         j                  j	                  t
        «       	 t         j                  | d¬«      }d|_        |j                  S # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Né<   ©Útimeoutzutf-8zERR:)ÚSESSIONÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚencodingÚtextÚ	ExceptionÚprint)ÚurlÚrÚes      ú)/root/gov_crawler/crawl_xiangfuqu_tzgg.pyr   r   $   so   € ä€Ü×"Ñ"Ó$ˆÜ�‰×ÑœwÔ'ðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�v‰vˆøÜò Ü��Q�CˆjÔÜûðús   ¿)A) Á)	B
Á2BÂB
c           
      óv  — g }t        «       5 }|j                  j                  d¬«      }|j                  «       }|j	                  t
        › d�dd¬«       t        d| dz   «      D ]…  }|dkD  r'	 |j                  d|› d	�«       |j                  d
«       |j                  dd«      }t        d|› dt        |«      › d�d¬«       |D ]#  }d|d   v sŒ|j                  |d   |d   f«       Œ% Œ‡ |j                  «        ddd«       |S # t        $ r}t        d|› d|› �«       Y d}~ Œ:d}~ww xY w# 1 sw Y   |S xY w)z?Use Playwright to render JS list and get all items across pagesT)Úheadlessz/kfsxfqwz/tzggx/pc/list.htmlÚnetworkidlei0u  )Ú
wait_untilr	   é   zˆlet links = Array.from(document.querySelectorAll("a[data-page]"));let btn = links.find(el => parseInt(el.getAttribute('data-page')) === z);if (btn) btn.click();iÐ  u     æ— æ³•ç¿»åˆ°ç¬¬u   é¡µ: Nza[href*="content_"]zEels => els.map(el => ({title: el.textContent.trim(), href: el.href}))u     ç¬¬õ   æ�¡©Úflushz/kfsxfqwz/tzggx/pc/content/ÚhrefÚtitle)r   ÚchromiumÚlaunchÚnew_pageÚgotoÚBASE_URLÚrangeÚevaluateÚwait_for_timeoutr   r   Úeval_on_selector_allÚlenÚappendÚclose)	Ú	max_pagesÚ	all_itemsÚpwÚbrowserÚpageÚpgr   ÚitemsÚitems	            r   Úfetch_all_list_itemsr7   2   sv  € à€IÜ	Ó	ð ˜bØ—+‘+×$Ñ$¨dÐ$Ó3ˆØ×ÑÓ!ˆØ�	‰	”X�JÐ:Ð;Ø*°Eð 	ô 	;ô ˜˜9 q™=Ó)ò 	DˆBØ�AŠvð	Ø—M‘MðaØacÐ`dð e0ð1ôð
 ×)Ñ)¨$Ô/ð
 ×-Ñ-Ø'ØWóˆEô �E˜"˜˜U¤3 u£: ,¨cÐ2¸$Õ?Øò D�Ø0°D¸±LÒ@Ø×$Ñ$ d¨6¡l°D¸±MÐ%BÕCñDð%	Dð, 	�‰Œ÷9ð: Ðøô !ò ÜÐ-¨b¨T°°q°cÐ:Ô;Ýûðú÷ð: Ðús<   �AD.Á-&DÂ;D.Ã-D.Ä	D+ÄD&Ä D.Ä&D+Ä+D.Ä.D8c                 óò  — t        | d«      }d}|j                  dddi«      }|r |j                  dd«      j                  «       }d}|j                  dddi«      }|r;|j                  dd«      }t	        j
                  d|«      }|r|j                  d	«      }d}|j                  d
d¬«      }	|	r¢g }
|	j                  d«      D ](  }|j                  d¬«      }|sŒ|
j                  |«       Œ* |	j                  d«      D ]  }|
j                  t        |«      «       Œ |
rdj                  |
«      }n |	j                  d¬«      j                  «       }|rt	        j                  dd|«      }|r|d d nd}||||fS )Nzhtml.parserÚ ÚmetaÚnameÚArticleTitleÚcontentÚPubDatez(\d{4}-\d{2}-\d{2})r   Údivzarticle-content)Úclass_ÚpT)ÚstripÚtablez

ú
)Ú	separatorz&nbsp;éÈ   )r   Úfindr   rB   ÚreÚsearchÚgroupÚfind_allÚget_textr-   ÚstrÚjoinÚsub)Úhtmlr   Úsoupr"   Ú
meta_titleÚdate_strÚpubdate_metar=   ÚmÚacÚpartsrA   ÚtxtÚtblÚsummarys                  r   Úextract_detailr[   U   sx  € Ü˜˜}Ó-€Dð €EØ—‘˜6 F¨NÐ#;Ó<€JÙØ—‘˜y¨"Ó-×3Ñ3Ó5ˆð €HØ—9‘9˜V f¨iÐ%8Ó9€LÙØ×"Ñ" 9¨bÓ1ˆÜ�I‰IÐ,¨gÓ6ˆÙØ—w‘w˜q“zˆHð €GØ	�‰�5Ð!2ˆÓ	3€BÙ	ØˆØ—‘˜SÓ!ò 	"ˆAØ—*‘* 4�*Ó(ˆCÚØ—‘˜SÕ!ð	"ð —;‘;˜wÓ'ò 	#ˆCØ�L‰Lœ˜S›Õ"ð	#áØ—k‘k %Ó(‰Gà—k‘k¨D�kÓ1×7Ñ7Ó9ˆGáÜ—&‘&˜ B¨Ó0ˆá&ˆg�d�s‰m¨B€GØ�(˜G WÐ,Ð,ó    c                 óø  — dd l }|j                  t        d¬«      }|j                  «       }d}g }| D ]†  \  }}}}	}
	 |j	                  d|
f«       |j                  «       rŒ.|j	                  d|
|t        |||	|
dt        t        df«       |j                  }|r|j                  ||t        |	xs df«       |d	z  }Œˆ |j                  «        |rK|D ]  \  }}}}		 |j	                  d||||	f«       Œ  |j                  «        t        dt        |«      › d�«       |j                  «        |S # t        $ r}t        d
|d d › d|› �«       Y d }~�Œd }~ww xY w# t        $ r}t        d|› d|› �«       Y d }~Œ¥d }~ww xY w)Nr   é
   r   z)SELECT id FROM gov_raw WHERE page_url = ?zíINSERT INTO gov_raw 
                   (page_url, title, site_name, publish_date, content, summary,
                    source_url, category, industry, group_name, script_name)
                   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)u   é€šçŸ¥å…¬å‘Šzcrawl_xiangfuqu_tzgg.pyr9   r   z  [DB ERROR] é   z: zVINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)z  [FTS ERROR] id=u     FTSå�Œæ­¥: r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚfetchoneÚ	SITE_NAMEÚINDUSTRYÚGROUPÚ	lastrowidr-   r   r   Úcommitr,   r.   )Ú
items_datar`   ÚconnÚcÚinsertedÚ	fts_batchr"   rS   r=   rZ   Úpage_urlÚnew_idr   ÚridÚsites                  r   Ú
save_to_dbrt   ~   s›  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ€HØ€IØ7Aò 5Ñ3ˆˆx˜ '¨8ð	5Ø�I‰IÐAÀHÀ;ÔOØ�z‰zŒ|ØØ�I‰Ið?ð ˜5¤)¨X°wÀØ˜>¬8´UÐ<UðWôð —[‘[ˆFÙØ× Ñ  &¨%´¸GºMÀrÐ!JÔKØ˜‰M‰Hð!5ð& 	‡K�K„MÙØ)2ò 	6Ñ%ˆC�˜˜gð6Ø—	‘	ØlØ˜%  wÐ/õð	6ð 	�‰ŒÜ�œc )›nÐ-¨SÐ1Ô2Ø‡J�J„LØ€Oøô ò 	5Ü�M %¨¨ * ¨R°¨sÐ3×4Ò4ûð	5ûô ò 6ÜÐ)¨#¨¨b°°Ð4×5Ñ5ûð6ús6   ¼#D*Á AD*ÃEÄ*	EÄ3EÅEÅ	E9ÅE4Å4E9c                  ó  — dd l } | j                  t        › d�¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j                  «       }|j                  rt        n|j                  }t        dt        j                  d«      › d�d¬«       t        |«      }|st        d«       y t        dt        |«      › d�«       d}g }|D ]W  \  }}t        |«      }	|	sŒt        |	|«      \  }
}}}|j!                  |
xs ||xs d|||f«       t        j"                  d«       ŒY t%        |«      }||z  }t        d|› dt        |«      › d�«       t        d«       t        d|› d�«       t        dt        › �«       y )Nr   u   çˆ¬è™«)Údescriptionz--pagesr   u   çˆ¬å�–é¡µæ•°(å…±32é¡µ))ÚtypeÚdefaultÚhelpz--fullÚ
store_trueu   å…¨é‡�çˆ¬å�–(32é¡µ))Úactionry   ú[z%H:%M:%Su   ] Playwrightæ¸²æŸ“åˆ—è¡¨...Tr   u	   æ— æ•°æ�®u   
å…±èŽ·å�– u
    æ�¡é“¾æŽ¥r9   g333333Ó?u   å…¥åº“ú/r   u   
===== å®Œæˆ� =====u   æ–°å¢žå…¥åº“: u    æ�¡u   ç«™ç‚¹: )ÚargparseÚArgumentParserrf   Úadd_argumentÚintÚ
parse_argsÚfullÚ	MAX_PAGESÚpagesr   ÚtimeÚstrftimer7   r,   r   r[   r-   Úsleeprt   )r~   ÚparserÚargsr/   r0   Ú	total_newÚbatchr!   r"   Údetail_htmlÚdtÚddr=   rZ   Úsaveds                  r   Úmainr‘   §   s}  € ÛØ×$Ñ$´I°;¸fÐ1EÐ$ÓF€FØ
×Ñ˜	¬°QÐ=UÐÔVØ
×Ñ˜¨Ð<QÐÔRØ×ÑÓ€Dà!ŸYšY•	¨D¯J©J€IÜ	ˆAŒd�m‰m˜JÓ'Ð(Ð(CÐ
DÈDÕQÜ$ YÓ/€IÙÜˆkÔØä	ˆLœ˜Y›Ð(¨
Ð
3Ô4Ø€IØ€Eà ò ‰ˆˆeÜ˜$“iˆÙØÜ#1°+¸tÓ#DÑ ˆˆB�˜Ø�‰�b’k˜E 2¢8¨¨W°g¸tÐDÔEÜ�
‰
�3�ðô �uÓ€EØ�Ñ€IÜ	ˆF�5�'˜œ3˜u›:˜, cÐ
*Ô+ä	Ð Ô"Ü	ˆN˜9˜+ TÐ
*Ô+Ü	ˆH”Y�KÐ
 Õ!r\   Ú__main__)Ú__doc__r   rH   ÚsysÚosr†   Úbs4r   Úplaywright.sync_apir   rb   r'   rf   rh   rg   r„   r   r
   r   r7   r[   rt   r‘   Ú__name__© r\   r   ú<module>rš      s‹   ðñ	ó Û 	Û 
Û 	Û Ý Ý /à
€Ø)€Ø$€	Ø€Ø€Ø€	ð ÐPð€ð €òð $-ó  òF&-òR&òR "ðF ˆzÒÙ…Fð r\   