Ë
    !xjã  ã                   óž  — 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mZ ddlm	Z	 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ  ej"                  «        ed¬«      z
  j%                  d«      Zd	Zd
ZdZdZeez   dz   ZdZd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u³  crawl_tszwgktzgg.py - å”�å±±å¸‚äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤º (ç‘žæ•°4ä»£WAF, playwrightæ— å¤´æµ�è§ˆå™¨è¿‡æ ¡éªŒ)

ç«™ç‚¹: https://www.tangshan.gov.cn/zhuzhan/tszwgktzgg/index.html
CMS: å¤©ç¿¼äº‘WAF(Environment Checking JS challenge) + æœ�åŠ¡ç«¯æ¸²æŸ“é¡µé�¢
åˆ—è¡¨: /zhuzhan/tszwgktzgg/YYYYMMDD/ID.html é“¾æŽ¥, index_N.html åˆ†é¡µ (å®žæµ‹7é¡µ, P8è¶Šç•Œç©º)
è¯¦æƒ…: meta[ArticleTitle] + meta[PubDate] + div#conN æ­£æ–‡(15+ä¸ª<p>æ®µè�½, æ–‡æœ¬åœ¨<label>å†…, å›¾ç‰‡åž‹å…¬å‘Šä¿�ç•™<p><img>)
WAF: requests/curl å…¨éƒ¨412 â†’ playwright chromium headless + --disable-blink-features=AutomationControlled å�¯è¿‡
æ ·æœ¬: å”�å±±å¸‚äººæ°‘æ”¿åºœå…³äºŽå®žæ–½2026å¹´åº¦é˜²ç©ºè­¦æŠ¥è¯•é¸£çš„é€šå‘Š (2026-07-02)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úpush_to_searchdbiG  )Údaysz%Y-%m-%du"   å”�å±±å¸‚äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤ºu   æ²³åŒ—zhttps://www.tangshan.gov.cnz/zhuzhan/tszwgktzgg/z
index.htmlzoMozilla/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| t         j                  «      }|s%t        j                  d| t         j                  «      }|sy|j                  d«      }|j	                  d«      |j	                  d«      kD  r;t        j
                  d|«      D �cg c]  }|j                  «       ‘Œ }}|r|d|d    }t        j                  d	|t         j                  «      }g }|D �]“  }d
|v rIt        j                  d|«      D ]/  }	|j                  dt        ‰|	j                  «       «      › d�«       Œ1 ŒQt        j                  dd„ |«      }
ˆfd„}t        j                  dˆfd„|
«      }
t        j                  d|
t         j                  ¬«      }g }|D ]§  }|j                  d«      r|j                  |«       Œ&t        j                  dd|«      }|j                  dd«      j                  dd«      j                  dd«      }t        j                  dd|«      j                  «       }|sŒ—|j                  |«       Œ© dj                  |«      j                  «       }|s�Œ|j                  d|› d�«       �Œ– |sct        j                  dd|«      }t        j                  dd|j                  dd«      «      j                  «       }|r|j                  d|› d�«       dj                  |«      S c c}w )u[   æ¸…æ´— div#conN æ­£æ–‡: ä¿�ç•™ <p> æ®µè�½ + å›¾ç‰‡ + æ®µå†…é™„ä»¶<a>, å‰¥ label/span å†…å±‚z#<div id="conN">(.*?)</div>\s*</div>z<div id="conN">(.*)Ú é   z<divz</div>Néÿÿÿÿz<p[^>]*>(.*?)</p>z<imgz<img[^>]+src="([^"]+)"[^>]*>z<p><img src="z"></p>z(<a[^>]+href="[^"]+"[^>]*>)c                 ód   — | j                  d«      j                  dd«      j                  dd«      S )Nr
   zhref="zhref="ABSURLÚABSURLÚX)ÚgroupÚreplace)Úmms    ú%/root/gov_crawler/crawl_tszwgktzgg.pyú<lambda>zclean_body.<locals>.<lambda>3   s4   € ¸r¿x¹xÈ»{×?RÑ?RÐS[Ð]kÓ?l×?tÑ?tÐu}ð  @Có  @D€ ó    c                 óF   •— | j                  d«      }dt        ‰|«      › d�S )Nr
   ú	<a href="ú">)r   r   )r   ÚhrefÚ
