Ë
    ­�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Zddlm	Z	 ddl
mZ ddlm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d„ Zd„ Zd„ Zedk(  r e«        yy)uí  
æ–°æ´¥åŒºäººæ°‘æ”¿åºœé—¨æˆ·ç½‘ç«™ - å…¬ç¤ºå…¬å‘Šæ �ç›®çˆ¬è™«
URL: https://www.xinjin.gov.cn/xjxrmzf/c1256263/zw_list.shtml
CMS: ç‘žæ•°WAF(412 JSæŒ‘æˆ˜) + es-search æŽ¥å�£åˆ†é¡µ
ç ´è§£æ–¹æ¡ˆ: Playwright æ— å¤´æµ�è§ˆå™¨æ‰§è¡ŒJSæŒ‘æˆ˜, é¡µé�¢å†… fetch æŽ¥å�£(è‡ªåŠ¨å¸¦ç‘žæ•°cookie)

åˆ—è¡¨: GET /es-search/search/6dff54b50943459f96774c6c9d5cadd2?page=N (53é¡µ/1045æ�¡/20æ�¡é¡µ)
  è¿”å›ž: <ul class="list-li"><li><span class="fr">2026-08-07</span><a href="..." title="...">æ ‡é¢˜</a></li>
è¯¦æƒ…: /xjxrmzf/c1256263/2026-08/14/content_xxx.shtml
  æ­£æ–‡: div.content (ä¿�ç•™ p/table ç»“æž„, unwrap span/font æ ·å¼�)
  æ ‡é¢˜: meta ArticleTitle | æ—¥æœŸ: meta PubDate | æ�¥æº�: meta ContentSource
é™„ä»¶: ç›¸å¯¹è·¯å¾„ urljoin(detail_url, href) ç»�å¯¹åŒ–
é    N)Úurljoin)ÚBeautifulSoup)Úsync_playwrightu   æ–°æ´¥åŒº-å…¬ç¤ºå…¬å‘Šzhttps://www.xinjin.gov.cnz8https://www.xinjin.gov.cn/xjxrmzf/c1256263/zw_list.shtmlz8/es-search/search/6dff54b50943459f96774c6c9d5cadd2?page=é5   é   z
2023-08-16z/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 óÔ   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      j                  «       } | S )u"   æ ‡é¢˜æ¸…æ´—: å®žä½“/é›¶å®½/ç©ºç™½z&middot;Ú z&nbsp;ú u   â€‹u   ï»¿z\s+)ÚreplaceÚreÚsubÚstrip©Úts    ú&/root/gov_crawler/crawl_xinjin_gsgg.pyÚclean_titler   &   s[   € à	�	‰	�*˜bÓ!×)Ñ)¨(°CÓ8×@Ñ@ÀÈ2ÓN×VÑVÐW_ÐacÓd€AÜ
�‰ˆv�s˜AÓ×$Ñ$Ó&€AØ€Hó    c                 ó*  — t        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d„ «      D ]  }|j                  «        Œ |j                  ddg«      D ]  }|j                  «        Œ 	 |j                  d«      D �cg c]  }|j	                  d«      sŒ|‘Œ }}|sn|d   j                  «        ŒG|j                  d«      D ]%  }t        |j                  «      D ]  }|d	k7  sŒ	||= Œ Œ' t        |«      S c c}w )
uc   æ­£æ–‡HTMLæ¸…æ´—: ä¿�ç•™ p/table/a/img/br, unwrap span/font/b/strong æ ·å¼�æ ‡ç­¾, æ‰�å¹³åŒ–åµŒå¥—púhtml.parserÚscriptÚstylec                 ó:   — | j                   xr d| j                   v S )Nú:)Únamer   s    r   ú<lambda>z$clean_content_html.<locals>.<lambda>3   s   €  q§v¡vÒ'?°#¸¿¹°-€ r   ÚspanÚfontÚpr   Úalign)r   Úfind_allÚ	decomposeÚunwrapÚfindÚlistÚattrsÚstr)Ú	html_fragÚsoupÚtagr   ÚnestedÚattrs         r   Úclean_content_htmlr,   ,   s  € ä˜ MÓ2€Dà�}‰}˜h¨Ð0Ó1ò ˆØ�‰�ðð �}‰}Ñ?Ó@ò ˆØ�‰�ðð �}‰}˜f fÐ-Ó.ò ˆØ�
‰
�ðð
 Ø!Ÿ]™]¨3Ó/Ö?˜°1·6±6¸#µ;’!Ð?ˆÐ?ÙØØˆq‰	×ÑÔð	 ð �]‰]˜3Óò ˆÜ˜Ÿ™“Mò 	ˆDØ�w‹Ø�d‘Gñ	ðô ˆt‹9Ðùò @s   ÂDÂ/Dc                 óŽ  — | j                  dt        t        |«      z   «      }t        j                  d|«      }g }|D ]…  \  }}}|sRt        j
                  dt        j                  |«      z   dz   |«      }|r|j                  d«      j                  «       nd}|j                  |j                  «       t        |«      |f«       Œ‡ |S )u,   æŠ“åˆ—è¡¨é¡µ N, è¿”å›ž [(date, title, href)]z”async (u) => {
            const r = await fetch(u, {headers: {'X-Requested-With': 'XMLHttpRequest'}});
            return await r.text();
        }zG<span class="fr">([^<]+)</span>\s*<a href="([^"]+)"[^>]*title="([^"]*)"z	<a href="z"[^>]*>([^<]+)</a>é   r	   )ÚevaluateÚAPI_BASEr&   r   ÚfindallÚsearchÚescapeÚgroupr   Úappendr   )	ÚpageÚpage_noÚhtmlÚitemsÚoutÚdÚhr   Úms	            r   Úfetch_list_pager>   G   sµ   € à�=‰=ð	ô 	”3�w“<Ñó€Dô �J‰JÐaÐcgÓh€EØ
