Ë
    $hyj§+  ã                   óH  — 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	 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZedz   ZdZdZd	Zd
Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÖ  
æƒ å®‰åŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š (tzgg) çˆ¬è™«
åˆ—è¡¨: https://www.huian.gov.cn/zwgk/xwzx/gggs/tzgg/
  avalon.js å‰�ç«¯æ¸²æŸ“ (terton.dynamicAndStaticData), é�™æ€� HTML å�« JS æ•°ç»„(æ¯�é¡µ15æ�¡)
  ç¿»é¡µ: ç‚¹é¡µç �æŒ‰é’® (ms-controller=list_pagebar), recordCount=1421 çº¦95é¡µ
è¯¦æƒ…: /zwgk/xwzx/gggs/tzgg/YYYYMM/tYYYYMMDD_ID.htm
  æ ‡é¢˜: é¡µé�¢ <title> æˆ– h1
  æ­£æ–‡: div.TRS_UEDITOR æˆ–ç±»ä¼¼å®¹å™¨
ç”¨æ³•: python3 crawl_huian_gsgg.py [--pages=N] [--limit=N]
é    N)Úurljoin)Úpush_to_searchdbzhttps://www.huian.gov.cnz/zwgk/xwzx/gggs/tzgg/u"   æƒ å®‰åŽ¿äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šé_   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36c                  ó   — d\  } }t         j                  dd  D ]`  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  d«      sŒDt        |j	                  d«      d   «      }Œb | |fS )N)r   r   é   z--pages=ú=z--limit=)ÚsysÚargvÚ
startswithÚintÚsplit)ÚpagesÚlimitÚas      ú%/root/gov_crawler/crawl_huian_gsgg.pyÚ
parse_argsr      st   € Ø�L€Eˆ5Ü�X‰X�a�bˆ\ò )ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�\‰\˜*Õ%Ü˜Ÿ™ › Q™Ó(‰Eð	)ð
 �%ˆ<Ðó    c                 óÞ   — t        j                  | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )NÚ z[\u200b\u200e\u200f\ufeff\xa0]ú\s+ú u   ^[â€¢Â·\-â€”]\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    r   Úclean_titler   &   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c                 óÈ   — | j                  d«      }|D ]K  }|d   }|j                  d«      rt        |dd z   }n!|j                  d«      st        t        |«      }||d<   ŒM |S )u6   ä»Žæ¸²æŸ“å�Žé¡µé�¢æ��å�– doctitle/docpuburl/docreltimeu\  () => {
        const out = [];
        // avalon æ¸²æŸ“å�Žåˆ—è¡¨: é€šå¸¸ ul li a
        const items = document.querySelectorAll('ul li a[href*=".htm"], .list_base a[href*=".htm"]');
        const seen = new Set();
        for (const a of items) {
            const href = a.getAttribute('href') || '';
            if (!href.includes('.htm') || seen.has(href)) continue;
            seen.add(href);
            let date = '';
            const li = a.closest('li');
            if (li) {
                const m = li.textContent.match(/(\d{4})[-\/](\d{1,2})[-\/](\d{1,2})/);
                if (m) date = m[1] + '-' + m[2].padStart(2,'0') + '-' + m[3].padStart(2,'0');
            }
            const title = (a.textContent || '').trim();
            if (title.length >= 4) out.push({href: href, title: title, date: date});
        }
        return out;
    }Úhrefú./é   NÚhttp)Úevaluater   ÚLIST_URLr   )ÚpageÚitemsÚitr    s       r   Úextract_itemsr)   .   ss   € à�M‰Mð 	ó 
€Eð* ò ˆØ�&‰zˆØ�?‰?˜4Ô Ü˜d 1 2˜hÑ&‰DØ—‘ Ô(Üœ8 TÓ*ˆDØˆˆ6Š
ðð €Lr   c                 ó&   — | j                  d|«      S )u   ç‚¹å‡»é¡µç �æŒ‰é’®u)  (pg) => {
        // avalon pagebar é¡µç �é“¾æŽ¥
        const links = document.querySelectorAll('.page_base a, .pagebar a, .pgStyle a, a[href="javascript:void(0)"], a[href="#"]');
        for (const a of links) {
            const t = (a.textContent || '').trim();
            if (t === String(pg)) { a.click(); return true; }
        }
        // ä¸‹ä¸€é¡µ
        const next = document.querySelector('.page_base .next a, .pagebar .next a, a[title="ä¸‹ä¸€é¡µ"], .nextpage');
        if (next) { next.click(); return true; }
        return false;
    })r$   )r&   Úpgs     r   Ú
