Ë
    Â yjÝ)  ã                   óR  — 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d„ Zd„ Zedk(  r e«        yy)u¾  
æƒ å®‰åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºä¿¡æ�¯ (gsxx) çˆ¬è™«
åˆ—è¡¨: https://www.huian.gov.cn/zwgk/xwzx/gggs/gsxx/
  avalon.js å‰�ç«¯æ¸²æŸ“ (terton.dynamicAndStaticData), é�™æ€� HTML å�« JS æ•°ç»„(æ¯�é¡µ15æ�¡)
  ç¿»é¡µ: ç‚¹é¡µç �æŒ‰é’® (ms-controller=list_pagebar)
è¯¦æƒ…: /zwgk/xwzx/gggs/gsxx/YYYYMM/tYYYYMMDD_ID.htm
  æ ‡é¢˜: meta ArticleTitle / h1
  æ­£æ–‡: TRS_Editor/TRS_UEDITOR ç­‰å®¹å™¨ (å¹³è¡¡ div)
ç”¨æ³•: python3 crawl_huian_gsxx.py [--pages=N]
é    N)Úurljoin)Úpush_to_searchdbzhttps://www.huian.gov.cnz/zwgk/xwzx/gggs/gsxx/u"   æƒ å®‰åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºä¿¡æ�¯u   å…¬ç¤ºä¿¡æ�¯é   z
2023-08-10zoMozilla/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 ]M  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  «       sŒCt        |«      } ŒO | S )Nr   é   z--pages=ú=)ÚsysÚargvÚ
startswithÚintÚsplitÚisdigit)ÚpagesÚas     ú%/root/gov_crawler/crawl_huian_gsxx.pyÚ
parse_argsr      s[   € Ø€EÜ�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�Y‰Y�[Ü˜“F‰Eð	ð
 €Ló    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                 óŽ  — g }t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|s|S |j                  d«      }t        j                  d|«      D ]È  }|j                  d«      t        |j                  d«      «      |j                  d«      }}}t        |«      dk  rŒN|j                  d«      rt        t        |dd	 «      }n+|j                  d
«      r
t        |z   }nt        t        |«      }|j                  t        «      sŒ´|j                  |||dœ«       ŒÊ |S )u@   ä»Žå†…åµŒ dynamicAndStaticData JSON æ��å�–åˆ—è¡¨ (æ—  JS æ‰§è¡Œ)z7dynamicAndStaticData\(\s*\{[^}]*?list:\s*\[(.*?)\]\s*\)zlist:\s*\[(.*?)\]\s*\}r   zo\{\s*\"docreltime\"\s*:\s*'([^']*)'\s*,\s*\"doctitle\"\s*:\s*'([^']*)'\s*,\s*\"docpuburl\"\s*:\s*'([^']*)'\s*\}é   é   é   ú./Nú/)ÚtitleÚhrefÚdate)r   ÚsearchÚSÚgroupÚfinditerr   Úlenr   r   ÚLIST_URLÚBASE_URLÚappend)ÚhtmlÚitemsÚmÚblobÚrecr'   r%   Úurls           r   Úextract_json_itemsr6   /   s  € à€Eä
�	‰	ÐLÈdÔTV×TXÑTXÓY€AÙÜ�I‰IÐ/°´r·t±tÓ<ˆÙØˆØ�7‰7�1‹:€Dä�{‰{ð  Nð  PTó  Uò BˆØŸ9™9 Q›<¬°S·Y±Y¸q³\Ó)BÀCÇIÁIÈaÃL�SˆeˆÜˆu‹:˜Š>ØØ�>‰>˜$ÔÜœ( C¨¨ GÓ,‰CØ�^‰^˜CÔ Ü˜S‘.‰Cäœ( CÓ(ˆCØ�~‰~œhÔ'ØØ�‰˜u¨c¸4Ñ@ÕAðBð €Lr   c                 óJ   — 	 | j                  d|«      }|S # t        $ r Y yw xY w)u8   ç‚¹å‡»é¡µç �æŒ‰é’® (æ•°å­—æŒ‰é’®, å‹¿ç‚¹ ä¸‹ä¸€é¡µ span)a  (t) => {
            const links = document.querySelectorAll('a[href="#"], .page_base a, .pagination a');
            for (const a of links) {
                if (a.textContent.trim() === String(t)) { a.click(); return true; }
            }
            return false;
        }F)ÚevaluateÚ	Exception)ÚpageÚpgÚclickeds      r   Ú
click_pager=   J   s8   € ð
Ø—-‘-ð !ð óˆð ˆøÜò Ùðús   ‚ –	"¡"c                 óê   — | j                  d«      }|D ]\  }|d   }|j                  d«      rt        t        |dd «      }n+|j                  d«      r
t        |z   }nt        t        |«      }||d<   Œ^ |S )u4   ä»Žæ¸²æŸ“å�Žé¡µé�¢æ��å�–åˆ—è¡¨ (avalon æ¸²æŸ“å®Œæˆ�)aX  () => {
        const out = [];
        const seen = new Set();
        const anchors = document.querySelectorAll('a[href*=".htm"]');
        for (const a of anchors) {
            const href = a.getAttribute('href') || '';
            if (!href.includes('.htm') || seen.has(href)) continue;
            const title = (a.textContent || '').trim();
            if (title.length < 4) continue;
            seen.add(href);
            let date = '';
            const li = a.closest('li');
            const scope = li || a.parentElement;
            if (scope) {
                const m = scope.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');
            }
            out.push({href: href, title: title, date: date});
        }
        return out;
    }r&   r#   r    Nr$   )r8   r   r   r-   r.   )r:   r1   Úitr&   s       r   Úextract_itemsr@   Y   s~   € à�M‰Mð 	ó 