detail_urls     €r   Ú_abs_azclean_body.<locals>._abs_a5   s'   ø€ Ø—8‘8˜A“;ˆDØœw z°4Ó8Ð9¸Ð<Ð<r   z<a[^>]+href="([^"]+)"[^>]*>c                 óF   •— dt        ‰| j                  d«      «      z   dz   S )Nr   r
   r   )r   r   )r   r   s    €r   r   zclean_body.<locals>.<lambda>8   s'   ø€ ¸{ÌWÐU_Ðac×aiÑaiÐjkÓalÓMmÑ?mÐptÑ?t€ r   z(<a[^>]*>.*?</a>))Úflagsz<a z<[^>]+>u   ã€€ú õ   Â u   â€‹ú\s+z<p>z</p>ú
)ÚreÚsearchÚDOTALLr   ÚcountÚfinditerÚstartÚfindallÚappendr   ÚstripÚsubÚsplitÚ
startswithr   Újoin)Úhtmlr   ÚmÚbodyÚxÚclosesÚparasÚoutÚpÚsÚp2r   ÚpartsÚcleaned_partsÚpartÚtxtÚfinals    `               r   Ú
clean_bodyr=      s�  ø€ ä
�	‰	Ð8¸$ÄÇ	Á	ÓJ€AÙÜ�I‰IÐ,¨d´B·I±IÓ>ˆÙØØ�7‰7�1‹:€Dà‡z�z�&Ó˜DŸJ™J xÓ0Ò0ä%'§[¡[°¸DÓ%AÖB �!—'‘'•)ÐBˆÐBÙØ˜˜ ™Ð$ˆDä�J‰JÐ+¨T´2·9±9Ó=€EØ
€CØó *ˆà�Q‰;Ü—Z‘ZÐ ?ÀÓCò S�Ø—
‘
˜]¬7°:¸q¿w¹w»yÓ+IÐ*JÈ&ÐQÕRðSàä�V‰VÐ2ñ  5Dð  FGó  Hˆô	=ô �V‰VÐ2Ó4tÐvxÓyˆä—‘Ð-¨r¼¿¹ÔCˆØˆØò 	.ˆDØ�‰˜uÔ%Ø×$Ñ$ TÕ*ä—f‘f˜Z¨¨TÓ2�Ø—k‘k (¨CÓ0×8Ñ8¸ÀÓE×MÑMÈhÐXZÓ[�Ü—f‘f˜V S¨#Ó.×4Ñ4Ó6�ÚØ!×(Ñ(¨Õ-ð	.ð —‘˜Ó&×,Ñ,Ó.ˆÛØ�J‰J˜˜U˜G 4Ð(Ö)ð7*ñ: Ü�f‰f�Z  TÓ*ˆÜ�f‰f�V˜S #§+¡+¨h¸Ó"<Ó=×CÑCÓEˆÙØ�J‰J˜˜S˜E �Ô'Ø�9‰9�S‹>ÐùòQ Cs   ÂK6c                 ó~  — |dk(  rt         nt        › t        › d|› d�}| j                  |dd¬«       	 | j	                  dd¬	«       | j                  d
«       | j                  «       }t        j                  d|«      }g }|D ]j  \  }}}}	t        j                  dd|	«      j                  «       }	|	rt        |	«      dk  rŒ>|j                  t        |z   |d d › d|dd › d|dd › �|	dœ«       Œl t        «       }
g }|D ]/  }|d   |
vsŒ|
j                  |d   «       |j                  |«       Œ1 |S # t
        $ r Y Œõw xY w)Nr
   Úindex_z.htmlé`ê  Úload©ÚtimeoutÚ