click_pager,   O   s   € à�=‰=ð 	ð óð r   c                 ó–  ‡— 	 | j                  ‰dd¬«       | j                  d«       | j                  «       }d}t        j                  d|«      }|rt        |j                  d«      «      }|s2t        j                  d|«      }|rt        |j                  d«      «      }|sDt        j                  d	|«      }|r,t        |j                  d«      j                  d
«      d   «      }d}t        j                  d|«      }|r"|j                  d«      j                  «       dd }|s_t        j                  d|«      }|rGd|j                  d«      t        |j                  d«      «      t        |j                  d«      «      fz  }d}dD �]€  }t        j                  dt        j                  |«      z   dz   |«      }|sŒ6|j                  «       }|j                  d|«      dz   }	d}
|	}|t        |«      k  rE|||dz    dk(  r|
dz  }
|dz  }n |||dz    dk(  r|
dz  }
|dz  }|
dk(  rn|dz  }|t        |«      k  rŒE||	|dz
   }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dˆfd„|«      }t        j                  d ˆfd!„|«      }t        j                  d"d|«      }t        j                  d#d|«      }|j                  «       }t        |«      d$k\  s�Œ� n |rt        |«      d$k  rd}|||fS # t        $ r}t!        d%‰› d&|› �d'¬(«       Y d}~y)d}~ww xY w)*u#   è¯¦æƒ…é¡µ: h1/æ ‡é¢˜ + æ­£æ–‡å®¹å™¨Úcommité0u  ©Ú