€Eð* ò ˆØ�&‰zˆØ�?‰?˜4Ô Üœ8 T¨!¨" XÓ.‰DØ�_‰_˜SÔ!Ü˜d‘?‰Däœ8 TÓ*ˆDØˆˆ6Š
ðð €Lr   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ˆfd„|«      }t        j                  dˆfd „|«      }t        j                  d!d|«      }t        j                  d"d|«      }t        j                  d#d|«      }t        j                  d$d%|«      }t        j                  d&d|«      }t        j                  d'd|«      }d%|vrd(|vrd%|z   d)z   }|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)0u-   è¯¦æƒ…é¡µ: æ ‡é¢˜ + æ­£æ–‡å®¹å™¨ (å¹³è¡¡ div)Ú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    r!   )Ú
TRS_EditorÚTRS_UEDITORÚzoomÚcontentzarticle-contentÚzoomconÚwzconÚarticle_content_01z#(?:class|id)\s*=\s*["\']?[^"\'>]*\bz\b[^"\'>]*["\']?ú>r"   z<divé   z</div>z<script[\s\S]*?</script>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   )Úhttpú#Ú
javascript©r*   r   r   ©Úm2r5   s    €r   ú<lambda>zfetch_detail.<locals>.<lambda>®   sq   ø€ °{Ðgi×goÑgoÐpqÓgr×g}Ñg}ð  Zô  h[ÄgÈcÐSU×S[ÑS[Ð\]ÓS^ÓF_ñ  8m€ ð  ac÷  aiñ  aið  jkó  alñ  8m€ r   zsrc="([^"]*)"c                 ó¦   •— d| j                  d«      j                  d«      st        ‰| j                  d«      «      z  S | j                  d«      z  S )Nzsrc="%s"r   )rS   zdata:rU   rV   rW   s    €r   rY   zfetch_detail.<locals>.<lambda>¯   sq   ø€ °jÐeg×emÑemÐnoÓep×e{Ñe{ð  }\ô  f]ÄGÈCÐQS×QYÑQYÐZ[ÓQ\ÓD]ñ  7o€ ð  ce÷  ckñ  ckð  lmó  cnñ  7o€ r   z\sstyle="[^"]*"zM<span[^>]*>|</span>|<strong[^>]*>|</strong>|<b[^>]*>|</b>|<font[^>]*>|</font>z^\s*<div[^>]*>\s*z<p[^>]*>z<p>z<p>\s*&nbsp;\s*</p>z
<p>\s*</p>z<tablez</p>é   z    [ERR] detail ú: T©Úflush)r   r   r   )ÚgotoÚwait_for_timeoutrL   r   r(   r   r*   r   r   r   ÚescapeÚstartÚfindr,   r   r9   Úprint)r:   r5   r0   r%   r2   Úpub_dateÚbodyÚcidÚirb   ÚdepthÚjÚrawÚes    `            r   Úfetch_detailrm   |   sŠ  ø€ ðEØ�	‰	�# (°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°B¸Ó<ˆCä—&‘&Ð*ó  -mð  oró  sˆCÜ—&‘&Ð)ó  ,oð  qtó  uˆCÜ—&‘&Ð+¨R°Ó5ˆCÜ—&‘&ÐiÐkmÐorÓsˆCÜ—&‘&Ð-¨r°3Ó7ˆCä—&‘&˜ e¨SÓ1ˆCä—&‘&Ð/°°SÓ9ˆCÜ—&‘&˜¨¨CÓ0ˆCà˜CÑ H°CÑ$7Ø˜c‘k FÑ*�Ø—9‘9“;ˆDÜ�4‹y˜BŒÙðM&	ñN ”s˜4“y 2’~ØˆDØ�h Ð$Ð$øÜò ÜÐ! #  b¨¨Ð,°DÕ9Üûðús%   ƒH5M7 È9D"M7 ÍM7 Í7	NÎ NÎNc                  ó´  — t        «       xs t        } t        dt        › d| › �d¬«       ddlm}  |«       5 }|j                  j                  dddg¬	«      }|j                  t        d
¬«      }|j                  «       }|j                  t        dd¬«       |j                  d«       g }t        «       }t        d| dz   «      D �]  }t!        |«      }	|	st        d|› d�d¬«        nád}
|	D ]4  }|d   |v rŒ|j#                  |d   «       |j%                  |«       |
dz  }
Œ6 t        d|› dt'        |	«      › d|
› dt'        |«      › �d¬«       t)        d„ |	D «       d¬«      }|r&|t*        k  rt        d|› d|› dt*        › d�d¬«        n?|| k  sŒÌt-        ||dz   «      st        d|dz   › d�d¬«        n|j                  d «       �Œ t        d!t'        |«      › d"�d¬«       g }t/        |«      D �]j  \  }}t1        ||d   «      \  }}}|xs |d#   }|xs |j3                  d$d«      }|rt5        j6                  d%d&|«      n|}t5        j6                  d'd&|«      j9                  «       d d( }g }|rjt5        j:                  d)|t4        j<                  «      D ]B  }|j%                  |j?                  d*«      j9                  «       |j?                  d«      d+œ«       ŒD |j%                  t        |d   |d   ||||t@        |rtC        jD                  |d,¬-«      ndd.œ	«       |dz   d/z  dk(  rt        d0|dz   › d1t'        |«      › �d¬«       tG        jH                  d2«       �Œm t        d3t'        |«      › d4�d¬«       tK        |t        ¬5«       tM        d6„ |D «       «      }t        d7t'        |«      › d8|› �d¬«       |jO                  «        d d d «       y # 1 sw Y   y xY w)9Nz[HUIAN-GSXX] SITE=z max_pages=Tr]   r   )Úsync_playwrightz---disable-blink-features=AutomationControlledz--no-sandbox)ÚheadlessÚargszzh-CN)Ú
user_agentÚlocalerB   rC   rD   iÄ	  r   z  Page z: 0 items (end)r&   r\   u   æ�¡(æ–°u   ) ç´¯è®¡c              3   ó2   K  — | ]  }|d    sŒ	|d    –— Œ y­w)r'   N© )Ú.0r?   s     r   ú	<genexpr>zmain.<locals>.<genexpr>â   s   è ø€ ÒE¨2¸"¸V»*˜B˜v�JÑEùs   ‚
�
r   )Údefaultz  [CUTOFF] page z
 min_date=z < z, stopz  [END] page z click faili  u   åˆ—è¡¨å®Œæˆ�: u    æ�¡, æŠ“è¯¦æƒ…...r%   r'   z<[^>]+>r   r   i,  zQ<a[^>]*href="([^"]*\.(?:pdf|doc|docx|xls|xlsx|zip|rar|ofd|wps))"[^>]*>([^<]*)</a>r    )Únamer5   F)Úensure_ascii)	Ú	site_nameÚ
source_urlr5   r%   re   rL   ÚsummaryÚcategoryÚattachmentsrH   z	  detail r$   g333333Ó?z
  pushing z	 items...)Úbatch_labelc              3   óh   K  — | ]*  }|j                  d «      xs dj                  «       rŒ'd–— Œ, y­w)rL   r   r   N)Úgetr   )rv   Úrs     r   rw   zmain.<locals>.<genexpr>  s)   è ø€ ÒO˜!¨q¯u©u°YÓ/?Ò/EÀ2×.LÑ.LÕ.N”AÑOùs   ‚(2«2z  DONE. pushed=u    ç©ºæ­£æ–‡=)(r   Ú	MAX_PAGESrd   Ú	SITE_NAMEÚplaywright.sync_apiro   ÚchromiumÚlaunchÚnew_contextÚUAÚnew_pager_   r-   r`   ÚsetÚranger@   Úaddr/   r,   ÚminÚCUTOFFr=   Ú	enumeraterm   r‚   r   r   r   r+   ÚIr*   ÚCATEGORYÚjsonÚdumpsÚtimeÚsleepr   ÚsumÚclose)Ú	max_pagesro   ÚpÚbrowserÚctxr:   Ú	all_itemsÚseenr;   r1   Ú	new_countr?   Úmin_dateÚresultsrh   Úd_titleÚd_daterf   r%   re   r}   Úattsr2   Úemptys                           r   Úmainr§   Æ   sË  € Ü“Ò)¤	€IÜ	Ðœy˜k¨°Y°KÐ
