Ë
    Ë|yj5%  ã                   ó€  — 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
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZedz   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e dk(  r ejB                   e«       «       yy)u`  
å�ˆè‚¥ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - å…¬ç¤ºå…¬å‘Š çˆ¬è™«
hetda.hefei.gov.cn/xwzx/gsgg/index.html
WAF: ç‘žæ•°4ä»£ JS challenge (å…¨ç«™ 521) -> å¿…é¡» playwright chromium headless
CMS: é¾™è®¯ Lonsun (doc_list list-6796431 + Ls.pagination + /content/column/6796431?pageIndex=N)
åˆ—è¡¨: playwright æ¸²æŸ“; è¯¦æƒ…: playwright å�Œ context æŠ“å�– (requests è¢«æ‹¦)
é    N)Úurljoin)ÚBeautifulSoup)Úpush_to_searchdbzhttps://hetda.hefei.gov.cnz/xwzx/gsgg/index.htmlz$/content/column/6796431?pageIndex={}u   å�ˆè‚¥ç»�å¼€åŒº-å…¬ç¤ºå…¬å‘Ši�´g é   é   z
2023-08-10zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                  óÎ   — t         j                  dd  D ]O  } | j                  d«      rt        | j	                  d«      d   «      c S | j                  «       sŒDt        | «      c S  y )Né   z--pages=ú=)ÚsysÚargvÚ
startswithÚintÚsplitÚisdigit)Úas    ú%/root/gov_crawler/crawl_hetda_gsgg.pyÚparse_pages_argr      sU   € Ü�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMð	ð
 ó    c                 óÞ   — dd l }|j                  | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )Nr   Ú z&middot;|&nbsp;z[\u200b\ufeff]u   ^[â€¢Â·]\s*)ÚhtmlÚunescapeÚreÚsubÚstrip)ÚtitleÚhtml_mods     r   Úclean_titler   #   s]   € ÛØ×Ñ˜ešk rÓ*€EÜ�F‰FÐ% r¨5Ó1€EÜ�F‰FÐ$ b¨%Ó0€EÜ�F‰F�> 2 uÓ-€EØ�;‰;‹=Ðr   c              ƒ   óL  K  — |dk(  rt         }nt        j                  |«      }	 | j                  |dd¬«      ƒ d{  –—†  | j	                  d«      ƒ d{  –—†  | j                  d	«      ƒ d{  –—† }|S 7 Œ87 Œ!# t
        $ r}t        d|› d|› �«       g cY d}~S d}~ww xY w7 Œ3­w)
u%   æ¸²æŸ“åˆ—è¡¨é¡µ, è¿”å›ž (items, html)r	   ÚdomcontentloadedéÈ¯  ©Ú
wait_untilÚtimeoutNi¸  z  [WARN] goto page z error: aã  () => {
        const lis = document.querySelectorAll("ul.doc_list li");
        const seen = new Set();
        const out = [];
        lis.forEach(li => {
            const a = li.querySelector("a[href*='/xwzx/gsgg/']");
            const sp = li.querySelector("span.right.date");
            if (a) {
                const href = a.href.split('?')[0];
                if (!seen.has(href)) {
                    seen.add(href);
                    out.push({
                        url: href,
                        title: (a.getAttribute('title') || a.textContent || '').trim(),
                        date: sp ? sp.textContent.trim() : ''
                    });
                }
            }
        });
        return out;
    })ÚLIST_URLÚPAGE_URLÚformatÚgotoÚwait_for_timeoutÚ	ExceptionÚprintÚevaluate)ÚpageÚpage_numÚurlÚeÚitemss        r   Úfetch_list_pager2   +   s­   è ø€ à�1‚}Ü‰ä�o‰o˜hÓ'ˆðØ�i‰i˜Ð(:ÀEˆiÓJ×JÐJØ×#Ñ# DÓ)×)Ð)ð —-‘-ð !	ó 
÷ 
€Eð* €Lð5 	KøØ)ùÜò ÜÐ# H :¨X°a°SÐ9Ô:Ø�	ûðúð
úsb   ‚"B$¥A9 ¼A5½A9 ÁA7ÁA9 ÁB$Á.B"Á/B$Á5A9 Á7A9 Á9	BÂBÂBÂB$ÂBÂB$c              ƒ   óh
  K  — 	 | j                  |dd¬«      ƒ d{  –—†  | j                  d«      ƒ d{  –—†  | j                  «       ƒ d{  –—† }t        |d«      }d	}|j                  d
«      }|rt        |j                  d¬«      «      }|sAt        j                  d|t        j                  «      }|rt        |j                  d«      «      }|sSt        j                  d|t        j                  «      }|r,t        |j                  d«      j                  d«      d   «      }d	}t        j                  d|t        j                  «      }|r|j                  d«      }|s)t        j                  d|«      }|r|j                  d«      }d}	dD ]*  }
|j                  |
«      }	|	sŒ|	j                  d¬«      sŒ* n |	€(|j                  d
«      }|r|j!                  d«      }|r|}	|	€||d	g fS g }t#        |	«      }|	j%                  dd¬«      D ]˜  }|d   j'                  «       }t        j                  d|j)                  «       «      sd|j)                  «       v sŒMt+        t,        |«      }|j                  d¬«      xs |j                  d«      d   }|j/                  ||dœ«       Œš g }|	j%                  g d¢«      D �]ž  }|j0                  dk(  rì|j!                  d «      s"|j                  d «      s|j                  d«      rŒG|j%                  dd¬«      D ]_  }|d   j'                  «       }t        j                  d|j)                  «       «      sd|j)                  «       v sŒMt+        t,        |«      |d<   Œa |j                  d!d¬«      }t        j2                  d"d!|«      }|sŒé|j/                  d#|› d$�«       Œÿ|j0                  d k(  r|j/                  t#        |«      «       �Œ*|j0                  d%k(  s�Œ;|j5                  d&d	«      }|s�ŒQd'|j)                  «       vs�Œet+        t,        |«      }|j5                  d(d	«      }|j/                  d)|› d*|› d+�«       �Œ¡ |D ]   }|j/                  d,|d-   › d.|d/   › d0�«       Œ" d1j7                  |«      }t        j2                  d2d	|«      }t        j2                  d"d	|«      }|rt9        |«      d3k  r,|	j                  d «      s|	j                  d!d¬«      }|rd#|› d$�}||||fS 7 �Œê7 �ŒÔ7 �Œ¿# t        $ r}t	        d|› �«       Y d}~yd}~ww xY w­w)4u;   æ¸²æŸ“è¯¦æƒ…é¡µ, æ��å�– (title, date, content, attachments)r    r!   r"   NiÄ	  z  [WARN] detail goto error: )NNNNzhtml.parserr   Úh1T)r   zE<meta[^>]*name=["\']ArticleTitle["\'][^>]*content=["\']([^"\']*)["\']r	   z<title>(.*?)</title>Ú_r   zE<meta[^>]*name=["\']PubDate["\'][^>]*content=["\'](\d{4}-\d{2}-\d{2})u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2}))z	div.wzconzdiv.article-contentzdiv.contentzdiv.xl_textz#zoomzdiv.viewzdiv.newscontnetzdiv.TRS_EditorÚdivr   )Úhrefr7   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|wps)$Údownloadú/éÿÿÿÿ)Únamer/   )ÚpÚtableÚimgr<   r=   ú z\s+z<p>z</p>r>   Úsrczfiles2/Úaltz<p><img src="z" alt="z"></p>z<p><a href="r/   z">r;   z</a></p>ú
z<[^>]+>é2   )r(   r)   Úcontentr*   r+   r   Úfindr   Úget_textr   ÚsearchÚIÚgroupÚSr   Ú
select_oneÚfind_parentÚstrÚfind_allr   Úlowerr   ÚBASE_URLÚappendr;   r   ÚgetÚjoinÚlen)r-   r/   r   r0   Úsoupr   r4   ÚmÚdateÚbody_elÚselÚh1_elÚparentÚattachmentsÚ	body_htmlr   r7   Úfullr;   ÚpartsÚelÚtxtr@   rA   ÚattrD   Úextracted_texts                              r   Úfetch_detailrd   N   sÊ  è ø€ ð&Ø�i‰i˜Ð(:ÀEˆiÓJ×JÐJØ×#Ñ# DÓ)×)Ð)Ø—\‘\“^×#ˆô
 ˜˜}Ó-€Dð €EØ	�‰�4‹€BÙ	Ü˜BŸK™K¨d˜KÓ3Ó4ˆÙÜ�I‰IÐ^Ð`dÔfh×fjÑfjÓkˆÙÜ §¡¨£
