Ë
    G«£jÖ,  ã                   óš   — 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	Z	dZ
e
dz   ZdZdZdZdd	„Zd
„ Zd„ Zd„ Zedk(  r e«        yy)u³  å¼‹é˜³åŽ¿äººæ°‘æ”¿åºœ (www.jxyy.gov.cn) é€šçŸ¥å…¬å‘Šçˆ¬è™« â€” UCAP CMS + ç”µä¿¡NWAF + ç‘žæ•°å�Œå±‚é˜²æŠ¤
ç”¨æ³•: python3 crawl_jxyy_tzgg.py [--pages N] [--out /tmp/jxyy_tzgg.jsonl]
è¿‡ç›¾: æœ�åŠ¡å™¨ playwright + playwright_stealth.Stealth (NWAF 405 æ‹‰é»‘æœ¬åœ°IP, æœ�åŠ¡å™¨IPå�¯è¿‡)
åˆ—è¡¨: li > h4 > a[title] + span.time, åˆ†é¡µ list.shtml / list_{N}.shtml
è¯¦æƒ…: div#zoomcon > ucapcontent, meta ArticleTitle/PubDate/ContentSource
é    N)Úurljoinzhttp://www.jxyy.gov.cnz/jxyy/tzgg/list.shtmlÚ	jxyy_tzggzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36)u	   è¯·ç¨�å€™ÚNWAFÚ405u   è®¿é—®u   æ‹¦æˆªc                 óh  — ddl m} |xs t        } || d«      }|j                  d«      D ]í  }|j	                  d«      xs d}|s%|j                  d«      }|r|j	                  dd«      }|s)|j                  dd	d
i¬«      }|r|j	                  dd«      }|s%|j                  d«      }	|	r|	j	                  dd«      }|rK|j                  d«      r|nt        ||«      }
|j                  d|
¬«      }d|_	        |j                  |«       ŒÞ|j                  «        Œï  |g d¢«      D ]  }|j                  «        Œ |j                  d«      D ]J  }dD ]  }||j                  v sŒ||= Œ t        |j                  «      D ]  }|j                  d«      sŒ||= Œ ŒL |j                  d«      D ]‡  }|j	                  d«      xs |j	                  d«      xs d}|rK|j                  d«      r|nt        ||«      }
|j                  d|
¬«      }d|_	        |j                  |«       Œx|j                  «        Œ‰ |j                  g d¢«      D ]  }|j                  «        Œ |j                  d«      D ]]  }|j	                  dd«      }|r4|j                  d«      s#|j                  d«      r|nt        ||«      |d<   ŒK|sŒN|j                  «        Œ_ |j                  d«      D ]I  }|j                  d¬«      rŒ|j                  d«      rŒ(|j                  d«      rŒ:|j                  «        ŒK t!        |«      S )u¦   ç™½å��å�•æ¸…æ´—: ä¿�ç•™ <p>/<table>/<a>, unwrap è£…é¥°æ ‡ç­¾, æ¸… inline style, é“¾æŽ¥ç»�å¯¹åŒ–
    base_url: è¯¦æƒ…é¡µ URL (å›¾ç‰‡/é™„ä»¶ç›¸å¯¹è·¯å¾„ä»¥æ­¤ä¸ºåŸºå�€)r   ©ÚBeautifulSoupúhtml.parserÚvideoÚsrcÚ ÚsourceÚparamÚnameÚurl©ÚattrsÚvalueÚembedÚhttpÚa©Úhrefu   æŸ¥çœ‹è§†é¢‘)ÚscriptÚstyleÚiframeÚobjectr   T)r   ÚclassÚalignÚvalignÚborderÚcellpaddingÚcellspacingÚwidthÚheightÚbgcolorÚfaceÚcolorÚsizeÚlangÚdirÚ	setedariaÚtabindexÚrolezaria-Úimgzdata-srcu   æŸ¥çœ‹å›¾ç‰‡)ÚdivÚspanÚfontÚcenterÚbÚstrongÚemÚiÚuÚsÚlabelÚh1Úh2Úh3Úucapcontentr   Ú
