Ë
    G«£jE   ã                   ó~  — 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Zddlm	Z	 ddl
mZ ddlmZ ddlZddlZ
dZdZdZ ej$                  d	d
«      ZdZdZddiZej.                  e_        dd„Zd„ Zdd„Zd„ Zd„ Zdd„Zdd„Ze dk(  r5 e!ejD                  «      dkD  r e#ejD                  d   «      ndZ$ ee$«       yy)uù   åˆ©æ´¥åŽ¿äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤º çˆ¬è™«
CMS: å±±ä¸œçœ�ä¿¡æ�¯å…¬å¼€å¹³å�° (AJAXåŠ¨æ€�åŠ è½½åˆ—è¡¨)
åˆ—è¡¨: Playwright çˆ¬å�–5é¡µ, åˆ†é¡µ funGoPage('/module/xxgk/search.jsp', N)
è¯¦æƒ…: /art/YYYY/M/D/art_{columnId}_{articleId}.html, å®¹å™¨ div#zoom
é    N©ÚBeautifulSoup)Úrequest)Úurljoinu"   åˆ©æ´¥åŽ¿äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤ºzhttp://www.lijin.gov.cnzahttp://www.lijin.gov.cn/col/col9113/index.html?vc_xxgkarea=12370522K21505011R&number=L2601&jh=263Ú	SEARCH_DBz/root/search.dbg      ø?é   z
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36c                 ó  — t        j                  | t        ¬«      }	 t        j                  ||¬«      }|j	                  «       j                  dd¬«      S # t        $ r+}t        d| ›d|›�t        j                  ¬«       Y d }~y d }~ww xY w)	N)Úheaders©Útimeoutzutf-8Úignore)Úerrorsz
  [ERROR] z: )Úfile)
r   ÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚreqÚrespÚes        úcrawl_lijin.pyÚfetchr      si   € Ü
�/‰/˜#¤wÔ
/€CðÜ�‰˜s¨GÔ4ˆØ�y‰y‹{×!Ñ! '°(Ð!Ó;Ð;øÜò Ý¢C©Ð+´#·*±*Õ=Üûðús   �7A Á	B	Á!BÂB	c                 ó‚  — g }g }t        j                  d| t         j                  «      }|�r|j                  d«      }t        j                  d|t         j                  «      D ]‹  }t        j
                  dd|t         j                  ¬«      }t        j
                  dd|«      j                  «       }|j                  dd	«      }t        j
                  d
d	|«      }|sŒ{|j                  |«       Œ� t        j                  d|t         j                  «      D ]!  }	t        |	«      }
|
sŒ|j                  |
«       Œ# t        j                  d| t         j                  «      D ]3  \  }}t        ||«      }|j                  |j                  «       |dœ«       Œ5 dj                  |«      }t        j
                  dd|«      }||fS )u   æ��å�–æ­£æ–‡å’Œé™„ä»¶z*<div\s+id="zoom"[^>]*>(.*?)</div>\s*</div>é   z<p[^>]*>(.*?)</p>ú
<!--.*?-->Ú ©Úflagsú<[^>]+>ú&nbsp;ú ú\s+z<table[^>]*>.*?</table>zJ<a[^>]*href="([^"]+\.(?:docx?|pdf|xlsx?|rar|zip|wps|et))"[^>]*>([^<]+)</a>)Útitler   z