wait_untilÚaé˜:  ©rC   iÄ	  zM<a[^>]+href="(/zhuzhan/tszwgktzgg/(\d{8})/(\d+)\.html)"[^>]*>([^<]{4,80})</a>r   r   é   ú-é   é   )ÚurlÚpub_dateÚtitlerL   )ÚLIST_URLÚBASEÚ	LIST_PATHÚgotoÚwait_for_selectorÚ	ExceptionÚwait_for_timeoutÚcontentr!   r'   r*   r)   Úlenr(   ÚsetÚadd)ÚpageÚpage_numrL   r.   ÚitemsÚresultsr   ÚdatestrÚiidrN   ÚseenÚuniqÚrs                r   Ú
fetch_listrc   Q   s_  € Ø !’m�(¬D¨6´)°¸FÀ8À*ÈEÐ)R€CØ‡I�Iˆc˜5¨V€IÔ4ðØ×Ñ˜s¨EÐÔ2ð 	×Ñ˜$ÔØ�<‰<‹>€DÜ�J‰JÐgÐimÓn€EØ€GØ%*ò Ñ!ˆˆg�s˜EÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙœ˜E›
 QšØØ�‰Ü˜$‘;Ø" 2 A˜;˜- q¨°°1¨¨°a¸ÀÀ!¸°~ÐFØñ
õ 	ð	ô ‹5€DØ€DØò ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�K‰K˜�Nðð €Køô- ò Ùðús   ³D0 Ä0	D<Ä;D<c                 óx  — 	 | j                  |d   dd¬«       	 | j                  dd¬«       | j                  d«       | j	                  «       }t        j                  d|«      }|r|j                  d«      j                  «       n|d   }t        j                  d|«      }|r|j                  d«      d d n|d   }t        ||d   «      }|j                  «       sy |||t        |d   |d   t        dœS # t        $ r Y ŒÑw xY w# t        $ r.}t        d	|d   › d
|› �t        j                  ¬«       Y d }~y d }~ww xY w)NrL   r@   rA   rB   zdiv#conNrF   rG   iÐ  u     [WARN] è¯¦æƒ…æŠ“å�–å¤±è´¥: z - )Úfilez+<meta name="ArticleTitle" content="([^"]*)"r
   rN   z&<meta name="PubDate" content="([^"]*)"é
   rM   )rN   rM   rV   Ú	site_nameÚ
source_urlrL   Ú
group_name)rR   rS   rT   rU   rV   ÚprintÚsysÚstderrr!   r"   r   r)   r=   Ú	SITE_NAMEÚ
GROUP_NAME)rZ   Úrecr.   Úer/   rN   rM   rV   s           r   Úfetch_detailrq   o   s8  € ð
Ø�	‰	�#�e‘* e¸ˆ	Ô?ð	Ø×"Ñ" :°uÐ"Ô=ð 	×Ñ˜dÔ#Ø�|‰|‹~ˆô 	�	‰	Ð@À$ÓG€AÙ"#ˆA�G‰G�A‹J×ÑÔ¨¨W©€EÜ
�	‰	Ð;¸TÓB€AÙ"#ˆq�w‰w�q‹z˜#˜2‰¨¨Z©€HÜ˜˜s 5™zÓ*€GØ�=‰=Œ?ØàØØÜØ˜%‘jØ�5‰zÜ ñð øô ò 	Ùð	ûô ò ÜÐ-¨c°%©j¨\¸¸Q¸CÐ@ÄsÇzÁzÕRÜûðús9   ‚D šC3 ­!D Ã3	C?Ã<D Ã>C?Ã?D Ä	D9Ä$D4Ä4D9c            
      óâ  — t        j                  «       } | j                  dt        d¬«       | j                  dt        dd¬«       | j	                  «       }ddlm} |j                  }t        d	t        › d
|› dt        › �«        |«       5 }|j                  j                  ddg¬«      }|j                  t        d¬«      }|j                  «       }g }t!        d|dz   «      D ]X  }		 t#        ||	«      }
t        d|	› dt%        |
«      › d�«       |
s|	dkD  rt        d|	› d|	dz
  › �«        n|j)                  |