javascriptÚp©ÚstripÚtable)Úbs4r	   ÚBASEÚfind_allÚgetÚfindÚ
startswithr   Únew_tagÚstringÚreplace_withÚ	decomposer   ÚlistÚunwrapÚget_textÚstr)ÚhtmlÚbase_urlr	   ÚbaseÚsoupÚvr   r9   r@   ÚeÚabs_srcr   ÚtÚattrr/   r   s                   úcrawl_jxyy_tzgg.pyÚ
clean_htmlr\      sï  € õ "ØÒ”t€DÙ˜˜}Ó-€Dà�]‰]˜7Ó#ò ˆØ�e‰e�E‹lÒ ˜bˆÙØ—‘�xÓ ˆAÙØ—e‘e˜E 2Ó&�ÙØ—‘�w v¨u o�Ó6ˆAÙØ—e‘e˜G RÓ(�ÙØ—‘�w“ˆAÙØ—e‘e˜E 2Ó&�ÙØ Ÿ^™^¨FÔ3‘c¼ÀÀsÓ9KˆGØ—‘˜S w�Ó/ˆAØ%ˆAŒHØ�N‰N˜1Õà�K‰K�Mð)ñ* ÒBÓCò ˆØ	�‰�ðð �]‰]˜4Ó ò ˆð6ò 	ˆDð �q—w‘wŠØ�d‘Gð		ô
 ˜Ÿ™“Mò 	ˆDØ�‰˜wÕ'Ø�d‘Gñ	ðð �}‰}˜UÓ#ò ˆØ�g‰g�e‹nÒ9 §¡¨
Ó 3Ò9°rˆÙØ Ÿ^™^¨FÔ3‘c¼ÀÀsÓ9KˆGØ—‘˜S w�Ó/ˆAØ%ˆAŒHØ×Ñ˜QÕà�M‰M�Oðð �]‰]ò  Kó  Lò ˆØ	�‰�
ðà�]‰]˜3Óò ˆØ�u‰u�V˜RÓ ˆÙ˜Ÿ™¨Ô5Ø $§¡°Ô 7™¼WÀTÈ4Ó=PˆAˆfŠIÚØ�K‰K�Mðð �]‰]˜3Óò ˆØ�z‰z ˆzÕ%¨a¯f©f°W­oÀaÇfÁfÈSÅkØ�K‰K�Mðô ˆt‹9Ðó    c                 ó‚  — ddl m}  || d«      }g }|j                  d«      D ]Ù  }|j                  dd¬«      }|sŒ|j	                  dd	«      }t        j                  d
|«      sŒB|j	                  d«      xs |j                  d¬«      xs d	j                  «       }|j                  dd¬«      }|r|j                  d¬«      nd	}	|sŒ¥|j                  d«      sŒ·|j                  |t        t        |«      |	dœ«       ŒÛ t        «       g }}
|D ]/  }|d   |
vsŒ|
j                  |d   «       |j                  |«       Œ1 |S )u/   åˆ—è¡¨é¡µè§£æž�: li > h4 > a[title] + span.timer   r   r
   Úlir   Tr   r   r   z(/jxyy/tzgg/20\d{2}\d{2}/[a-f0-9]+\.shtmlÚtitlerA   r1   Útime©Úclass_ú.shtml)r`   r   Údater   )rD   r	   rF   rH   rG   ÚreÚsearchrP   rB   ÚendswithÚappendr   rE   ÚsetÚadd)rR   r	   rU   Úitemsr_   r   r   r`   r1   re   ÚseenÚoutÚits                r[   Úparse_list_htmlrp   U   s-  € å!Ù˜˜}Ó-€DØ€EØ�m‰m˜DÓ!ò UˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�u‰u�V˜RÓ ˆä�y‰yÐDÀdÔKØØ—‘�w“Ò? 1§:¡:°D :Ó#9Ò?¸R×FÑFÓHˆØ�w‰w�v fˆwÓ-ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆÚ�T—]‘] 8Õ,Ø�L‰L 5´¼¸tÓ1DÈdÑSÕTðUô “�rˆ#€DØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�J‰J�r�Nðð €Jr]   c                 ó  ‡— ddl m}  || d«      Šˆfd„} |d«      xs d} |d«      xs d} |d«      xs d}‰j                  d	d
