Ë
    (Èzj  ã                   ó  — 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                  ej                  j                  «       ddlmZ dZdZedz   ZdZed	z   Zd
ZdZdeddœZd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uF  
ä¸‰å�°åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Šï¼ˆc111285ï¼‰
https://www.santai.gov.cn/stxrmzf/c111285/list.shtml

ç«™ç‚¹ç‰¹å¾�ï¼ˆ2026-08-11 æŽ¢æµ‹ï¼‰:
- é»‘é¾™æ±Ÿæ”¿åºœç«™ç¾¤ /common/search JSON APIï¼ˆå�Œ jixilishu æ¨¡å¼�ï¼‰
- åˆ—è¡¨: GET /common/search/{channelId}?_isAgg=true&_isJson=true&_pageSize=15&_template=index&page=N
  channelId ä»Žé¡µé�¢ JS `channelId = "..."` æ��å�–ï¼ˆé�ž metaï¼‰
- JSON å­—æ®µ: title / url(ç›¸å¯¹è·¯å¾„) / publishedTimeStr / content(æˆªæ–­~1KBé¡»è¡¥æŠ“è¯¦æƒ…) / channelName
- è¯¦æƒ…: <div class="article_content" id="zoomcon"> æ­£æ–‡ + meta ArticleTitle/PubDate
- é™„ä»¶: ç›¸å¯¹è·¯å¾„ {hash}/files/xxx.pdf â†’ urljoin(è¯¦æƒ…é¡µURL) ç»�å¯¹åŒ–
- total=2076, pageSize=15 â†’ 138 é¡µï¼›CUTOFF 3å¹´çª—å�£

ç”¨æ³•:
  python3 crawl_santai_gsgg.py --pages=138   # å…¨é‡�
  python3 crawl_santai_gsgg.py --pages=1     # æµ‹è¯•
é    N)Úurljoin)Úpush_to_searchdbu"   ä¸‰å�°åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šzhttps://www.santai.gov.cnz/stxrmzf/c111285/list.shtmlÚ 8027b3f0b2554c65aa1958ff5634aa37zU/common/search/{ch}?_isAgg=true&_isJson=true&_pageSize=15&_template=index&page={page}z
2023-08-10u   æ”¿åºœå…¬å¼€zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z.application/json, text/javascript, */*; q=0.01)z
User-AgentÚRefererÚAcceptc                 óÆ   — t        j                  | xs d«      } t        j                  dd| «      } | j	                  dd«      j	                  dd«      } | j                  «       S )NÚ u   ^(?:&middot;|&nbsp;|\s|â€¢|Â·)+u   â€‹u   ï»¿)ÚhtmlÚunescapeÚreÚsubÚreplaceÚstrip)Úts    ú&/root/gov_crawler/crawl_santai_gsgg.pyÚclean_titler   .   sP   € Ü�‰�a’g˜2Ó€AÜ
�‰Ð1°2°qÓ9€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5€AØ�7‰7‹9Ðó    c                 ó®  — t         j                  t        | ¬«      }t        j                  |t
        dd¬«      }|j                  dk7  rg dfS |j                  xs d|_        	 t        j                  |j                  «      }|j	                  di «      j	                  d	d«      }g }|j	                  di «      j	                  d
g «      xs g D ]r  }t        |j	                  dd«      «      }|sŒ!|j	                  dd«      }|sŒ6t        t        |«      }|j	                  d«      xs dd d }	|j!                  |||	dœ«       Œt ||fS # t        $ r g dfcY S w xY w)N)ÚchÚpageé   F©ÚheadersÚtimeoutÚverifyéÈ   r   úutf-8ÚdataÚtotalÚresultsÚtitler	   ÚurlÚpublishedTimeStré
   )r!   r"   Údate)ÚAPI_TPLÚformatÚ
CHANNEL_IDÚrequestsÚgetÚHEADERSÚstatus_codeÚapparent_encodingÚencodingÚjsonÚloadsÚtextÚ	Exceptionr   r   ÚLIST_URLÚappend)
r   r"   ÚrÚjr   ÚitemsÚrowr!   Ú
detail_urlÚpubs
             r   Úfetch_list_pager;   4   sI  € Ü
�.‰.œJ¨Tˆ.Ó
2€CÜ�‰�S¤'°2¸eÔD€AØ‡}�}˜ÒØ�1ˆuˆØ×$Ñ$Ò/¨€A„JðÜ�J‰J�q—v‘vÓˆð �E‰E�&˜"Ó×!Ñ! '¨1Ó-€EØ€EØ�u‰u�V˜RÓ ×$Ñ$ Y°Ó3Ò9°rò 	GˆÜ˜CŸG™G G¨RÓ0Ó1ˆÙØØ�g‰g�e˜RÓ ˆÙØÜœX sÓ+ˆ
Ø�w‰wÐ)Ó*Ò0¨b°#°2Ð6ˆØ�‰˜u¨ZÀÑEÕFð	Gð �%ˆ<Ðøô ò Ø�1ˆuŠðús   Á"E ÅEÅEc                 ó"  ‡ — 	 t        j                  ‰ t        dd¬«      }|j                  «        |j                  xs d|_        |j                  }|}t        j                  d|«      }|rt        |j                  d«      «      xs |}d}t        j                  d|«      }|r|j                  d«      }g }t        j                  d	|t        j                  «      D ]�  }	|	j                  d«      |	j                  d
«      }}
|
j                  d«      r|
nt        ‰ |
«      }t        t        j                   dd|«      «      xs |j#                  d«      d   }|j%                  ||dœ«       Œ� d}t        j                  d|t        j                  «      }|s%t        j                  d|t        j                  «      }|r|j                  d«      }|rÝt        j                   dd|t        j                  t        j&                  z  ¬«      }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|«      }nd|› d�}t)        «       }|D ]8  }|d   |vsŒ|j+                  |d   «       |d   |vsŒ'|d |d   › d!|d"   › d#�z  }Œ: |||fS # t        $ r dg dfcY S w xY w)$u,   è¿”å›ž (content_html, attachments, pub_date)r   Fr   r   Nz+<meta name="ArticleTitle" content="([^"]+)"é   z2<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})"zN<a[^>]+href="([^"]+\.(?:pdf|doc|docx|xls|xlsx|zip|rar|wps|7z))"[^>]*>(.*?)</a>é   Úhttpz<[^>]+>r	   ú/éÿÿÿÿ)Únamer"   zT<div[^>]*class="article_content"[^>]*id="zoomcon"[^>]*>(.*?)</div>\s*(?:<div|</div>)zC<div[^>]*class="article_content"[^>]*>(.*?)</div>\s*(?:<div|</div>)zR<p[^>]*>(?:(?!</p>).)*\.(?:pdf|doc|docx|xls|xlsx|zip|rar|wps|7z)(?:(?!</p>).)*</p>)Úflagsz#(src|href)="(?!https?://|/)([^"]+)"c                 ód   •— | j                  d«      › dt        ‰| j                  d«      «      › d�S )Nr=   z="r>   ú")Úgroupr   )Úm2r9   s    €r   ú<lambda>zfetch_detail.<locals>.<lambda>p   s6   ø€ ÈBÏHÉHÐUVËKÈ=ÐXZÔ[bÐcmÐoq×owÑowÐxyÓozÓ[{ÐZ|Ð|}ÐI~€ r   z<span[^>]*>z</span>z<p[^>]*>ú<p>z	<br\s*/?>z
<p>\s*</p>z&ensp;ú</p>r"   z<p><a href="z">rB   z</a></p>)r)   r*   r+   Úraise_for_statusr-   r.   r1   r2   r   Úsearchr   rF   ÚfinditerÚSÚ
startswithr   r   Úsplitr4   ÚIÚsetÚadd)r9   Ú
list_titler5   Úrawr!   ÚtmÚpub_dateÚdmÚattsÚamÚhrefrB   Úabs_urlÚbodyÚmÚseenÚas   `                r   Úfetch_detailra   L   sî  ø€ ðÜ�L‰L˜¬W¸bÈÔOˆØ	×ÑÔØ×(Ñ(Ò3¨GˆŒ
Ø�f‰fˆð €EÜ	�‰ÐAÀ3Ó	G€BÙ	Ü˜BŸH™H Q›KÓ(Ò1¨EˆØ€HÜ	�‰ÐHÈ#Ó	N€BÙ	Ø—8‘8˜A“;ˆà€DÜ�k‰kÐkÐmpÔrt×rvÑrvÓwò 4ˆØ—X‘X˜a“[ "§(¡(¨1£+ˆdˆØŸ/™/¨&Ô1‘$´w¸zÈ4Ó7PˆÜœ2Ÿ6™6 *¨b°$Ó7Ó8ÒR¸G¿M¹MÈ#Ó<NÈrÑ<RˆØ�‰˜T¨'Ñ2Õ3ð	4ð €DÜ
�	‰	ÐiÐknÔpr×ptÑptÓu€AÙÜ�I‰IÐ\Ð^aÔce×cgÑcgÓhˆÙØ�w‰w�q‹zˆÙä�v‰vÐkÐmoÐquÔ}÷  ~Bñ  ~Bô  CE÷  CGñ  CGñ  ~Gô  Hˆä�v‰vÐ<Ó>~ð  AEó  FˆÜ�v‰v�n b¨$Ó/ˆÜ�v‰v�j " dÓ+ˆÜ�v‰v�k 5¨$Ó/ˆÜ�v‰v�l B¨Ó-ˆÜ�v‰v�m R¨Ó.ˆÜ�v‰v�i  TÓ*‰à�U�G˜4Ð ˆä‹5€DØò GˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�‰x˜tÒ#Ø˜, q¨¡x j°°1°V±9°+¸XÐFÑF‘ð	Gð
 ��xÐÐøô[ ò Ø�R˜ˆ~Òðús   ƒAK= Ë=LÌLc                  óV  — d } t         j                  dd  D ]M  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  «       sŒCt        |«      } ŒO g }t        «       }d}d}	 | r|| kD  rnÅt        |«      \  }}|st        d|› d�«       n¥d}|D ]e  }|d   |v rŒ|d   r,|d   t        k  r t        d|› d	|d   › d
t        › d�«       d} n,|j                  |d   «       |j                  |«       |dz  }Œg t        d|› dt        |«      › d|› dt        |«      › d|› d�«       |dk(  rn|dz  }ŒÍt        d| › dt        |«      › �«       g }	t        |«      D ]•  \  }
}t        |d   |d   «      \  }}}|€	d|d   › d�}|	j                  t        |d   |xs |d   ||d   |d   |rt!        j"                  |d¬«      nddœ«       |
dz   dz  dk(  sŒyt        d|
dz   › dt        |«      › �«       Œ— t        dt        |	«      › �«       t%        |	t&        «       y )Nr=   z--pages=ú=r   z[Pz] empty, stopr"   r%   z] z
 < CUTOFF z, stopi?B z] got z items, new z, total z (api total=ú)z[AutoPg] max_pages=z, collected r!   rI   rJ   F)Úensure_asciiz[])Ú	site_namer!   rW   ÚcontentÚ
source_urlr"   Úattachmentsé2   z	[Detail] r@   z[Detail] done )ÚsysÚargvrO   ÚintrP   ÚisdigitrR   r;   ÚprintÚCUTOFFrS   r4   ÚlenÚ	enumeratera   Ú	SITE_NAMEr/   Údumpsr   ÚCATEGORY)Ú	max_pagesr`   Ú	all_itemsr_   r   r   r7   ÚnewÚitÚvalidÚirg   rY   rW   s                 r   Úmainr|   ‚   s{  € Ø€IÜ�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#Ü˜AŸG™G C›L¨™OÓ,‰IØ�Y‰Y�[Ü˜A›‰Ið	ð
 €IÜ‹5€DØ€DØ€EØ
Ù˜ 	Ò)ØÜ& tÓ,‰ˆˆuÙÜ�B�t�f˜MÐ*Ô+ØØˆØò 		ˆBØ�%‰y˜DÑ ØØ�&Šz˜b ™j¬6Ò1Ü˜˜4˜&  2 f¡: ,¨j¼¸ÀÐGÔHØ�ÙØ�H‰H�R˜‘YÔØ×Ñ˜RÔ Ø�1‰H‰Cð		ô 	��4�&˜œs 5›z˜l¨,°s°e¸8ÄCÈ	ÃNÐCSÐS_Ð`eÐ_fÐfgÐhÔiØ�6Š>ØØ�‰	ˆð+ ô, 
Ð 	˜{¨,´s¸9³~Ð6FÐ
GÔHà€EÜ˜9Ó%ò 6‰ˆˆ2Ü".¨r°%©y¸"¸W¹+Ó"FÑˆ��xØˆ?Ø˜B˜w™K˜=¨Ð-ˆGØ�‰Ü"Ø˜‘[Ø Ò. B v¡JØØ˜U™)Ø�e‘9ÙCGœ4Ÿ:™: d¸Õ?ÈTñ
ô 	ð �‰E�R‰<˜1ÓÜ�I˜a ™c˜U !¤C¨	£NÐ#3Ð4Õ5ð6ô 
ˆNœ3˜u›:˜,Ð
'Ô(Ü�UœHÕ%r   Ú__main__)Ú__doc__r   rk   r/   r
   Úurllib3r)   Úurllib.parser   Údisable_warningsÚ
exceptionsÚInsecureRequestWarningÚcrawler_libr   rs   ÚBASE_URLr3   r(   r&   rp   ru   r+   r   r;   ra   r|   Ú__name__© r   r   ú<module>rˆ      s¬   ðñó" 
Û 
Û Û Û Û Ý  à €× Ñ ˜×+Ñ+×BÑBÔ Cå (à0€	Ø&€ØÐ3Ñ3€Ø/€
ØÐmÑm€Ø	€Ø€ð @ØØ>ñ€òòò04 òl4&ðl ˆzÒÙ…Fð r   