wait_untilÚtimeoutiÜ  r   z+<meta name="ArticleTitle" content="([^"]*)"r   z<h1[^>]*>([^<]+)</h1>z<title>([^<]+)</title>Ú_r   z&<meta name="PubDate" content="([^"]*)"Né
   z(\d{4})-(\d{1,2})-(\d{1,2})z%s-%02d-%02dr"   é   )Ú
TRS_EditorÚTRS_UEDITORÚzoomÚcontentzarticle-contentÚzoomconÚwzconÚarticle_content_01z#(?:class|id)\s*=\s*["\']?[^"\'>]*\bz\b[^"\'>]*["\']?ú>é   z<divé   z</div>z<script[\s\S]*?</script>z</?body[^>]*>z<style[\s\S]*?</style>zhref="([^"]*)"c                 ó¦   •— d| j                  d«      j                  d«      st        ‰| j                  d«      «      z  S | j                  d«      z  S )Nz	href="%s"r   )r#   ú#Ú
javascript©Úgroupr   r   ©ÚmÚurls    €r   ú<lambda>zfetch_detail.<locals>.<lambda>“   sq   ø€ °kÐef×elÑelÐmnÓeo×ezÑezð  |Wô  fXÄWÈSÐRS×RYÑRYÐZ[ÓR\ÓE]ñ  7i€ ð  ^_÷  ^eñ  ^eð  fgó  ^hñ  7i€ r   zsrc="([^"]*)"c                 ó¦   •— d| j                  d«      j                  d«      st        ‰| j                  d«      «      z  S | j                  d«      z  S )Nzsrc="%s"r   )r#   zdata:rB   rC   rE   s    €r   rH   zfetch_detail.<locals>.<lambda>”   sq   ø€ °ZÐcd×cjÑcjÐklÓcm×cxÑcxð  zYô  dZÄ7È3ÐPQ×PWÑPWÐXYÓPZÓC[ñ  6k€ ð  `a÷  `gñ  `gð  hió  `jñ  6k€ r   z\sstyle="[^"]*"zM<span[^>]*>|</span>|<strong[^>]*>|</strong>|<b[^>]*>|</b>|<font[^>]*>|</font>é   z    [ERR] detail ú: T©Úflush)r   r   r   )ÚgotoÚwait_for_timeoutr9   r   Úsearchr   rD   r   r   r   ÚescapeÚstartÚfindÚlenr   Ú	ExceptionÚprint)r&   rG   ÚhtmlÚtitlerF   Úpub_dateÚbodyÚcidÚirR   ÚdepthÚjÚrawÚes    `            r   Úfetch_detailra   _   s3  ø€ ð>Ø�	‰	�# (°Eˆ	Ô:Ø×Ñ˜dÔ#Ø�|‰|‹~ˆØˆÜ�I‰IÐDÀdÓKˆÙÜ §¡¨£
Ó+ˆEÙÜ—	‘	Ð2°DÓ9ˆAÙÜ# A§G¡G¨A£JÓ/�ÙÜ—	‘	Ð3°TÓ:ˆAÙÜ# A§G¡G¨A£J×$4Ñ$4°SÓ$9¸!Ñ$<Ó=�ØˆÜ�I‰IÐ?ÀÓFˆÙØ—w‘w˜q“z×'Ñ'Ó)¨#¨2Ð.ˆHÙÜ—	‘	Ð8¸$Ó?ˆAÙØ)¨Q¯W©W°Q«Z¼¸Q¿W¹WÀQ»Z»Ì#ÈaÏgÉgÐVWËjË/Ð,ZÑZ�àˆð Aó 	ˆCä—	‘	Ð@Ä2Ç9Á9ÈSÃ>ÑQÐTgÑgÐimÓnˆAÙØØ—‘“	ˆAØ—I‘I˜c 1Ó%¨Ñ)ˆEØˆEØˆAØ”c˜$“i’-Ø˜˜!˜A™#�; &Ò(Ø˜Q‘J�EØ˜‘F‘AØ˜!˜A˜a™C�[ HÒ,Ø˜Q‘J�EØ˜‘F�AØ ’zØà˜‘F�Að ”c˜$“i“-ð �u˜Q˜q™S�/ˆCÜ—&‘&Ð4°b¸#Ó>ˆCÜ—&‘&Ð)¨2¨sÓ3ˆCÜ—&‘&Ð2°B¸Ó<ˆCÜ—&‘&Ð*ó  -ið  knó  oˆCÜ—&‘&Ð)ó  ,kð  mpó  qˆCÜ—&‘&Ð+¨R°Ó5ˆCÜ—&‘&ÐiÐkmÐorÓsˆCØ—9‘9“;ˆDÜ�4‹y˜BŒÙð=	ñ> ”s˜4“y 2’~ØˆDØ�h Ð$Ð$øÜò ÜÐ! #  b¨¨Ð,°DÕ9Üûðús%   ƒH5L" È9CL" ÌL" Ì"	MÌ+MÍMc                  óv
  — t        «       \  } }| st        } t        dt        › d| › �d¬«       ddlm} g }t        «       } |«       5 }|j                  j                  dddg¬	«      }|j                  t        d
¬«      }|j                  «       }|j                  dd„ «       |j                  t        dd¬«       |j                  d«       t!        d| dz   «      D �]v  }	|	dkD  rld}
t!        d«      D ]5  }	 t#        ||	«      }
|
r n$|j%                  d«       |j                  d«       Œ7 |
st        d|	› d�d¬«        �n|j                  d«       t)        |«      }d}|D ]r  }|d   }|j+                  d«      rt        |dd  z   }n!|j+                  d «      st-        t.        |«      }||v rŒL|j1                  |«       |j3                  |«       |dz  }Œt t        d!|	› d"t5        |«      › d#|› d$t5        |«      › �d¬«       |j%                  d%«      }|s|	dkD  rt        d&|	› �d¬«        n,t5        |«      d'k\  s�Œ^t        d(t5        |«      › �d¬«        n |j7                  «        d d d «       t        d)t5        |«      › d*�d¬«       |rt5        |«      |kD  r|d | } |«       5 }|j                  j                  dddg¬	«      }|j                  t        d
¬«      }|j                  «       }|j                  dd+„ «       g }t9        |«      D �]j  \  }}t;        ||d   «      \  }}}|xs |d,   }|xs |j=                  d-d.«      }|rt?        j@                  d/d0|«      n|}t?        j@                  d1d0|«      jC                  «       d d2 }g }|rjt?        jD                  d3|t>        jF                  «      D ]B  }|j3                  |jI                  d«      jC                  «       |jI                  d«      d4œ«       ŒD |j3                  t        |d   |d   ||||tJ        |rtM        jN                  |d¬5«      nd.d6œ	«       |dz   d7z  dk(  rt        d8|dz   › d9t5        |«      › �d¬«       tQ        jR                  d:«       �Œm |j7                  «        d d d «       t        d;t5        «      › d<�d¬«       tU        |t        ¬=«       tW        d>„ |D «       «      }t        d?t5        |«      › d@|› �d¬«       y # t&        $ r/}t        d|	› d|› �d¬«       |j                  d«       Y d }~�Œ,d }~ww xY w# 1 sw Y   �ŒÂxY w# 1 sw Y   Œ«xY w)ANz[Huian] SITE=z max_pages=TrL   r   )Úsync_playwrightz---disable-blink-features=AutomationControlledz--no-sandbox)ÚheadlessÚargszzh-CN)Ú
user_agentÚlocalez**/*c                 ór   — | j                   j                  dv r| j                  «       S | j                  «       S ©N)ÚimageÚmediaÚfontÚ
stylesheet©ÚrequestÚresource_typeÚabortÚ	continue_©Úroutes    r   rH   zmain.<locals>.<lambda>°   óC   € ¸%¿-¹-×:UÑ:Uð  ZBñ  ;B¨¯©«€ ð  HM÷  HWñ  HWó  HY€ r   r.   r/   r0   i   r   Fr5   z.window.scrollTo(0, document.body.scrollHeight)i   z    [WARN] page z click err iè  z  [STOP] page z no click targetiÐ  r    r!   r"   r#   z  Page rK   u   æ�¡(æ–°u   ) ç´¯è®¡u  () => {
                const n = document.querySelector('.page_base .next a, .pagebar .next a, a[title="ä¸‹ä¸€é¡µ"]');
                if (!n) return false;
                return !(n.className.includes('disabled') || n.style.display === 'none');
            }z  [END] page i�  z  [CUTOFF] reached u   åˆ—è¡¨å®Œæˆ�: u    æ�¡, æŠ“è¯¦æƒ…...c                 ór   — | j                   j                  dv r| j                  «       S | j                  «       S ri   rn   rs   s    r   rH   zmain.<locals>.<lambda>í   ru   r   rX   Údater   z<[^>]+>r   r   i,  zQ<a[^>]*href="([^"]*\.(?:pdf|doc|docx|xls|xlsx|zip|rar|ofd|wps))"[^>]*>([^<]*)</a>)ÚnamerG   )Úensure_ascii)	Ú	site_nameÚ
source_urlrG   rX   rY   r9   ÚsummaryÚcategoryÚattachmentsr4   z	  detail ú/g333333Ó?z
  pushing z items to searchdb...)Úbatch_labelc              3   óh   K  — | ]*  }|j                  d «      xs dj                  «       rŒ'd–— Œ, y­w)r9   r   r   N)Úgetr   )Ú.0Úrs     r   ú	<genexpr>zmain.<locals>.<genexpr>  s)   è ø€ ÒK�a¨1¯5©5°Ó+;Ò+A¸r×*HÑ*HÕ*J”ÑKùs   ‚(2«2z  DONE. pushed=u    ç©ºæ­£æ–‡=),r   Ú	MAX_PAGESrV   Ú	SITE_NAMEÚplaywright.sync_apirc   ÚsetÚchromiumÚlaunchÚnew_contextÚUAÚnew_pagert   rN   r%   rO   Úranger,   r$   rU   r)   r   r   ÚBASE_URLÚaddÚappendrT   ÚcloseÚ	enumeratera   r‚   r   r   r   ÚfinditerÚIrD   ÚCATEGORYÚjsonÚdumpsÚtimeÚsleepr   Úsum)Ú	max_pagesr   rc   Ú	all_itemsÚseenÚpÚbrowserÚctxr&   r+   ÚclickedÚattemptr`   r'   Ú	new_countr(   r    Úhas_nextÚresultsr\   Úd_titleÚd_daterZ   rX   rY   r|   ÚattsrF   Úemptys                                r   Úmainr¬   ¢   s3  € Ü!“|Ñ€IˆuÙÜˆ	Ü	ˆMœ)˜ K°	¨{Ð