€CØò 3‰ˆˆ1ˆaÙä—	‘	˜,¬¯©°1«Ñ5Ð8MÑMÈtÓTˆAÙ&'�—‘˜“
× Ñ Ô"¨RˆAØ�
‰
�A—G‘G“Iœ{¨1›~¨qÐ1Õ2ð3ð €Jr   c                 óp  — |j                  d«      r|nt        |z   }| j                  d|«      }t        |d«      }d|v r|j	                  dd¬«      syd	}|j	                  d
ddi¬«      }|r|j                  d«      rt        |d   «      }|sA|j                  r5t        |j                  j                  «       j                  d«      d   «      }d	}|j	                  d
ddi¬«      }|rO|j                  d«      r>|d   j                  «       }t        j                  d|«      }|r|j                  d«      nd	}d	}|j	                  d
ddi¬«      }|r$|j                  d«      r|d   j                  «       }|j	                  dd¬«      }	|	syg }
|	j                  dd¬«      D ]z  }|d   }t        j                  d|t        j                   «      sŒ.t#        ||«      }|j                  d¬«      xs |j                  d«      d   }|
j%                  ||dœ«       ||d<   Œ| t'        t)        |	«      «      }|||||
|dœS )uI   æŠ“è¯¦æƒ…é¡µ, è¿”å›ž dict(title, date, source, content_html, attachments)Úhttpzaasync (u) => {
            const r = await fetch(u);
            return await r.text();
        }r   ú_$tsÚdivÚcontent)Úclass_Nr	   Úmetar   ÚArticleTitle)r%   ú-r   ÚPubDatez\d{4}-\d{2}-\d{2}ÚContentSourceÚaT)ÚhrefrK   z2\.(pdf|docx?|xlsx?|zip|rar|wps|jpg|jpeg|png)(\?|$))r   ú/éÿÿÿÿ©r   Úurl)ÚtitleÚdateÚsourceÚcontent_htmlÚattachmentsrO   )Ú