Ó+ˆEÙÜ�I‰IÐ-¨t´R·T±TÓ:ˆÙÜ §¡¨£
× 0Ñ 0°Ó 5°aÑ 8Ó9ˆEð €DÜ
�	‰	ÐZÐ\`Ôbd×bfÑbfÓg€AÙØ�w‰w�q‹zˆÙÜ�I‰IÐAÀ4ÓHˆÙØ—7‘7˜1“:ˆDð €Gð Lò ˆØ—/‘/ #Ó&ˆÚ�w×'Ñ'¨dÐ'Õ3Ùðð €à—	‘	˜$“ˆÙØ×&Ñ& uÓ-ˆFÙØ �à€Ø�d˜B Ð"Ð"ð €KÜ�G“€Ià×Ñ˜c¨ÐÓ-ò <ˆØ�‰y�‰Ó ˆÜ�9‰9Ð>ÀÇ
Á
ÃÔMÐQ[Ð_c×_iÑ_iÓ_kÒQkÜœ8 TÓ*ˆDØ—:‘: D�:Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆDØ×Ñ¨°TÑ:Õ;ð<ð €EØ×ÑÒ4Ó5ó GˆØ�7‰7�cŠ>Ø�~‰~˜gÔ&¨"¯'©'°'Ô*:¸b¿g¹gÀc¼lØà—[‘[ ¨4�[Ó0ò 8�Ø˜‘y—‘Ó(�Ü—9‘9ÐFÈÏ
É
ËÔUÐYcÐgk×gqÑgqÓgsÒYsÜ '¬°$Ó 7�A�f’Ið8ð —+‘+˜c¨�+Ó.ˆCÜ—&‘&˜  cÓ*ˆCÚà—‘˜s 3 % t˜_Õ-Ø�W‰W˜ÒØ�L‰Lœ˜R›Ö!Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCÛ�y¨¯	©	«Ó3Üœx¨Ó-�Ø—f‘f˜U BÓ'�Ø—‘˜}¨T¨F°'¸#¸¸fÐEÖFð+Gð0 ò IˆØ�‰�| C¨¡J <¨r°#°f±+°¸hÐGÕHðIð �i‰i˜Ó€Gä—V‘V˜J¨¨GÓ4€NÜ—V‘V˜F B¨Ó7€NÙ”s˜>Ó*¨RÒ/¸¿¹ÀgÔ9NØ×Ñ˜s¨$ÐÓ/ˆÙØ˜C˜5 �oˆGà�$˜ Ð,Ð,ðG 	KùØ)ùØ#úÜò &ÜÐ,¨Q¨CÐ0Ô1Ü%ûð&üs–   ‚T2„T ›TœT ´TµT ÁTÁT ÁET2Æ%T2Æ8B!T2ÉD	T2Í$AT2Î&AT2Ï8T2ÐT2Ð"C#T2ÔT ÔT ÔT Ô	T/ÔT*Ô%T2Ô*T/Ô/T2c               ƒ   ó*  K  — t        «       } | €t        } t        d| › dt        › d�«       ddlm} g }t        «       } |«       4 ƒd {  –—† }|j                  j                  dddg¬	«      ƒ d {  –—† }|j                  t        d
¬«      ƒ d {  –—† }|j                  «       ƒ d {  –—† }t        d| dz   «      D ]ò  }t        ||«      ƒ d {  –—† }	|	D �
cg c]  }
|
d   |vsŒ|
‘Œ }}
|D ]  }
|j                  |
d   «       Œ |j                  |«       t        d|› dt!        |	«      › dt!        |«      › dt!        |«      › �«       |rA|D �
cg c]  }
|
d   sŒ	|
d   ‘Œ }}
|r't#        |«      t$        k  rt        dt$        › d�«        n&|st        d«        nt'        j(                  d«       Œô t        dt!        |«      › d�«       g }t+        |«      D ]Â  \  }}t-        ||d   «      ƒ d {  –—† \  }}}}|s|d   }|s|d   }|st        d|d d › �«       |j/                  t        ||||d   |d   d|rt1        j2                  |d¬«      nddœ«       |dz   d z  dk(  r#t        d!|dz   › d"t!        |«      › d#|d d$ › �«       t'        j(                  d%«       ŒÄ |j5                  «       ƒ d {  –—†  d d d «      ƒd {  –—†  t7        t        ¬&«       t        d'd(› �«       t        d)t        › �«       t        d*t!        |«      › �«       |D �cg c]  }|d+   sŒ	|d+   ‘Œ }}t        d,|rt#        |«      nd-› d.|rt9        |«      nd-› �«       t        d(› «       y 7 �Œ7 �Œí7 �ŒÑ7 �Œ¼7 �Œ™c c}
w c c}
w 7 �Œ†7 ŒÈ7 Œº# 1 ƒd {  –—†7  sw Y   ŒÊxY wc c}w ­w)/Nz[AutoPg] max_pages=z (SITE=ú)r   )Úasync_playwrightTz---disable-blink-features=AutomationControlledz--no-sandbox)ÚheadlessÚargszzh-CN)Ú
user_agentÚlocaler	   r/   z  Page z: u   æ�¡(æ–°u   ) ç´¯è®¡rW   u     å·²è¾¾ CUTOFF u   , å�œæ­¢ç¿»é¡µu     æ— æ–°å¢ž, å�œæ­¢u   
å…± u!    æ�¡åˆ—è¡¨é¡¹, å¼€å§‹æŠ“è¯¦æƒ…...r   u     [WARN] ç©ºæ­£æ–‡: rC   u   å…¬ç¤ºå…¬å‘ŠF)Úensure_asciir   )Ú	site_namer   Úpub_daterD   Ú
source_urlr/   Úcategoryr\   r   z  [r9   u
   ] æœ€æ–°: é(   g      à?)Úbatch_labelrB   z2==================================================u   ç«™ç‚¹: u   é‡‡é›†æ�¡æ•°: rn   u   æ—¥æœŸèŒƒå›´: ú-z ~ )r   Ú	MAX_PAGESr+   Ú	SITE_NAMEÚplaywright.async_apirg   ÚsetÚchromiumÚlaunchÚnew_contextÚUAÚnew_pageÚranger2   ÚaddÚextendrT   ÚminÚCUTOFFÚtimeÚsleepÚ	enumeraterd   rQ   ÚjsonÚdumpsÚcloser   Úmax)Ú	max_pagesrg   Ú	all_itemsÚ	seen_urlsr<   ÚbrowserÚctxr-   Úpgr1   ÚxÚ	new_itemsÚdatesÚresultsÚiÚitemr   rW   rD   r\   Úrs                        r   Úmainr–   ¶   s¦  è ø€ ÜÓ!€IØÐÜˆ	ä	Ð 	˜{¨'´)°¸AÐ
>Ô?å5Ø€IÜ“€IáÓ!÷ 3ð 3 QØŸ
™
×)Ñ)ØØAÀ>ÐRð *ó 
÷ 
ˆð ×'Ñ'´2¸gÐ'ÓF×FˆØ—\‘\“^×#ˆä˜˜9 q™=Ó)ò 	ˆBÜ)¨$°Ó3×3ˆEØ$)ÖG˜q¨Q¨u©X¸YÒ-FšÐGˆIÐGØò (�Ø—‘˜a ™hÕ'ð(à×Ñ˜YÔ'Ü�G˜B˜4˜r¤# e£* ¨W´S¸³^Ð4DÀHÌSÐQZË^ÐL\Ð]Ô^áØ,5ÖC q¸¸6»˜˜6›ÐC�ÐCÙœS ›Z¬&Ò0ÜÐ,¬V¨H°NÐCÔDÙÙÜÐ+Ô,ÙÜ�J‰J�q�Mð!	ô$ 	�”s˜9“~Ð&Ð&GÐHÔIØˆÜ  Ó+ò 	‰GˆAˆtÜ6BÀ4ÈÈeÉÓ6U×0UÑ-ˆE�4˜ +ÙØ˜W™�ÙØ˜F‘|�ÙÜÐ,¨U°3°B¨Z¨LÐ9Ô:à�N‰NÜ&ØØ Ø"Ø" 5™kØ˜E‘{Ø*ÙNYœtŸz™z¨+ÀEÕJÐ_añ	ô 	ð �A‘˜‰|˜qÒ Ü˜˜A˜a™C˜5 ¤# i£.Ð!1°¸EÀ#À2¸J¸<ÐHÔIÜ�J‰J�s�Oð+	ð. �m‰m‹o×Ð÷g3÷ 3ôj �W¬)Õ4Ü	ˆBˆvˆhˆ-ÔÜ	ˆH”Y�KÐ
 Ô!Ü	ˆNœ3˜w›<˜.Ð
)Ô*Ø$+Ö=˜q¨q°«}ˆQˆz‹]Ð=€EÐ=Ü	ˆN©œ3˜uœ:°CÐ8¸É%¼CÀ¼JÐUXÐ;YÐ
ZÔ[Ü	ˆVˆHÕðw3ùð
ùð GùØ#ùð 4ûÚGùò Dð 1Vùð, 	øðg3ø÷ 3÷ 3ñ 3üòr >ùsî   ‚ANÁMÁ	NÁ#M9Á/MÁ0M9ÂMÂM9Â&M"Â'%M9ÃM%ÃM9ÃM(Ã"M(Ã&A&M9Å
M-ÅM-ÅBM9Ç,M2Ç-B?M9Ê,M5Ê-M9Ê1NÊ<M7Ê=ANÌ
NÌNÌ;NÍM9ÍM9Í"M9Í%M9Í(M9Í5M9Í7NÍ9NÍ?NÎ NÎNÚ__main__)"Ú__doc__Úosr   r   r‚   r…   ÚasyncioÚurllib.parser   Úbs4r   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   rP   r%   r&   ru   Ú	COLUMN_IDÚ	PAGE_SIZErt   r�   r{   r   r   r2   rd   r–   Ú__name__Úrun© r   r   ú<module>r¨      sÀ   ðñ÷ (× '× 'Ý  Ý à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à'€ØÐ-Ñ-€ØÐ<Ñ<€Ø*€	Ø€	Ø€	Ø€	Ø	€àv€òòò!òFf-òPFðP ˆzÒØ€G‡K�K‘“Õð r   