@ÈÕMå3Ù	Ó	ð ;˜aØ—*‘*×#Ñ#¨TÐ9hÐjxÐ8yÐ#ÓzˆØ×!Ñ!¬R¸Ð!Ó@ˆØ�|‰|‹~ˆØ�	‰	”( x¸ˆ	Ô?Ø×Ñ˜dÔ#àˆ	Ü‹uˆÜ˜˜9 q™=Ó)ó 	,ˆBÜ! $Ó'ˆEÙÜ˜ ˜t ?Ð3¸4Õ@ÙØˆIØò �Ø�f‘: Ñ%ØØ—‘˜˜F™Ô$Ø× Ñ  Ô$Ø˜Q‘‘	ðô �G˜B˜4˜r¤# e£* ¨W°Y°K¸xÌÈIËÐGWÐXÐ`dÕeäÑE°ÔEÈrÔRˆHÙ˜H¤vÒ-ÜÐ(¨¨¨J°x°jÀÄFÀ8È6ÐRÐZ^Õ_ÙØ�I‹~Ü! $¨¨Q©Ô/Ü˜M¨"¨Q©$¨¨{Ð;À4ÕHÙØ×%Ñ% dÖ+ð-	,ô0 	�œs 9›~Ð.Ð.@ÐAÈÕNØˆÜ˜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˜w›<˜.¨	Ð2¸$Õ?Ü˜¬iÕ8ÜÑO˜wÔOÓOˆÜ�¤ G£˜~¨[¸¸Ð@ÈÕMØ�‰Œ÷w;÷ ;ñ ;ús   ·EOÆH7OÏOÚ__main__) Ú__doc__Úosr	   r   r–   r”   r0   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r.   r-   r…   r“   r„   r�   rŠ   r   r   r6   r=   r@   rm   r§   Ú__name__ru   r   r   ú<module>r³      s¬   ðñ	÷ 1× 0× 0Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à%€ØÐ-Ñ-€Ø0€	Ø€Ø€	Ø	€àv€òòòò6ò òFGòT@ðF ˆzÒÙ…Fð r   