startswithÚBASEr/   r   r#   Úgetr   rP   Úget_textÚsplitr   r   Úmatchr4   r    r2   ÚIr   r5   r,   r&   )r6   rK   rO   r8   r(   rP   r=   rQ   rR   Úcontent_divrT   rJ   r<   Úabs_urlr   rS   s                   r   Úfetch_detailr^   Z   s*  € à—/‘/ &Ô)‰$¬t°d©{€CØ�=‰=ð	ð 	ó€Dô ˜˜}Ó-€DØ��~˜dŸi™i¨°i˜iÔ@Øà€EØ�	‰	�& ¨Ð 8ˆ	Ó9€AÙˆQ�U‰U�9ÔÜ˜A˜i™LÓ)ˆÙ�T—Z’ZÜ˜DŸJ™J×/Ñ/Ó1×7Ñ7¸Ó<¸QÑ?Ó@ˆà€DØ�	‰	�& ¨Ð 3ˆ	Ó4€AÙˆQ�U‰U�9ÔØ�‰|×!Ñ!Ó#ˆÜ�x‰xÐ,¨dÓ3ˆÙ $ˆt�z‰z˜!Œ}¨"ˆà€FØ�	‰	�& ¨Ð 9ˆ	Ó:€AÙˆQ�U‰U�9ÔØ�9‘×#Ñ#Ó%ˆà—)‘)˜E¨)�)Ó4€KÙØà€KØ×!Ñ! #¨DÐ!Ó1ò  ˆØˆf‰IˆÜ�9‰9ÐJÈAÌrÏtÉtÕTÜ˜c 1“oˆGØ—:‘: D�:Ó)ÒC¨W¯]©]¸3Ó-?ÀÑ-CˆDØ×Ñ¨°WÑ=Ô>ØˆAˆfŠIð ô &¤c¨+Ó&6Ó7€LàØØØ$Ø"Øñð r   c                 óˆ  — t        j                  t        d¬«      }|j                  d«       |j                  d«       dx}}|j	                  «       }| D ]Ÿ  }|s|dz  }Œt        j                  |d   D �cg c]  }|d   |d	   d
œ‘Œ c}d¬«      }	 |j                  dt        |d	   |d	   |d   |d   |d   |d   xs ddd dd|f
«       |j                  dkD  r|dz  }n|dz  }|j                  «        Œ¡ |j                  «        ||fS c c}w # t         j                  $ r}t        d||d	   «       |dz  }Y d}~ŒXd}~ww xY w)u;   ç›´å†™ search.db (gov_raw è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)i"  )ÚtimeoutzPRAGMA busy_timeout=290000zPRAGMA journal_mode=WALr   r.   rT   r   rO   rN   F)Úensure_asciizÍINSERT OR IGNORE INTO gov_raw
                   (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name, attachments)
                   VALUES (?,?,?,?,?,?,?,?,?,?)rP   rQ   rS   r	   Niô  u   å…¬ç¤ºå…¬å‘Šzcrawl_xinjin_gsgg.pyz	  DB err:)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚjsonÚdumpsÚ	SITE_NAMEÚrowcountÚErrorÚprintÚcommitÚclose)	r9   ÚconnÚaddedÚskippedÚcurÚitrJ   Úatt_jsonÚes	            r   Ú
push_to_dbrv   ‘   s_  € ä�?‰?œ7¨CÔ0€DØ‡L�LÐ-Ô.Ø‡L�LÐ*Ô+ØÐ€EˆGØ
�+‰+‹-€CØò ˆÙØ�q‰LˆGØä—:‘:ÈRÐP]ÑM^Ö_È¨¨&©	¸!¸E¹(ÓCÒ_ÐnsÔtˆð	Ø�K‰Kð3ô ˜B˜u™I r¨%¡y°"°W±+¸rÀ&¹zÈ2ÈnÑK]Ø�^Ñ$Ò*¨¨D¨SÐ1°>ÐCYÐ[cðeô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð+ð, 	‡J�J„LØ�'ˆ>Ðùò% `øô �}‰}ò 	Ü�+˜q " U¡)Ô,Ø�q‰L�Gûð	ús   Á5D