¬«      }|s‰j                  d	d¬«      }d}|rö|j                  d«      }	|	s|}	g }
|	j                  dd¬«      D ]„  }|d   j	                  «       }t        j                  d|«      sŒ-|j                  d¬«      xs d}|j                  d«      r|nt        ||«      }|
j                  ||f«       |j                  «        Œ† t        t        |	«      |«      }|
r.dj                  d„ |
D «       «      }|dz   |z   j                  «       }||r|dd nd|||r
D ��cg c]
  \  }}||dœ‘Œ c}}dœS g dœS c c}}w )u5   è¯¦æƒ…é¡µè§£æž�: meta å­—æ®µ + #zoomcon > ucapcontentr   r   r
   c                 ó|   •— ‰j                  dd| i¬«      }|r#|j                  d«      xs dj                  «       S dS )NÚmetar   r   Úcontentr   )rH   rG   rB   )r   ÚmrU   s     €r[   rs   zparse_detail_html.<locals>.metat   s=   ø€ Ø�I‰I�f V¨T NˆIÓ3ˆÙ34�—‘�iÓ Ò& B×-Ñ-Ó/Ð<¸"Ð<r]   ÚArticleTitler   ÚPubDateÚContentSourcer0   Úzoomcon)Úidzarticle-content-bodyrb   r>   r   Tr   r   z>\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps|et|jpg|jpeg|png|gif)$rA   u   é™„ä»¶r   c              3   ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­w)z<p><a href="z">z</a></p>N© )Ú.0rY   Úfus      r[   ú	<genexpr>z$parse_detail_html.<locals>.<genexpr>�   s#   è ø€ ÒTÁÀÀB˜l¨2¨$¨b°°°8Ô<ÑTùs   ‚ú
Né
   )ÚfileNameÚfileUrl)r`   Úpublish_datert   r   Úattachments)rD   r	   rH   rF   Úlowerrf   rg   rP   rI   r   ri   rM   r\   rQ   ÚjoinrB   )rR   r   r	   rs   r`   Úpubr   ÚzoomÚbodyÚucapÚ	att_linksr   ÚhrY   r~   Úatt_prU   s                   @r[   Úparse_detail_htmlr�   p   s¤  ø€ å!Ù˜˜}Ó-€Dô=ñ �Ó Ò& B€EÙ
ˆy‹/Ò
˜R€CÙ�/Ó"Ò( b€FØ�9‰9�U˜yˆ9Ó)€DÙØ�y‰y˜Ð'=ˆyÓ>ˆØ€DÙØ�y‰y˜Ó'ˆÙØˆDàˆ	Ø—‘˜s¨�Ó.ò 	ˆAØ�&‘	—‘Ó!ˆAÜ�y‰yÐZÐ\]Õ^Ø—J‘J T�JÓ*Ò6¨h�ØŸ,™, vÔ.‘Q´G¸CÀ³O�Ø× Ñ  ! R Ô)Ø—‘•ð	ô œ#˜d›) SÓ)ˆÙØ—G‘GÑTÈ)ÔTÓTˆEØ˜4‘K %Ñ'×.Ñ.Ó0ˆDàÙ$'˜˜C˜R™¨RØØÙRVÀI×N¹5¸1¸b Q°2Ó6ÓNñð ð
 ]_ñð ùó
 Os   Å.Fc                  ó¦  ‡— t        j                  «       } | j                  dt        dd¬«       | j                  dd¬«       | j                  dt        d	¬