;À4ÕHå3Ø€IÜ‹5€Dá	Ó	ð 7˜aØ—*‘*×#Ñ#¨TÐ9hÐjxÐ8yÐ#ÓzˆØ×!Ñ!¬R¸Ð!Ó@ˆØ�|‰|‹~ˆØ�
‰
�6ñ  Yô  	Zà�	‰	”( x¸ˆ	Ô?Ø×Ñ˜dÔ#ä˜˜9 q™=Ó)ó ,	ˆBØ�AŠvØ�Ü$ Q›xò 	4�Gð4Ü",¨T°2Ó"6˜Ù"Ù!ØŸ™Ð&VÔWØ×-Ñ-¨cÕ2ð	4ñ Ü˜N¨2¨$Ð.>Ð?ÀtÕLÚØ×%Ñ% dÔ+ä! $Ó'ˆEØˆIØò 
�Ø˜&‘z�Ø—?‘? 4Ô(Ü# d¨1¨2 hÑ.‘DØŸ™¨Ô0Ü"¤8¨TÓ2�DØ˜4‘<ØØ—‘˜”Ø× Ñ  Ô$Ø˜Q‘‘	ð
ô �G˜B˜4˜r¤# e£* ¨W°Y°K¸xÌÈIËÐGWÐXÐ`dÕeð —}‘}ð &ó ˆHñ
   Q¢Ü˜ b TÐ*°$Õ7ÙÜ�9‹~ Ô%ÜÐ+¬C°	«NÐ+;Ð<ÀDÕIÙðY,	ð\ 	�‰Œ÷o7ôr 
ˆNœ3˜y›>Ð*Ð*<Ð
=ÀTÕJÙ”�Y“ %Ò'Ø˜f˜uÐ%ˆ	á	Ó	ð ˜aØ—*‘*×#Ñ#¨TÐ9hÐjxÐ8yÐ#ÓzˆØ×!Ñ!¬R¸Ð!Ó@ˆØ�|‰|‹~ˆØ�
‰
�6ñ  Yô  	ZØˆÜ˜yÓ)ó 	‰EˆAˆrÜ$0°°r¸&±zÓ$BÑ!ˆG�V˜TØÒ*˜r '™{ˆEØÒ3 §¡¨°Ó!3ˆHÙ7;”b—f‘f˜Z¨¨dÔ3ÀˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØˆDÙÜŸ™Ð%yÐ{ô  BD÷  BFñ  BFó  Gò Q�AØ—K‘K¨¯©°«×)9Ñ)9Ó);ÀAÇGÁGÈAÃJÑ OÕPðQà�N‰NÜ&°b¸±jÈÈFÉØ¨HÀØ"´ÙGKœtŸz™z¨$¸UÕCÐQSñ	ô ð �A‘˜‰|˜qÒ Ü˜	 ! A¡#  a¬¨I«Ð'7Ð8ÀÕEÜ�J‰J�sŽOð%	ð& 	�‰Œ÷3ô6 
ˆJ”s˜7“|�nÐ$9Ð
:À$ÕGÜ�W¬)Õ4ÜÑK˜7ÔKÓK€EÜ	ˆOœC ›L˜>¨°U°GÐ
<ÀDÖIøôQ %ò 4ÜÐ 0°°°KÀ¸sÐCÈ4ÕPØ×-Ñ-¨d×3Ò3ûð4ú÷'7ñ 7ú÷zð úsW   ÁB+T"Ã2S'Ä T"Ä"S'Ä$DT"È6,T"Ê G%T/Ó'	T	Ó0$T	ÔT"ÔT	ÔT"Ô"T,Ô/T8Ú__main__)Ú__doc__Úosr	   r   rš   r˜   rW   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r�   r%   r‡   r—   r†   r�   r   r   r)   r,   ra   r¬   Ú__name__© r   r   ú<module>r¹      s£   ðñ	÷ 1× 0× 0Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à%€ØÐ-Ñ-€Ø0€	Ø€Ø€	àv€òòòòBò @òFeJðP ˆzÒÙ…Fð r   