ÂADÄEÄ"D<Ä<Ec                  óº  — t        j                  «       } | j                  dt        dd¬«       | j	                  «       }t        |j                  t        «      }t        j                  «       }t        «       5 }|j                  j                  dddg¬«      }|j                  t        d	d
dœ¬«      }|j                  «       }t        d«       |j!                  t"        dd¬«       t%        d«      D ]Y  }t        j&                  d«       |j)                  «       }	d|	vsŒ-t+        |	«      dkD  sŒ<t        d|dz   › dt+        |	«      › �«        n& t        d«       |j-                  «        	 d d d «       y t        d|› d�«       g }
t%        d|dz   «      D ]P  }	 t/        ||«      }|
j1                  |«       t        d|› dt+        |«      › d�«       t        j&                  d«       ŒR t        dt+        |
«      › d t4        › d!�«       t        d"«       g }d#}t7        |
d«      D ]ô  \  }\  }}}|t4        k  r$t        d$|› d%t+        |
«      › d&|› d'|d d( › �«       Œ7|j9                  d)«      r|nt:        |z   }	 t=        ||«      }|€)|dz  }t        d$|› d%t+        |
«      › d+|› d'|d d( › �«       nDt        d$|› d%t+        |
«      › d,|› d'|d-   d d( › d.t+        |d/   «      › d0t+        |d1   «      › �«       |j?                  |«       t        j&                  d2«       Œö t        d3«       tA        |«      \  }}t        d4|› d5|› d6|› d7t        j                  «       |z
  d8›d9�	«       |j-                  «        d d d «       y # t2        $ r}t        d|› d|› �«       Y d }~�ŒÈd }~ww xY w# t2        $ r*}t        d$|› d%t+        |
«      › d*|› �«       d }Y d }~�ŒMd }~ww xY w# 1 sw Y   y xY w):Nz--pagesr.   u%   æŠ“å�–åˆ—è¡¨é¡µæ•°(1=æµ‹è¯• 5=å…¨é‡�))ÚtypeÚdefaultÚhelpTz--no-sandboxz---disable-blink-features=AutomationControlled)ÚheadlessÚargsiV  i„  )ÚwidthÚheight)Ú
user_agentÚviewportu*   [1/4] åŠ è½½åˆ—è¡¨é¡µè§¦å�‘ç‘žæ•°æŒ‘æˆ˜...iÈ¯  Údomcontentloaded)r`   Ú
wait_untilé
   é   rA   iˆ  u       æŒ‘æˆ˜é€šè¿‡ (u	   è½®) len=u       âœ— æŒ‘æˆ˜æœªé€šè¿‡, é€€å‡ºu   [2/4] æŠ“åˆ—è¡¨é¡µ 1-z...z    Pz: u    æ�¡z err: gš™™™™™é?u       åˆ—è¡¨å…± u    æ�¡ (CUTOFF u    å‰�è¿‡æ»¤)u   [3/4] æŠ“è¯¦æƒ…é¡µ...r   z    [rL   u   ] è·³è¿‡æ—§æ—¥æœŸ r
   é   r@   u   ] è¯¦æƒ…err: u
   ] âœ— ç©º u   ] âœ“ rP   u    æ­£æ–‡rS   u
   å­— é™„ä»¶rT   g      à?u   [4/4] å…¥åº“...u   
=== å®Œæˆ�: æ–°å¢ž u
    / è·³è¿‡ u    / ç©ºæ­£æ–‡ u
    / è€—æ—¶ z.0fzs ===)!ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚminÚpagesÚTOTAL_PAGESÚtimer   ÚchromiumÚlaunchÚnew_contextÚUAÚnew_pagerl   ÚgotoÚLIST_URLÚrangeÚsleeprC   Úlenrn   r>   ÚextendÚ	ExceptionÚCUTOFFÚ	enumeraterU   rV   r^   r5   rv   )Úapr|   rŒ   Út0r   ÚbrowserÚctxr6   Úir8   Ú	all_itemsÚpnr9   ru   ÚresultsÚn_emptyrQ   rP   rK   rO   Údetrp   rq   s                          r   Úmainr§   ±   s  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°Ð9`€OÔaØ�=‰=‹?€DÜ�—