«       | j	                  «       }ddlm} ddlm} ddddddœ}t        |j                  dd¬«      }	  |«       5 }|j                  j                  dg d¢¬«      }|j                  t        dddœdd¬«      }|j                  «       Š |«       j!                  ‰«       dRˆfd„	}	 |	t"        «      s't%        dd¬«       	 d d d «       |j'                  «        y ‰j)                  «       }
d}t+        j,                  d|
«      }|rt/        d„ |D «       «      }|j0                  dkD  rt3        ||j0                  «      }t%        d |› d!‰j5                  «       d d" › �d¬«       g }t7        d|dz   «      D ]Ä  }|dk(  rt"        nt"        j9                  d#d$|› d%�«      }|dkD  r+ |	|«      st%        d&|› d'�d¬«        n‰j)                  «       }
t;        |
«      }|j=                  |«       t%        d&|› d(t?        |«      › d)t?        |«      › �d¬«       tA        jB                  tE        jF                  d*d+«      «       ŒÆ t?        |«      |d,<   t%        d-t?        |«      › d.�d¬«       tI        «       }	 dd l%}tL        jN                  jQ                  d/d0«      }|jS                  |«      }|jU                  d1«       |jU                  d2tV        f«      D ]  }|jY                  |d   «       Œ |j'                  «        t%        d3t?        |«      › d4t?        |«      t?        |tI        d5„ |D «       «      z  «      z
  › d.�d¬«       t]        |d«      D �]°  \  }}|d6   |v rŒ |	|d6   d7¬8«      }|sR|d9xx   dz  cc<   t%        d:|› d;t?        |«      › d<|d6   › �d¬«       |d9   |j^                  k\  rt%        d=d¬«        �nEŒpta        ‰j)                  «       |d6   «      }|d>   s|d>   |d><   |d?   s|d@   |d?<   |dA   }t?        |«      d	k  r|dBxx   dz  cc<   |d>   |d?   ||d6   |d6   tV        t+        jb                  dCdD|«      je                  «       d dE d|dF   |dF   |dG   dHœ}|jg                  ti        jj                  |dI¬J«      dKz   «       |dLxx   dz  cc<   |d	z  dk(  s|t?        |«      k(  r(t%        d:|› d;t?        |«      › dM|dL   › dN|d9   › �d¬«       tA        jB                  tE        jF                  dOdP«      «       �Œ³ |j'                  «        d d d «       |j'                  «        t%        dQti        jj                  |dI¬J«      › �d¬«       y # tZ        $ r Y �Œ_w xY w# 1 sw Y   ŒOxY w# |j'                  «        w xY w)SNz--pagesr   u   0=è‡ªåŠ¨æŽ¢æµ‹å…¨é‡�)ÚtypeÚdefaultÚhelpz--outz/tmp/jxyy_tzgg.jsonl)r’   z--max-detail-failr�   )r‘   r’   )Úsync_playwright)ÚStealth)Úlist_okrl   Ú	detail_okÚdetail_failÚemptyÚwzutf-8)ÚencodingT)z---disable-blink-features=AutomationControlledz--no-sandboxz--disable-dev-shm-usage)ÚheadlessÚargsiV  i„  )r$   r%   zzh-CNzAsia/Shanghai)Ú
user_agentÚviewportÚlocaleÚtimezone_idc                 ó  •‡— 	 ‰j                  | dd¬«       t        |«      D ]V  }t        j                  d«       ‰j                  «       xs dŠt        ˆfd„t        D «       «      rŒE‰j                  «       sŒV y y# t        $ r Y Œpw xY w)	u+   goto + ç­‰å¾…è¿‡ç›¾ (title ä¸�å�«å±�è”½è¯�)i`ê  Údomcontentloaded)ÚtimeoutÚ
wait_untilé   r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr|   )r}   r4   rY   s     €r[   r   z(main.<locals>.wait_ok.<locals>.<genexpr>¸   s   øè ø€ Ò<¨!˜q AœvÑ<ùs   ƒTF)	ÚgotoÚ	ExceptionÚrangera   Úsleepr`   ÚanyÚBLOCK_TITLESrB   )r   Útriesr7   rY   Úpages      @€r[   Úwait_okzmain.<locals>.wait_ok¯   s}   ù€ ðØ—I‘I˜c¨5Ð=O�IÔPô ˜u›ò $�AÜ—J‘J˜q”MØŸ
™
›Ò*¨�AÜÓ<¬|Ô<Õ<ÀÇÁÅÙ#ð	$ð
 øô !ò Ùðús   „A= Á=	B	ÂB	u   è¿‡ç›¾å¤±è´¥ (åˆ—è¡¨é¡µ))Úflushé   zlist_(\d+)\.shtmlc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr¨   )Úint)r}   Úxs     r[   r   zmain.<locals>.<genexpr>Ä   s   è ø€ Ò!4¨Q¤# a§&Ñ!4ùs   ‚u   è¿‡ç›¾æˆ�åŠŸ, æ€»é¡µæ•°=z, title=é(   z
list.shtmlÚlist_rd   u   é¡µu    è¿‡ç›¾å¤±è´¥z: u    æ�¡, ç´¯è®¡ g333333ó?g       @rl   u   åˆ—è¡¨å®Œæˆ�: u    æ�¡Ú	SEARCH_DBz/root/search.dbzPRAGMA busy_timeout=10000z.SELECT page_url FROM gov_raw WHERE site_name=?u
   DB å·²æœ‰ u    æ�¡, å¾…æŠ“ c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr|   )r}   r7   s     r[   r   zmain.<locals>.<genexpr>å   s   è ø€ Ò^{ÐlmÐ_`ÐafÕ_gÑ^{ùs   ‚r   é   )r¯   r˜   u   è¯¦æƒ… ú/u   : è¿‡ç›¾å¤±è´¥ u   å¤±è´¥è¿‡å¤š, ä¸­æ­¢r`   r„   re   rt   r™   z<[^>]+>ú éÈ   r   r…   )r`   r„   rt   Úpage_urlÚ
source_urlÚ	site_nameÚsummaryÚ	date_rankÚauthorÚcontent_sourcer…   F)Úensure_asciir€   r—   z: ok=z fail=gš™™™™™é?g      ø?u   å®Œæˆ�: )é   )6ÚargparseÚArgumentParserÚadd_argumentrµ   Ú
parse_argsÚplaywright.sync_apir”   Úplaywright_stealthr•   Úopenrn   ÚchromiumÚlaunchÚnew_contextÚUAÚnew_pageÚapply_stealth_syncÚLIST_URLÚprintÚclosert   rf   ÚfindallÚmaxÚpagesÚminr`   r«   Úreplacerp   ÚextendÚlenra   r¬   ÚrandomÚuniformrj   Úsqlite3ÚosÚenvironrG   ÚconnectÚexecuteÚ	SITE_NAMErk   rª   Ú	enumerateÚmax_detail_failr�   ÚsubrB   ÚwriteÚjsonÚdumps)Úapr�   r”   r•   ÚstatsÚout_fpr@   ÚbrowserÚctxr±   rR   Úpages_totalru   Ú	all_itemsÚpgr   rl   Úexistingrá   ÚdbpÚconnÚrowÚidxro   ÚokÚdrt   Úrecr°   s                               @r[   Úmainrý   ˜   s¹  ø€ Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°Ð9O€OÔPØ‡O�O�GÐ%;€OÔ<Ø‡O�OÐ'¬c¸2€OÔ>Ø�=‰=‹?€Då3Ý*à A°AÀaÐRSÑT€EÜ�$—(‘(˜C¨'Ô2€FðiÙÓð f	 !Ø—j‘j×'Ñ'ØÚqð (ó sˆGð ×%Ñ%Ü°$À#Ñ(FØ¨Oð &ó =ˆCð —<‘<“>ˆDÙ‹I×(Ñ(¨Ô.õñ œ8Ô$ÜÐ0¸Õ=Ø÷5f	ðP 	�‰�ð[ —<‘<“>ˆDØˆKÜ—
‘
Ð/°Ó6ˆAÙÜ!Ñ!4°!Ô!4Ó4�Ø�z‰z˜AŠ~Ü! +¨t¯z©zÓ:�ÜÐ,¨[¨M¸À$Ç*Á*Ã,ÈsÐPRÐBSÐATÐUÐ]aÕbð ˆIÜ˜A˜{¨Q™Ó/ò 
5�Ø"$¨¢'•h¬x×/?Ñ/?ÀÐPUÐVXÐUYÐY_ÐN`Ó/a�Ø˜’6Ù" 3œ<Ü  B 4 }Ð5¸TÕBÙØŸ<™<›>�DÜ'¨Ó-�Ø× Ñ  Ô'Ü˜˜B˜4˜r¤# e£* ¨]¼3¸y»>Ð:JÐKÐSWÕXÜ—
‘
œ6Ÿ>™>¨#¨sÓ3Õ4ð
5ô ! ›^ˆE�'‰NÜ�N¤3 y£>Ð"2°$Ð7¸tÕDô “uˆHð	ÛÜ—j‘j—n‘n [Ð2CÓD�Ø—‘ sÓ+�Ø—‘Ð8Ô9ØŸ<™<Ð(XÔ[dÐZfÓgò )�CØ—L‘L  Q¡Õ(ð)à—
‘
”ô �Jœs 8›}˜o¨]¼3¸y»>ÌCÐPXÔ[^Ñ^{ÐqzÔ^{Ó[{ÑP{ÓL|Ñ;|Ð:}ð  ~Bð  Cð  KOõ  PÜ$ Y°Ó2ó $5‘��RØ�e‘9 Ñ(ØÙ˜R ™Y¨aÔ0�ÙØ˜-Ó(¨AÑ-Ó(Ü˜G C 5¨¬#¨i«.Ð)9¸ÈÈEÉÈÐTÐ\`ÕaØ˜]Ñ+¨t×/CÑ/CÒCÜÐ4¸DÕAÚØÜ% d§l¡l£n°b¸±iÓ@�Ø˜’zØ!# G¡�A�g‘JØ˜Ò(Ø(*¨6©
�A�nÑ%Ø˜I™,�Ü�w“< "Ò$Ø˜'“N aÑ'“Nà˜w™ZØ$% nÑ$5Ø&Ø " 5¡	Ø"$ U¡)Ü!*Ü!Ÿv™v j°#°wÓ?×EÑEÓGÈÈÐMØ!"Ø ™kØ&'¨¡kØ#$ ]Ñ#3ñ�ð —‘œTŸZ™Z¨¸%Ô@À4ÑGÔHØ�kÓ" aÑ'Ó"Ø˜‘8˜q’= C¬3¨y«>Ò$9Ü˜G C 5¨¬#¨i«.Ð)9¸¸uÀ[Ñ?QÐ>RÐRXÐY^Ð_lÑYmÐXnÐoÐw{Õ|Ü—
‘
œ6Ÿ>™>¨#¨sÓ3Ö4ðI$5ðJ �M‰MŒO÷Mf	ðP 	�‰ŒÜ	ˆH”T—Z‘Z °EÔ:Ð;Ð
<ÀDÖIøôW ò Úðú÷}f	ð f	ûðP 	�‰�úsX   ÂV> ÂBV2Ä V> Ä9FV2Ë	BV"ÍHV2Õ$V> Ö"	V/Ö+V2Ö.V/Ö/V2Ö2V;Ö7V> Ö>WÚ__main__r¨   )Ú__doc__rÈ   rë   rf   Úsysra   rß   Úurllib.parser   râ   rE   rÕ   ræ   rÒ   r®   r\   rp   r�   rý   Ú__name__r|   r]   r[   ú<module>r     sg   ðñ÷ -× ,× ,Ý  Û 	à€ØÐ)Ñ)€Ø€	Øv€à?€ó=ò@ò6%òPvJðr ˆzÒÙ…Fð r]   