z\n{3,})ÚreÚsearchÚDOTALLÚgroupÚfindallÚsubÚstripÚreplaceÚappendÚhtml_table_to_htmlÚIr   Újoin)Úhtmlr   ÚpartsÚattachmentsÚmÚ	zoom_htmlÚp_htmlÚp_textÚtextÚt_htmlÚmdÚa_hrefÚa_textÚfullÚcontents                  r   Úparse_detailrD   %   sv  € à€EØ€Kô 	�	‰	Ð?ÀÄrÇyÁyÓQ€AÚØ—G‘G˜A“Jˆ	Ü—j‘jÐ!5°yÄ"Ç)Á)ÓLò 	#ˆFä—V‘V˜M¨2¨v¼R¿Y¹YÔGˆFÜ—6‘6˜* b¨&Ó1×7Ñ7Ó9ˆDØ—<‘< ¨#Ó.ˆDÜ—6‘6˜& # tÓ,ˆDÚØ—‘˜TÕ"ð	#ô —j‘jÐ!;¸YÌÏ	É	ÓRò 	!ˆFÜ# FÓ+ˆBÚØ—‘˜RÕ ð	!ô Ÿ*™*ØUØŒb�d‰dóò C‰ˆ�ô �s˜FÓ#ˆØ×Ñ V§\¡\£^¸DÑAÕBðCð �k‰k˜%Ó €Gä�f‰f�Y ¨Ó0€GØ�KÐÐó    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   zhtml.parserÚaÚhrefr"   )ÚhttpÚ
javascriptú#ÚimgÚsrc)rI   z//zdata:)	Úbs4r   ÚstrÚfind_allÚgetÚ
startswithÚurllibÚparser   )ÚtableÚbase_urlr   ÚtblrG   rH   rL   rM   s           r   r3   r3   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€OrE   c                 óð   — t        j                  dd| t         j                  ¬«      } t        j                  dd| «      } | j                  dd«      } t        j                  dd| «      } | j	                  «       S )u   åŽ»é™¤HTMLæ ‡ç­¾å’Œæ³¨é‡Šr!   r"   r#   r%   r'   r&   r(   )r*   r/   r,   r1   r0   )r=   s    r   Ú
clean_htmlrY   Y   sZ   € ä�6‰6�-  T´·±Ô;€DÜ�6‰6�*˜c 4Ó(€DØ�<‰<˜ #Ó&€DÜ�6‰6�&˜#˜tÓ$€DØ�:‰:‹<ÐrE   c                 ó†   — t        j                  d| t         j                  «      }|rt        |j	                  d«      «      S y )Nz&<div\s+class="biaoti"[^>]*>(.*?)</div>r    )r*   r+   r,   rY   r-   )r6   r9   s     r   Úget_detail_titler[   a   s2   € Ü
�	‰	Ð;¸TÄ2Ç9Á9ÓM€AÙÜ˜!Ÿ'™' !›*Ó%Ð%ØrE   c           	   ƒ   óì  K  — ddl m} g } |«       4 ƒd{  –—† }|j                  j                  d¬«      ƒ d{  –—† }|j	                  d¬«      ƒ d{  –—† }|j                  t        dd	¬
«      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  t        d| dz   «      D ]ð  }t        d|z  d¬«       |j                  d«      ƒ d{  –—† }|D ]7  }|d   sŒ	t        |d   «      dkD  sŒ|j                  |d   |d   |d   f«       Œ9 t        dt        |«      t        |«      fz  d¬«       || k  sŒ’|j                  d«      ƒ d{  –—† }	|	r6|	j                  «       ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  Œãt        dd¬«        n |j!                  «       ƒ d{  –—†  ddd«      ƒd{  –—†  |S 7 �Œ¬7 �Œ‹7 �Œt7 �ŒW7 �Œ=7 �Œ7 Œˆ7 Œp7 ŒU7 Œ.7 Œ # 1 ƒd{  –—†7  sw Y   |S xY w­w)u'   ç”¨ Playwright èŽ·å�–åˆ—è¡¨é¡µæ–‡ç« URLr   )Úasync_playwrightNT)Úheadlessz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36)Ú
user_agentiÈ¯  Úcommit)r   Ú
wait_untilé   r    u   [Playwright] ç¬¬%dé¡µ©ÚflushaV  () => {
                const links = document.querySelectorAll('a[href*="/art/"]');
                return Array.from(links).map(a => {
                    const parent = a.closest('li') || a.parentElement;
                    const dateEl = parent ? parent.querySelector('span') : null;
                    const date = dateEl ? dateEl.textContent.trim() : '';
                    const parts = a.href.split('/');
                    const dateMatch = a.href.match(/art\/(\d{4})\/(\d{1,2})\/(\d{1,2})/);
                    const pubDate = dateMatch ? dateMatch[1]+'-'+dateMatch[2].padStart(2,'0')+'-'+dateMatch[3].padStart(2,'0') : date;
                    return {
                        title: a.textContent.trim(),
                        url: a.href,
                        date: pubDate
                    };
                });
            }r)   r   r   Údateu     æœ¬é¡µ %d æ�¡, ç´¯è®¡ %d æ�¡u   a:has-text("ä¸‹ä¸€é¡µ")é   u     [å®Œæˆ�] æ— ä¸‹ä¸€é¡µæŒ‰é’®)Úplaywright.async_apir]   ÚchromiumÚlaunchÚnew_pageÚgotoÚLIST_URLÚasyncioÚsleepÚranger   ÚevaluateÚlenr2   Úquery_selectorÚclickÚclose)