«       ŒZ t        dt%        |«      › d�«       |D �cg c]  }|d   t        k\  sŒ|‘Œ }}t%        |«      t%        |«      z
  }t        dt%        |«      › d|› �«       |s%t        d«       |j+                  «        	 d d d «       y g }t-        |«      D ]  \  }}|j.                  r||j.                  k\  r n_t1        ||«      }|r|j3                  |«       |dz   dz  dk(  rt        d|dz   › dt%        |«      › d �«       t5        j6                  d!«       Œ� t        d"t%        |«      › d#�«       |j+                  «        d d d «       rt9        |d$«       t        d%t        › dt%        |«      › d&�«       y # t&        $ r}t        d|	› d|› �«       g }
Y d }~�ŒËd }~ww xY wc c}w # 1 sw Y   ŒfxY w)'Nz--pagesé   )ÚtypeÚdefaultz--max-detailr   u   è°ƒè¯•: å�ªæŠ“å‰�Næ�¡è¯¦æƒ…)rt   ru   Úhelp)Úsync_playwrightz=== u    === åˆ—è¡¨é¡µæ•°: z
, CUTOFF: Tz---disable-blink-features=AutomationControlled)ÚheadlessÚargszzh-CN)Ú
user_agentÚlocaler
   z  Pz: u    æ�¡z
  [WARN] Pu	    å¤±è´¥: u    ç©º â†’ å®žé™…æœ«é¡µ Pu   åˆ—è¡¨å�ˆè®¡: rM   u   çª—å�£å†…: u   , çª—å�£å¤–(2023-08-09å‰�): u   [RESULT] æ— çª—å�£å†…æ•°æ�®rf   z  [Detail] ú/z doneg      à?z	
Detail: z successÚ
tszwgktzggz	[RESULT] z items)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚplaywright.sync_apirw   Úpagesrj   rm   ÚCUTOFFÚchromiumÚlaunchÚnew_contextÚUAÚnew_pageÚrangerc   rW   rT   ÚextendÚcloseÚ	enumerateÚ
max_detailrq   r(   ÚtimeÚsleepr   )Úapry   rw   Útotal_pagesr5   ÚbrowserÚctxrZ   Úall_recsÚpgÚrecsrp   rb   Ú	in_windowÚ
out_windowÚrecordsÚiro   Úds                      r   Úmainrž   �   sÕ  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°€OÔ3Ø‡O�O�N¬°aÐ>[€OÔ\Ø�=‰=‹?€Då3Ø—*‘*€KÜ	ˆD”�Ð.¨{¨m¸:ÄfÀXÐ
NÔOá	Ó	ð +˜aØ—*‘*×#Ñ#¨TÐ9hÐ8iÐ#ÓjˆØ×!Ñ!¬R¸Ð!Ó@ˆØ�|‰|‹~ˆð ˆÜ˜˜;¨™?Ó+ò 	"ˆBðÜ! $¨Ó+�Ü˜˜B˜4˜r¤# d£) ¨DÐ1Ô2ñ à˜’6Ü˜C ˜tÐ#:¸2¸a¹4¸&ÐAÔBÙØ�O‰O˜DÕ!ð	"ô 	�œs 8›}˜o¨TÐ2Ô3ð !)ÖD˜1¨A¨j©M¼VÓ,C’QÐDˆ	ÐDÜ˜“]¤S¨£^Ñ3ˆ
Ü�œC 	›NÐ+Ð+GÈ
À|ÐTÔUÙÜÐ/Ô0Ø�M‰MŒOØ÷;+ð +ð@ ˆÜ 	Ó*ò 	‰FˆAˆsØ�Š 1¨¯©Ò#7ÙÜ˜T 3Ó'ˆAÙØ—‘˜qÔ!Ø�A‘˜‰|˜qÒ Ü˜ A a¡C 5¨¬#¨i«.Ð)9¸Ð?Ô@Ü�J‰J�s�Oð	ô 	�
œ3˜w›<˜.¨Ð1Ô2Ø�‰Œ÷W+ñ\ Ü˜ ,Ô/Ü	ˆI”i�[ ¤3 w£< .°Ð
7Õ8øôK ò Ü˜
 2 $ i°¨sÐ3Ô4Ø–ûðüò E÷/+ð +úsR   ÂAK%Ã&'J6ÄAK%ÅK Å+K Å/AK%Ç	B7K%Ê6	KÊ?KËK%ËKËK%Ë%K.Ú__main__)Ú__doc__rk   Úosr!   r~   r�   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimer…   rm   rn   rP   rQ   rO   r‰   r=   rc   rq   rž   Ú__name__© r   r   ú<module>r­      s¾   ðñ÷ #× "Ó "ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø0€	Ø€
Ø$€Ø"€	Ø�)Ñ˜lÑ*€Øv€ò3òlò<ò<:9ðz ˆzÒÙ…Fð r   