‘
œKÓ(€Eä	�‰‹€BÜ	Ó	ð ;˜aØ—*‘*×#Ñ#¨T¸ÐIxÐ8yÐ#ÓzˆØ×!Ñ!¬RÀDÐTWÑ:XÐ!ÓYˆØ�|‰|‹~ˆô 	Ð:Ô<Ø�	‰	”( EÐ6Hˆ	ÔIÜ�r“ò 		ˆAÜ�J‰J�qŒMØ—<‘<“>ˆDØ˜TÒ!¤c¨$£i°$Ó&6ÜÐ*¨1¨Q©3¨%¨y¼¸T»¸ÐDÔEÙð		ô Ð3Ô4Ø�M‰MŒOØ÷#;ð ;ô( 	Ð% e W¨CÐ0Ô1Øˆ	Ü˜˜5 1™9Ó%ò 	ˆBð-Ü'¨¨bÓ1�Ø× Ñ  Ô'Ü˜˜b˜T ¤C¨£J <¨tÐ4Ô5ô �J‰J�s�Oð	ô 	�œs 9›~Ð.¨m¼F¸8À;ÐOÔPô 	Ð%Ô'ØˆØˆÜ&/°	¸1Ó&=ò 	Ñ"ˆAÑ"��e˜TØ”fŠ}Ü˜˜a˜S ¤# i£.Ð!1Ð1CÀDÀ6ÈÈ5ÐQTÐRTÈ:È,ÐWÔXØØŸ/™/¨&Ô1‘$´t¸d±{ˆCðÜ" 4¨Ó.�ð ˆ{Ø˜1‘�Ü˜˜a˜S ¤# i£.Ð!1°¸D¸6ÀÀ5ÈÈ"À:À,ÐOÕPä˜˜a˜S ¤# i£.Ð!1°¸°v¸Q¸sÀ7¹|ÈCÈRÐ?PÐ>QÐQXÔY\Ð]`ÐaoÑ]pÓYqÐXrÐr|ô  ~Að  BEð  FSñ  BTó  ~Uð  }Vð  Wô  XØ�N‰N˜3ÔÜ�J‰J�s�Oð!	ô& 	�Ô!Ü# GÓ,‰ˆˆwÜÐ% e W¨J°w°i¸}ÈWÈIÐU_Ô`d×`iÑ`iÓ`kÐlnÑ`nÐorÐ_sÐsxÐyÔzØ�‰Œ÷w;ð ;øô6 ò -Ü˜˜b˜T ¨ sÐ+×,Ò,ûð-ûô" ò Ü˜˜a˜S ¤# i£.Ð!1°¸q¸cÐBÔCØ–ûðú÷Y;ð ;úsu   Á6B$OÄOÄ*<OÅ/#OÆ8M3ÇB$OÉ0NÉ<C.OÍ3	NÍ<NÎOÎNÎOÎ	OÎ$O	ÏOÏ	OÏOÏOÚ__main__)Ú__doc__r†   rg   Úosr   rb   ÚsysrŽ   Úurllib.parser   Úbs4r   Úplaywright.sync_apir   ri   rV   r•   r0   r�   Ú	PAGE_SIZEr›   rd   r’   r   r,   r>   r^   rv   r§   Ú__name__© r   r   ú<module>r²      s�   ðñó Û Û 	Û 	Û Û 
Û Ý  å Ý /à$€	Ø"€ØE€ØE€Ø€Ø€	Ø	€Ø
€Øv€òòò6ò&5ònò@BðH ˆzÒÙ…Fð r   