Ú	max_pagesr]   Ú	all_itemsÚpwÚbrowserÚpageÚpgÚitemsÚitemÚnext_btns
             r   Úget_list_itemsr~   h   sþ  è ø€ å5à€IáÓ!÷ +ð + RØŸ™×*Ñ*°DÐ*Ó9×9ˆØ×%Ñ%ð  2OÐ%ó  P÷  PˆØ�i‰iœ¨%¸HˆiÓE×EÐEÜ�m‰m˜BÓ×Ðä˜˜9 q™=Ó)ò #	ˆBÜÐ)¨BÑ.°dÕ;ð Ÿ-™-ð )ó ÷ ˆEð" ò Q�Ø˜“=¤S¨¨g©Ó%7¸!Ó%;Ø×$Ñ$ d¨7¡m°T¸%±[À$ÀvÁ,Ð%OÕPðQô Ð2´c¸%³jÄ#ÀiÃ.Ð5QÑQÐY]Õ^ð �I‹~Ø!%×!4Ñ!4Ð5WÓ!X×X�ÙØ"Ÿ.™.Ó*×*Ð*Ü!Ÿ-™-¨Ó*×*Ñ*äÐ9ÀÕFÙðG#	ðJ �m‰m‹o×Ð÷W+÷ +ðZ Ðð[+ùØ9ùð PùØEùØùðùð2 Yøà*øØ*øð
 	øðW+ø÷ +÷ +ð +ðZ Ðüs÷   ‚G4–G—G4š GºG»GÁGÁGÁ4GÁ5GÂGÂ:GÃGÃGÃGÃ.AGÄ7GÅGÅGÅ%GÅ&GÆGÆ(GÆ+GÆ,GÆ0G4Æ;GÆ<G4ÇGÇGÇGÇGÇGÇGÇGÇGÇGÇG4ÇG1Ç$G'Ç%G1Ç,G4c                 ó*  — t        j                  t        d¬«      }|j                  «       }t	        j
                  t        | «      «      }|st        dd¬«       y t        dt        |«      z  d¬«       d}d}d}|D �]m  \  }}}	|j                  d|t        f«       |j                  «       }
|
r|
d	   rt        |
d	   «      d
kD  r|d	z  }ŒNt        j                  t        «       t        |«      }|st        d|d d z  d¬«       |d	z  }Œ�t!        ||«      \  }}t#        j$                  |d¬«      }t'        |«      }|r|}|r.|d d }t        d|d d t        |«      t        |«      fz  d¬«       n|}t        d|d d z  d¬«       |
r|j                  d|||||
d   f«       n|j                  dt        ||||	||f«       |j(                  dkD  s|
r	 |d	z  }n|d	z  }|j+                  «        �Œp |j-                  «        t        dt        |||fz  d¬«       y )Né<   r   u"   [FAIL] æœªèŽ·å�–åˆ°ä»»ä½•åˆ—è¡¨é¡¹Trc   u    
[æ€»å…±] èŽ·å�– %d æ�¡åˆ—è¡¨é¡¹r   z@SELECT id, content FROM gov_raw WHERE page_url=? AND site_name=?r    é
   u     [è·³è¿‡] è¯¦æƒ…é¡µ: %sé   F)Úensure_asciiéÈ   u#     [æ­£æ–‡] %s -> %d chars, %dé™„ä»¶u     [æ— æ–‡æœ¬] %szJUPDATE gov_raw SET content=?, title=?, attachments=?, summary=? WHERE id=?zªINSERT OR IGNORE INTO gov_raw
                   (site_name, page_url, title, content, publish_date, attachments, summary)
                   VALUES (?, ?, ?, ?, ?, ?, ?)u+   
[DONE] %s: æ–°å¢ž=%d, è·³è¿‡=%d, é”™è¯¯=%d)Úsqlite3ÚconnectÚDB_PATHÚcursorrm   Úrunr~   r   rq   ÚexecuteÚ	SITE_NAMEÚfetchoneÚtimern   ÚDELAYr   rD   ÚjsonÚdumpsr[   Úrowcountr`   rt   )ru   ÚconnÚcurr{   Ú	new_countÚ
skip_countÚerror_countr)   Ú
detail_urlre   ÚrowÚdetail_htmlrC   r8   Úattachments_jsonÚdetail_titleÚsummarys                    r   Úcrawlr�   ž   s2  € Ü�?‰?œ7¨BÔ/€DØ
�+‰+‹-€Cô �K‰Kœ yÓ1Ó2€EÙÜÐ2¸$Õ?Øä	Ð
-´°E³
Ñ
:À$ÕGà€IØ€JØ€Kà#(ó 2Ñˆˆz˜4Ø�‰ÐVØ¤	Ð*ô	,à�l‰l‹nˆá�3�q’6œc # a¡&›k¨BÒ.Ø˜!‰OˆJØä�
‰
”5Ôä˜JÓ'ˆÙÜÐ,¨u°S°b¨zÑ9ÀÕFØ˜1ÑˆKØä+¨K¸ÓDÑˆ�ÜŸ:™: kÀÔFÐä'¨Ó4ˆÙØ ˆEáØ˜d˜s�mˆGÜÐ7Ø˜˜"�:œs 7›|¬S°Ó-=Ð>ñ?ØFJöLð ˆGÜÐ$ u¨S¨b zÑ1¸Õ>áØ�K‰KØ\Ø˜%Ð!1°7¸CÀ¹FÐCõð
 �K‰Kð3ô ˜J¨¨w¸Ð>NÐPWÐXô	ð �<‰<˜!Ò¡¨Ø˜‰N‰Ià˜!‰OˆJà�‰Žðe2ðh 	‡J�J„LÜ	Ð
8Ü�i ¨[Ð
9ñ:ØAEöGrE   Ú__main__r    )r‚   )r"   )r   )%Ú__doc__Úosr*   r   r�   r�   rm   r…   rN   r   rS   r   Úurllib.parser   Ússlr‹   ÚBASE_URLrl   Úgetenvr‡   rŽ   Ú	MAX_PAGESr   Ú_create_unverified_contextÚ_create_default_https_contextr   rD   r3   rY   r[   r~   r�   Ú__name__rq   ÚargvÚintÚmp© rE   r   ú<module>r­      sÓ   ðñ÷
 1× 0× 0Ó 0Ý Ý Ý  Û 
Û à0€	Ø$€Øn€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø€Ø€	ð Ðoð€ð %(×$BÑ$B€Ô !óò" óJòòó3ólFGðR ˆzÒÙ  §¡›]¨QÒ.‰ˆS�X‰X�a‰[Ô	°A€BÙ	ˆ"…Ið rE   